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

评论(0)