实现了一个功能强大的 AutoHotkey Emoji 输入脚本,允许用户通过热字符串输入特定的关键字或表情代码,从而快速插入表情符号(Emoji)。它还提供了一个小型用户界面供用户选择表情符号,并支持将表情符号直接复制到剪贴板并粘贴到活动窗口。

 

#NoEnv ;                                           Emoji script v0.21 by SKAN on D397/D39A
#Warn                            ; https://www.autohotkey.com/boards/viewtopic.php?t=80793
#SingleInstance, Force ; emoji list: https://unicode.org/emoji/charts/full-emoji-list.html
SetBatchLines, -1

; 输入???后触发UI,再输入happy显示开心表情。以回车确认
Hotstring(":*X:???", "Emoji")
Return                                                        ; end of autoexecute section
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Emoji() {
Local
  If !( Input := Emoji_InputHook(ID:=WinExist("A")) )
    Return
  Body := Format("<span style=""font-size:48px"">&#{:d};</span>", Input)
  SetClipboardHTML(Body,, Chr(Input))
  If WinActive("ahk_id" . ID)
     SendInput ^v
Return
}
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Emoji_InputHook(hWnd) {
Local
Static hBM:=0

  If !(hBM)
  {
    VarSetCapacity(BMBITS, 180*4, 240)
    hBM:=DllCall("CreateBitmap", "Int",180,"Int",1,"Int",1, "Int",32,"Ptr",&BMBITS, "Ptr")
  }

  hMon := DllCall("MonitorFromWindow", "Ptr",hWnd, "Int",0x2, "Ptr")   ; _DEFAULTTONEAREST
  VarSetCapacity(MONITORINFO,40,0), NumPut(40, MONITORINFO,"Int")
  DllCall("GetMonitorInfo", "Ptr",hMon, "Ptr",&MONITORINFO)
  MX:=NumGet(MONITORINFO, 4, "Int"), MW:=NumGet(MONITORINFO, 12, "Int")-MX
  MY:=NumGet(MONITORINFO, 8, "Int"), MH:=NumGet(MONITORINFO, 16, "Int")-MY

  DetectHiddenWindows, % ("On", DHW:=A_DetectHiddenWindows)
  SetWinDelay, % (0, SWD := A_WinDelay)
  SetControlDelay, % (0. SCD := A_ControlDelay)
  SplashImage, 10:HBITMAP:* %hBM%, ZY4 ZX12 ZH1 FM36 FS18 C11 CTF0F0F0 CW00AAAA B1 Hide
                               , % Chr(32),% Chr(191), Emoji, Segoe UI
  WinWait, Emoji ahk_class AutoHotkey2
  WinGetPos,,,WW, WH
  WinMove,,, % MX+( (MW//2)-(WW//2) ), % MY+( (MH//2)-(WH//2) )
  SplashImage, 10:Show
  ControlSetText, Static2, % Input:=(Key:=(PreviousKey:=""))

  ih := InputHook("M","{Escape}{Enter}{NumpadEnter}{``}")
  ih.KeyOpt("{All}", "S")
  ih.KeyOpt("{Space}{Tab}", "I")
  ih.KeyOpt("{RShift}{LShift}", "-S")
  ih.Start()

  While (ih.InProgress && A_TimeIdle<180000)
  {
    Sleep 1
    If ((Key:=ih.Input)=PreviousKey)
      Continue
    ControlSetText, Static2, % ( PreviousKey:=Key )
    ControlSetText, Static1, % ( Key="" ? Chr(191) : Chr(Input:=Emoji_Code(Key)))
  }

  SplashImage, 10:OFF
  SetControlDelay, %SCD%
  SetWinDelay, %SWD%
  DetectHiddenWindows, %DHW%

Return (ih.InProgress ? Round(ih.Stop()) : ih.EndKey="Escape" ? 0 : Input)
}
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Emoji_Code(Key) {

  Switch (Key)
  {
     Case ":-)", ":)", ":-]", ":]", "=]", "=)", "smile"     : Return 0x1F60A ;       smile
     Case ":‑D", ":D", "x‑D", "xD", "=D", "happy"           : Return 0x1F604 ;       happy
     Case "laugh"                                           : Return 0x1F601 ;       laugh
     Case ":0", ":-0", "surpr", "surprise"                  : Return 0x1F60D ;    surprise
     Case "lol", "laughing"                                 : Return 0x1F602 ;         lol

     Case ":p", ":-p", ":b", ":-b", "=p", "razz"            : Return 0x1F61C ;        razz
     Case "8)", "8-)", "cool"                               : Return 0x1F60E ;        cool
     Case ";‑)", ";)", "wink"                               : Return 0x1F609 ;        wink
     Case "zzz", "sleep"                                    : Return 0x1F634 ;         zzz
     Case ":|", ":-|", "neut", "neutral"                    : Return 0x1F610 ;     neutral

     Case ";", ";-", ":", ":-", "silent"                    : Return 0x1F636 ;      silent
     Case "eh"                                              : Return 0x1F612 ;          eh
     Case ":‑(", ":(", ":‑[", ":[", "sad"                   : Return 0x1F61E ;         sad
     Case ":'‑(", ":'(", "cry"                              : Return 0x1F622 ;         cry
     Case ":'‑(", ":'(", "col", "crying"                    : Return 0x1F62D ;      crying

     Case "oops", "embar", "embarassed"                     : Return 0x1F633 ;        oops
     Case "%)", "roll", "confused"                          : Return 0x1F635 ;    confused
     Case "anx", "anxious"                                  : Return 0x1F630 ;     anxious
     Case ":O", ":-O", "shock"                              : Return 0x1F632 ;       shock
     Case "omg", "ohno"                                     : Return 0x1F631 ;         omg

     Case "vent"                                            : Return 0x1F624 ;        vent
     Case ":x", "mad"                                       : Return 0x1F620 ;         mad
     Case "angry"                                           : Return 0x1F621 ;       angry
     Case ">:-(", "evil"                                    : Return 0x1F47F ;        evil
     Case ">:-)", "twisted"                                 : Return 0x1F608 ;     twisted

     Case "100"                                             : Return 0x1F4AF ;         100
     Case "clap"                                            : Return 0x1F44F ;        clap
     Case "<3", "heart"                                     : Return 0x1F496 ;       heart
     Case "eyes"                                            : Return 0x1F440 ;        eyes
     Case "poop"                                            : Return 0x1F4A9 ;        poop

     Case "thx", "thanx", "thanks"                          : Return 0x1F64F ;      thanks
     Case "thumbup", "+1"                                   : Return 0x1F44D ;     thumbup
     Case "super"                                           : Return 0x1F44C ;       super
     Case "bullseye", "bulls"                               : Return 0x1F3AF ;    bullseye
     Case "thumbdown", "-1"                                 : Return 0x1F44E ;   thumbdown

     Case "santa"                                           : Return 0x1F385 ;       santa
     Case "angel"                                           : Return 0x1F607 ;       angel
     Case "skull"                                           : Return 0x1F480 ;       skull
     Case "ghost"                                           : Return 0x1F47B ;       ghost
     Case "alien"                                           : Return 0x1F47D ;       alien
  }

  If Key is number
     Return Format("0x{:05x}", Round(Key))
  If Key is xdigit
     Return Format("0x{:05X}", Round("0x" . LTrim(Key,"0x"))+0)

Return 0
}
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

SetClipboardHTML(HtmlBody, HtmlHead:="", AltText:="") {       ; v0.66 by SKAN on D393/D396
Local  F, Html, pMem, Bytes, hMemHTM:=0, hMemTXT:=0, Res1:=1, Res2:=1   ; @ tiny.cc/t80706
Static CF_UNICODETEXT:=13,   CFID:=DllCall("RegisterClipboardFormat", "Str","HTML Format")

  If ! DllCall("OpenClipboard", "Ptr",A_ScriptHwnd)
    Return 0
  Else DllCall("EmptyClipboard")

  If (HtmlBody!="")
  {
      Html     := "Version:0.9`r`nStartHTML:00000000`r`nEndHTML:00000000`r`nStartFragment"
               . ":00000000`r`nEndFragment:00000000`r`n<!DOCTYPE>`r`n<html>`r`n<head>`r`n"
                         . HtmlHead . "`r`n</head>`r`n<body>`r`n<!--StartFragment -->`r`n"
                              . HtmlBody . "`r`n<!--EndFragment -->`r`n</body>`r`n</html>"

      Bytes    := StrPut(Html, "utf-8")
      hMemHTM  := DllCall("GlobalAlloc", "Int",0x42, "Ptr",Bytes+4, "Ptr")
      pMem     := DllCall("GlobalLock", "Ptr",hMemHTM, "Ptr")
      StrPut(Html, pMem, Bytes, "utf-8")

      F := DllCall("Shlwapi.dll\StrStrA", "Ptr",pMem, "AStr","<html>", "Ptr") - pMem
      StrPut(Format("{:08}", F), pMem+23, 8, "utf-8")
      F := DllCall("Shlwapi.dll\StrStrA", "Ptr",pMem, "AStr","</html>", "Ptr") - pMem
      StrPut(Format("{:08}", F), pMem+41, 8, "utf-8")
      F := DllCall("Shlwapi.dll\StrStrA", "Ptr",pMem, "AStr","<!--StartFra", "Ptr") - pMem
      StrPut(Format("{:08}", F), pMem+65, 8, "utf-8")
      F := DllCall("Shlwapi.dll\StrStrA", "Ptr",pMem, "AStr","<!--EndFragm", "Ptr") - pMem
      StrPut(Format("{:08}", F), pMem+87, 8, "utf-8")

      DllCall("GlobalUnlock", "Ptr",hMemHTM)
      Res1  := DllCall("SetClipboardData", "Int",CFID, "Ptr",hMemHTM)
  }

  If (AltText!="")
  {
      Bytes    := StrPut(AltText, "utf-16")
      hMemTXT  := DllCall("GlobalAlloc", "Int",0x42, "Ptr",(Bytes*2)+8, "Ptr")
      pMem     := DllCall("GlobalLock", "Ptr",hMemTXT, "Ptr")
      StrPut(AltText, pMem, Bytes, "utf-16")
      DllCall("GlobalUnlock", "Ptr",hMemHTM)
      Res2  := DllCall("SetClipboardData", "Int",CF_UNICODETEXT, "Ptr",hMemTXT)
  }

  DllCall("CloseClipboard")

  hMemHTM := hMemHTM ? DllCall("GlobalFree", "Ptr",hMemHTM) : 0
  hMemTXT := hMemTXT ? DllCall("GlobalFree", "Ptr",hMemTXT) : 0

Return (Res1 & Res2)
}
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。