平时群里搜集的热键控制扩展用法,整理出来分享一下
PS:以下示例都用SetTimer,因为Loop循环强占线程不易跳出。适应SetTimer循环后,可实现多段异步循环
像Win这种特殊键需要管理员权限运行才能控制,可将以下代码加入脚本头部自提权
; 脚本自检测,如果不是管理员就自动以管理员权限运行自身 if !(A_IsAdmin || InStr(DllCall("GetCommandLine", "Str"), ".exe /r")) RunWait % "*RunAs " (_:=A_IsCompiled ? """" : A_AhkPath " /r """) A_ScriptFullPath (_ ? """" : """ /r")
1.一键三用,单击、双击、长按
优点:稳定。缺点:单击时有400毫秒延时。不适合常用键。删除第2~5行和第20行可改为单击双击。
F1:: KeyWait, F1, T0.5 if (ErrorLevel = 1) { Msgbox 长按 } else { if (winc_presses > 0) { winc_presses ++ Return } winc_presses := 1 SetTimer KeyWinC1, -400 Return KeyWinC1: if (winc_presses = 1) { Msgbox 单击 } else if (winc_presses = 2) { Msgbox 双击 } winc_presses := 0 } Return
2.右键双击不影响原按键 By FeiYue
不影响单击工作,双击反应也快。
~*RButton:: t:=-oldt+(oldt:=A_TickCount) if (t<100 || t>400) Return else oldt:=0 Msgbox,4096,, 双击 Return
3.键盘大小写状态判断
CapsLock键在键盘中比较特殊,用第二行的SetCapsLockState来做CapsLock键反制,然后接着用if判断状态
CapsLock:: SetCapsLockState % !GetKeyState("CapsLock", "T") if GetKeyState("CapsLock", "T") { ToolTip 大写 } else { ToolTip 小写 } Return
4.按某键就启动,松开停止
主要用于狂点鼠标或者连击某键(第一行的50是循环的间隔为50毫秒)【示例为鼠标左键】
~*LButton::SetTimer LianDian, 50 ~*LButton Up::SetTimer LianDian, Off LianDian: Send {LButton} Return
或者
~LButton:: While GetKeyState("LButton","P") { Send a } Return
5.利用Loop机制和函数,实现随时立即终止连招
优点:可实现随时立即终止连招
缺点:对延时中止的精度不是绝对的高
更推荐的是使用 "多进程代替多线程函数" 来实现一键关闭:
多进程代替多线程函数 – 精简版
F1:: Global 立即中断:=0 Loop 1 { ; 把循环的1次去掉就是无限循环 Send("a") Sleep(1000) Send("{b}") Sleep(1000) Send("c") Send("d") Sleep(1000) Send("{e}") } Until 立即中断 Return F2::立即中断:=1 Send(按键) { if !立即中断 Send % 按键 } Sleep(延时) { if (!立即中断) { ; 把超过100毫秒的Sleep拆分成10份,方便急停 if 延时>100 延时 := 延时//10, 拆分=1 if 拆分=1 Loop 10 if !立即中断 Sleep 延时 Until 立即中断 else if !立即中断 Sleep 延时 } }
6.按住Alt触发鼠标连点
在上条基础上扩展而来,做为组合键触发鼠标连点(第三行的50是循环的间隔为50毫秒)
~*LButton:: If GetKeyState("Alt", "P") { Settimer, LianDian, 50 } Return ~*LButton Up::Settimer, LianDian, Off LianDian: Send {LButton} Return
7.单热键无限循环开关
按一下为启动循环,再按一下为停止循环(第三行的50是循环的间隔为50毫秒)
F1::toggle := !toggle F1 Up::Settimer KaiGuan, % toggle=0 ? "Off" : 50 KaiGuan: Send a return
8.功能热键开关,按一次打开,再按一次关闭
用于功能开关,像电视遥控一样,按一次打开,再按一次关闭
F1:: if (onoff := !onoff) { MsgBox, 布尔值为%onoff%`n第一次开 } else { MsgBox, 布尔值为%onoff%`n第二次关 } Return
9.双开关互锁,两个开关只能循环运行其中一个
F1:: F1onoff := !F1onoff, F2onoff=0 SetTimer F2循环, Off SetTimer F1循环, % F1onoff=0 ? "Off" : 50 ToolTip return F2:: F2onoff := !F2onoff, F1onoff=0 SetTimer F1循环, Off SetTimer F2循环, % F2onoff=0 ? "Off" : 50 ToolTip return F1循环: ToolTip F1循环%F1onoff% return F2循环: ToolTip F2循环%F2onoff% return
10.同时按AB键
; 热键只有一行时,可选择单行写法 F1::Send, {a down}{b down}{b up}{a up}
11.脚本控制,暂停、重新开始、退出
Loop { Sleep, 10 ToolTip, 持续运算演示-%A_Index% } F3::pause F4::Reload Esc::ExitApp
12.按住Capslock再按wsad变成上下左右
*CapsLock::Toggle=1 *CapsLock Up::Toggle=0 #if Toggle w::Send {Up} s::Send {Down} a::Send {Left} d::Send {Right} #if F1::onoff := !onoff ; 【示例】按F1后,1键变成0,再按一次,1键变成9 #if onoff 1::0 #if #if !onoff 1::9 #if
13.判断进程是否打开,没打开则启动程序,开着则唤醒目标
F1:: Process, Exist, hh.exe if ErrorLevel { WinActivate, ahk_class HH Parent } else { Run D:\AHK热键\AutoHotkey-v1.1.33.02_帮助文件中文.chm } return
14.热键可以只在指定窗口下生效
像Ctrl、Alt、Shift键是分左右的,可以选择性组合达到更好的分配
#IfWinActive ahk_class HH Parent RCtrl & Enter:: ClipHuanYuan := ClipboardAll Clipboard := "" Send ^a Send ^x ClipWait, 2 Run, https://www.ahk66.com/?s=%Clipboard% Clipboard := "" Clipboard := ClipHuanYuan ClipHuanYuan := "" Return #IfWinActive
15.对特殊按键的修改和发送字符串
; 分号键改成半角小写【可用AhkSpy脚本获取对应按键码】 vkBA::Send {text}`; ; Send {text}可以发送字符串,用于录入信息 F1::Send {text}Hello World
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。
评论(0)