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