(原) AutoHotkey

原创文章,请后转载,并注明出处。

AutoHotkey其实早已大名鼎鼎且历史悠久,至少追溯到2005年,甚至1999年。简单来说它是一个丰富且强大的热键系统。

最近两天花了些时间来入门。之前文章中的MyKeymap了是基于它开发的。最近了把输入法的为了"影子",这个也是基于AutoHotkey开发的。

可惜的一点是,它不支持Linux。

想到的一个应用场景就是客服:把常用的语句用缩略语的方式,可以加快服务速度。虽然最近ChatGPT很火,大有代替人工的趋势。

它甚至可以编写GUI界面,对于一般的应用,其实是可以用它来实现前端的。(找机会用它来配合Golang试试)

AutoHotkey中文文档 AutoHotkey中文文档 v1.1.15.03

注意:有中文,则保存格式必须选为 UTF-8 with BOM。

; 示例: 使用透明窗口进行屏幕显示 (OSD):

CustomColor = EEAA99  ; 可以为任意 RGB 颜色 (在下面会被设置为透明).
Gui +LastFound +AlwaysOnTop -Caption +ToolWindow  ; +ToolWindow 避免显示任务栏按钮和 alt-tab 菜单项.
Gui, Color, %CustomColor%
Gui, Font, s32  ; 设置大字体 (32 磅).
Gui, Add, Text, vMyText cLime, XXXXX YYYYY  ; XX & YY 用来自动调整窗口大小.
; 让此颜色的所有像素透明且让文本显示为半透明 (150):
WinSet, TransColor, %CustomColor% 150
SetTimer, UpdateOSD, 200
Gosub, UpdateOSD  ; 立即进行第一此更新而不等待计时器.
Gui, Show, x0 y400 NoActivate  ; NoActivate 让当前活动窗口继续保持活动状态.
return

UpdateOSD:
MouseGetPos, MouseX, MouseY
GuiControl,, MyText, X%MouseX%, Y%MouseY%
return

以下代码为现在使用的,将不断更新方便自己的61键.目标是抛弃鼠标且键盘速度加快.

; ================================================================================================================================ 加载

#Persistent    ;让脚本持久运行 (即直到用户关闭或遇到 ExitApp).
#SingleInstance force  ;强制加载新的脚本
#InstallMouseHook 

;尝试加载图标
IfExist, icon.ico ;花括号“{”不能和 IfExist 写在同一行
{
    Menu TRAY, Icon, icon.ico ;这句会把 icon.ico 作为图标
}
 
; 载入提示
ToolTip, 脚本载入中...
TrayTip, 载入,脚本载入中...

Sleep 500
ToolTip

; 菜单功能
Menu, Tray, NoStandard                                         ;去掉标准托盘按钮
Menu, Tray, DeleteAll                                          ;清空托盘按钮
Menu, Tray, Color, e1e1e1, Single
Menu, Tray, Add, 重载, Label_Reload
Menu, Tray, Icon, 重载, %A_AhkPath%, -207
Menu, Tray, Add, 暂停/运行, Label_Pause
Menu, Tray, Add, 设置, Label_Set
Menu, Tray, Icon, 设置, Shell32.dll, 22
Menu, Tray, Add                                                ;分隔线
Menu, Tray, Add, 帮助, Label_Help
Menu, Tray, Icon, 帮助, Shell32.dll, 24
Menu, Tray, Add, 退出, Label_Exit
Menu, Tray, Icon, 退出, Shell32.dll, 28
Menu, Tray, Tip, 腾图快手`n`n我的快捷助手!
    
; 根据文件修改时间,自动重载脚本
FileGetTime ScriptStartModTime, %A_ScriptFullPath%          ;获取文件时间
SetTimer CheckScriptUpdate, 5000, 0x7FFFFFFF                ;5秒钟循环计时器

; ================================================================================================================================ 鼠标
; 鼠标手势 
RButton::
    ToolTip
    MouseGetPos xpos1,ypos1
    SetTimer, gtrack, 1
Return

RButton up::
    SetTimer, gtrack, off    
    if ( gtrack == "UP" )
    {
        IfWinActive, ahk_class MozillaWindowClass      ; FireFox浏览器中鼠标右键上划,返回顶部
        {
            Send ^{Home}
        }
        IfWinActive, ahk_class CabinetWClass           ; 资源管理器中鼠标右键上划,返回上一级目录
        {
            Send !{Up} 
        }
    }
    Else if ( gtrack == "RIGHT" )
    {
        IfWinActive, ahk_class MozillaWindowClass      ; FireFox浏览器中鼠标右键右划,下一标签
        {
            Send ^{PgDn}
        }
    }
    Else if ( gtrack == "LEFT" )
    {
        IfWinActive, ahk_class MozillaWindowClass       ; FireFox浏览器中鼠标右键左划,上一标签
        {
            Send ^{PgUp}
        }
    }
    Else 
    {
        ToolTip %gtrack%
        Send, {RButton}

    }
    gtrack=
Return

;                                                                         任务栏上,鼠标上滚增加音量
~WheelUp::  
    if (existclass("ahk_class Shell_TrayWnd")=1)  
        Send,{Volume_Up}  
Return  

;                                                                         任务栏上,鼠标下滚减小音量
~WheelDown::  
    if (existclass("ahk_class Shell_TrayWnd")=1)  
        Send,{Volume_Down}  
Return  

;                                                                         任务栏上,鼠标中键点击静音
~MButton::  
    if (existclass("ahk_class Shell_TrayWnd")=1)  
        Send,{Volume_Mute}  
Return  

;                                                                         右键+左键, 在FireFox浏览器中关闭标签(临时使用)
RButton & LButton::
    IfWinActive, ahk_class MozillaWindowClass
        {
            Send, ^w
            Sleep 1000
        }
Return

; 切换窗口
; 滚轮上滑
; 使滚轮向上滚2次 click wheelup 2
; 滚轮下滑

; 鼠标左单击
; 鼠标右单击
; 鼠标左双击

; ================================================================================================================================ 热键

; ---------------------------------------------------------------------------------- CapsLock

; CapsLock长按配合其他键映射成方向键,短按还是大写键
CapsLock::
KeyWait, CapsLock     
if (A_ThisHotkey="CapsLock")
        {
        SetCapsLockState, % GetKeyState("CapsLock","T") ? "Off" : "On"    
        }
Return

#if GetKeyState("Capslock", "P")
i:: Click,0,-10,rel                                                                 ;长按CapsLock+i 鼠标上键
j:: Click,-10,0,rel                                                                 ;长按CapsLock+j 鼠标下键
k:: Click,0,+10,rel                                                                 ;长按CapsLock键k 鼠标左键
l:: Click,10,0,rel                                                                  ;长按CapsLock+l 鼠标右键
[:: SendInput,{home}                                                                ;长按CapsLock+[ home键
]:: SendInput,{end}                                                                 ;长按CapsLock+] end键
;:: SendInput,{PgUp}                                                                ;长按CapsLock+; PageUp
':: SendInput,{PgDn}                                                                ;长按CapsLock+' PageDown
.:: SendInput,{backspace}                                                           ;长按CapsLock+. backspace键
/:: SendInput,{delete}                                                              ;长按CapsLock+/ delete键   
#if


;                                                                                   【Alt+Enter】 窗口置顶/取消
!enter:: ; 
    WinGet ow, id, A
    WinTopToggle(ow)
return

;                                                                                  【连按Esc】关闭窗口
~Esc::     ; 按Esc激发
    Keywait, Esc, , t0.5 ; 等待在0.5秒内再按
    if errorlevel = 1  ; 没等到再次按Esc,退出
      return
    else
      Keywait, Esc, d, t0.2
    if errorlevel = 0
    {
        IfWinActive ahk_class ahk_class IEFrame ;识别IE浏览器
          Send {ctrldown}w{ctrlup}
        else IfWinActive ahk_class MozillaWindowClass ;识别firfox 浏览器
          Send {ctrldown}w{ctrlup}
        else    ;其它窗口
          send !{F4}
    }
return

; ---------------------------------------------------------------------------------- Win 热键

;                                                                                   【Win+Enter】 窗口最大化/最小化
#enter::
    WinGet,S,MinMax,A
    if S=0
        WinMaximize,A
    else if S=1
        WinRestore,A
    else if S=-1
        WinRestore,A
return

;                                                                                  【Win+T】 终端
#t::
    Run wt.exe
Return

;                                                                                  【Win+[】音量大
#[::
    SoundSet -10, MASTER
    SoundBeep
Return

;                                                                                 【Win+]】音量小
#]::
    SoundSet +10, MASTER
    SoundBeep
Return

;                                                                                 【Win+k】任务管理器
#k::
    Run taskmgr
Return

;                                                                                  Win+B 鼠标位置取色
#b::
    MouseGetPos, mouseX, mouseY
    PixelGetColor, color, %mouseX%, %mouseY%, RGB
    StringRight color,color,6
    clipboard = %color%
    msgbox 当前坐标RGB颜色值的十六进制值为#%color%.
return

;                                                                                 【快速左Shift】 复制
~LShift::
Keywait, LShift, , t0.5
if errorlevel = 1
    return
else
    Keywait, LShift, d, t0.3
if errorlevel = 0
{
    Send,^c
}
return

;                                                                                【快速左Ctrl】 粘贴
~LCtrl::
Keywait, LCtrl, , t0.5
if errorlevel = 1
    return
else
    Keywait, LCtrl, d, t0.3
if errorlevel = 0
{
    Send,^v
}
return

;                                                                                Ctrl+b 百度搜索当前选择文本
^b::
    {
        Send, ^c
        Sleep 50
        Run, https://www.baidu.com/s?wd=%Clipboard%
    }
Return

;                                                                               Ctrl+d 打开下载文件夹
^d::Run "c:\down"

;                                                                               Alt+4 关闭窗口
!4::SendInput !{F4}

; ================================================================================================================================ 缩略词

;                                                                               cz 重载脚本
:*:,cz::
    ToolTip 即将重载脚本...
    Sleep 1000
    Reload
    Sleep 1000 ; 如果成功, 则 reload 会在 Sleep 期间关闭这个实例, 所以下面这行语句永远不会执行.
    MsgBox, 4,, 此脚本不能被重载,您需要编辑它吗?
    IfMsgBox, Yes, Edit
Return

;                                                                               zd 窗口置顶
:*:,zd::
    WinGet ow, id, A
    WinTopToggle(ow)
Return

;                                                                               ie 打开Edge浏览器
:*:,ie::
    Run msedge.exe
return

; ------------------------------------------------------------------------------- 文件夹
; 文件夹:下载
; 文件夹:我的文档
; 文件夹:工具箱
;
;                                                                               dh 电话
:*:,dh::18113144191

; sj 收件地址

; cmd 命令行

;                                                                               bd 百度
:*:,bd::
    Run "https://www.baidu.com"
Return

;                                                                               bk 我的博客
:*:,bk::
    Run "https://i.scwy.net"
Return

;                                                                               ff 打开FireFox浏览器
:*:,ff::
    IfWinExist ahk_class MozillaWindowClass
    {}
    else
    {
        Run "C:\Program Files\Mozilla Firefox\firefox.exe"
        WinWait ahk_class MozillaWindowClass
    }
    WinActivate
Return

; gj 关机
; cq 重启

;                                                                               jsq 计算器
:*:,jsq::
    Run calc.exe
Return

;                                                                               jt 截图
:*:,jt::
    Run C:\Tools\Snipaste\Snipaste.exe
Return

;                                                                               xtsx 系统属性窗口
:*:,xtsx::
    Run Control sysdm.cpl
Return

;                                                                               sz 设置
:*:,sz::
    Run Control
return

;                                                                               no 记事本
:*:,no::
    IfWinExist ahk_class Notepad
    {
        WinActivate
    } 
    else 
    {
        Run Notepad,,max
        WinWait ahk_class Notepad
        WinActivate
    }
return

;                                                                               ps PhotoShop
:*:,ps::
    Run "C:\Tools\Adobe Photoshop CS6\Adobe Photoshop CS6\Photoshop.exe"
return

;                                                                               rd RustDesk
:*:,rd::
    Run C:\Tools\rustdesk\rustdesk-1.1.9_portable.exe
return

;                                                                               zy 资源管理器

;                                                                               sjk 数据库工具
:*:,sjk::
    Run C:\Tools\dbeaver\dbeaver.exe
return

;                                                                               et Everything
:*:,et::
    Run C:\Tools\Everything\Everything.exe
return

;                                                                               tm 任务管理器
:*:,tm::
    Run taskmgr
return

;                                                                               vs VisualStudioCode
:*:,vs::
    Run "C:\Users\Administrator\AppData\Local\Programs\Microsoft VS Code\Code.exe"
return

;                                                                               wx 微信
:*:,wx::
    Run C:\Tools\WeChat\WeChat.exe
return

;                                                                               cmd 命令行CMD
:*:,cmd::
    If WinActive("ahk_class CabinetWClass") || WinActive("ahk_class ExploreWClass") {
        WinHWND := WinActive()
        For win in ComObjCreate("Shell.Application").Windows
            If (win.HWND = WinHWND) {
        currdir := SubStr(win.LocationURL, 9)
        currdir := RegExReplace(currdir, "%20", " ")
                Break
            }
    }
    Run, cmd, % currdir ? currdir : "d:\"
Return

;                                                                               put croc发送文件
:*:,put::
    Send croc.exe send --code yjz129129 
Return

;                                                                               get croc接收文件
:*:,get::
    Run croc.exe --yes yjz129129
Return

;                                                                               dput croc发送桌面所有图片文件
:*:,dput::
    Run croc.exe send --code y129129 %A_Desktop%\*.png %A_Desktop%\*.jpg
Return

;                                                                               he 帮助信息
:*:,he::
return

;                                                                               see ACDSee看图
:*:,see::
    Run C:\Tools\ACDSee32.exe
return

;                                                                               gj 关机
:*:,gj::
    Shutdown, 1
return

;                                                                               cq 重启
:*:,cq::
    Shutdown, 2
return

;                                                                               sj 当前时间
:*:,sj::
    FormatTime, CurrentDateTime,, yyyy年MM月dd日 HH点mm分
    MsgBox ,,当前日期,%CurrentDateTime%,10
return

;                                                                               sh 删除一行
:*:,sh::
    send,{end}{shiftdown}{home}{shiftup}{delete}{delete}
return 

;                                                                               hs 行首
:*:,hs::
    send,{home}
return

;                                                                               hw 行尾
:*:,hw::
    send,{end}
return

;                                                                               ys 页首
:*:,ys::
    send, ^{home}
return

;                                                                               yw 页尾
:*:,yw::
    send, ^{end}
return 

;                                                                               sy 上一页
:*:,sy::
    send, {PgUp}
return

;                                                                               xy 下一页
:*:,xy::
    send, {PgDn}
return

; ================================================================================================================================ 调用 

; 检测脚本更新,根据文件时间
CheckScriptUpdate() {
    global ScriptStartModTime
    FileGetTime curModTime, %A_ScriptFullPath%
    If (curModTime == ScriptStartModTime)
        Return
    SetTimer CheckScriptUpdate, Off
    reload
}

; 窗口置顶开关
WinTopToggle(w) { 
    WinGetTitle, oTitle, ahk_id %w%
    Winset, AlwaysOnTop, Toggle, ahk_id %w%
    WinGet, ExStyle, ExStyle, ahk_id %w%
    if (ExStyle & 0x8)  ; 0x8 为 WS_EX_TOPMOST.在WinGet的帮助中
        oTop = 置顶
    else
        oTop = 取消置顶
    tooltip %oTitle% %oTop%
    SetTimer, RemoveToolTip, 5000
    return
 
    RemoveToolTip:
    SetTimer, RemoveToolTip, Off
    ToolTip
    return
}

; 窗口透时度加
; WinGet, ow, id, A
; WinTransplus(ow)
WinTransplus(w){ 
    WinGet, transparent, Transparent, ahk_id %w%
    if transparent < 255
        transparent := transparent+10
    else
        transparent =
    if transparent
        WinSet, Transparent, %transparent%, ahk_id %w%
    else
        WinSet, Transparent, off, ahk_id %w%
    return
}
; 窗口透明度减
WinTransMinus(w){
 
    WinGet, transparent, Transparent, ahk_id %w%
    if transparent
        transparent := transparent-10
    else
        transparent := 240
    WinSet, Transparent, %transparent%, ahk_id %w%
    return
}

;
Existclass(class)  
{  
    MouseGetPos,,,win  
    WinGet,winid,id,%class%  
    if win = %winid%  
        Return,1  
    Else  
        Return,0  
}

; 运行或激活程序
; RunOrActivateProgram("C:\Program Files\Notepad++\notepad++.exe")
RunOrActivateProgram(Program, WorkingDir="", WindowSize=""){ 
    SplitPath Program, ExeFile 
    Process, Exist, %ExeFile% 
    PID = %ErrorLevel% 
    if (PID = 0) { 
    Run, %Program%, %WorkingDir%, %WindowSize% 
    }else{ 
    WinActivate, ahk_pid %PID% 
    } 
}

; ================================================================================================================================ 标签

; 帮助信息,待修改
Label_Help:
	Gui, 96:Destroy
	Gui, 96:Margin, 20, 20
	Gui, 96:Add, Picture, xm w13 h-1 Icon1, Data\Yz.icl
	Gui, 96:Font, s11 Bold, %GUIFont%
	Gui, 96:Add, Text, x+10 yp, 简易帮助
	Gui, 96:Font
	Gui, 96:Font, s11, %GUIFont%
	Gui, 96:Add, Text, y+5, LShift切换输入模式
	Gui, 96:Add, Text, y+5, Space首选上屏, Enter英文字符上屏
	Gui, 96:Add, Text, y+5, /键 内置功能键
	Gui, 96:Add, Text, y+5, 1、2、3、……、,、。候选上屏
	Gui, 96:Add, Text, y+5, Ctrl + 1、2、3、……调节对应项到首选,`n长按调至指定位置
	Gui, 96:Add, Text, y+5, Ctrl + Alt + 1、2、3、……删除对应词条
	Gui, 96:Add, Text, y+5, Left、Right、Ctrl + 字母 调整插入位置
	Gui, 96:Add, Text, y+5, Ctrl + = 快捷造词
	Gui, 96:Add, Text, y+5, Ctrl + Shift + Alt + F1 帮助
	Gui, 96:Add, Text, y+5, 在选项、词库管理的控件处停留0.5秒`n显示详细说明
	Gui, 96:Add, Text, y+5, 选项 - 控制 - 命令管理 - 模式切换`n有更多便捷的设置
	Gui, 96:Add, Picture, xm y+20 w13 h-1 Icon11, Data\Yz.icl
	Gui, 96:Font, s11 Bold, %GUIFont%
	Gui, 96:Add, Text, x+10 yp, 详细帮助
	Gui, 96:Font
	Gui, 96:Font, s11, %GUIFont%
	Gui, 96:Add, Link, y+5, <a href="https://www.autoahk.com/document/26056.html">在线帮助文档</a>
	Gui, 96:Show, , 腾图快手 帮助
Return

Label_Set:

Return

Label_Exit:
    ExitApp
Return

; 鼠标划动
; 需优化: 移动一定距离才算
gtrack:
    MouseGetPos xpos2,ypos2
    track:=(Abs(ypos1-ypos2)>=Abs(xpos1-xpos2))?(ypos1>ypos2?"UP":"DOWN"):(xpos1>xpos2?"LEFT":"RIGHT")
    if(track<>SubStr(gtrack,0,1)) and (Abs(ypos1-ypos2)>4 or Abs(xpos1-xpos2)>4)
       gtrack=%track%
    xpos1:=xpos2,ypos1:=ypos2
Return


Label_Pause:
    Pause 
Return

Label_Reload:
    Reload
Return