热键控制的进阶用法

以下是平时群里搜集的热键控制扩展用法,一起贴出来分享一下

感谢AHK社区的群友们分享代码

PS:以下示例都用SetTimer,因为Loop循环强占线程不易跳出。适应SetTimer循环后,可实现多段异步循环

像Win这种特殊键需要管理员权限运行才能控制,可将以下代码加入脚本头部自提权

;脚本自检测,如果不是管理员就自动以管理员权限运行自身
if !(A_IsAdmin || InStr(DllCall("GetCommandLine", "str"), ".exe"" /r"))
    Run % "*RunAs " (s:=A_IsCompiled ? "" : A_AhkPath " /r ") """" A_ScriptFullPath """" (s ? "" : " /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
} Return

 

2.右键双击不影响原按键

优点,不影响单击工作,双击反应也快。缺点,我笔记本电脑有时会失效。

~RButton::
t:=-Round(oldt)+(oldt:=A_TickCount)
if (t<100 || t>400)
    Return
 else oldt:=0
    Msgbox,4096,, 双击
Return

 

3.键盘大小写状态判断

Send发送按键是区分大小写的,假如现在是键盘锁定大写状态,Send, a的话,AHK就会先切换到小写再发送a。当大写状态输入一串小写字母就会出现频繁切换大小写的情况。需要这代码修正

if GetKeyState("CapsLock", "T") {
    MsgBox 大写
 } else {
    MsgBox 小写
 }

 

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.按住Alt触发鼠标连点【接上条】

在上条基础上扩展而来,做为组合键触发鼠标连点(第三行的50是循环的间隔为50毫秒)

~*LButton:: 
If GetKeyState("Alt", "P")
Settimer, LianDian, 50 
Return 

~LButton Up::Settimer, LianDian, Off

LianDian: 
Send  {LButton} 
Return 

 

6.单热键无限循环开关

按一下为启动循环,再按一下为停止循环(第三行的50是循环的间隔为50毫秒)

F1::toggle := !toggle

F1 Up::Settimer KaiGuan, % toggle=0 ? "Off" : 50

KaiGuan:
Send a
return

 

7.功能热键开关,按一次打开,再按一次关闭

用于功能开关,像电视遥控一样,按一次打开,再按一次关闭

F1::
if (onoff := !onoff)
    MsgBox, 布尔值为%onoff%`n第一次开
 else
    MsgBox, 布尔值为%onoff%`n第二次关
Return

 

8.双开关互锁,两个开关只能循环运行其中一个。【运行一个时,另一个会停止】

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

 

9.同时按AB键

F1::Send,{a down}{b down}{b up}{a up}

 

10.脚本控制,暂停、重新开始、退出

Loop {
	Sleep, 10
	ToolTip, 持续运算演示-%A_Index%
}

F3::pause
F4::Reload
Esc::ExitApp

 

11.按F1,如果指定坐标的颜色,是颜色组就按A或者B,再按一下F1则暂停

Global 颜色组:={}
颜色组["2E3436"]:="A"
颜色组["3EEBD9"]:="B"
Return

Esc::ExitApp

F1::
if !(onoff := !onoff) {
    SetTimer, 输入, off
 } else {
    SetTimer, 输入, 50
    Soundbeep,500,100
} Return

输入:
颜色:=GetColor(164,119)
if (颜色组[颜色]!="") {
    Send % 颜色组[颜色]
 } else if 颜色 not in 000000,FFFFFF
{ 
    Msgbox % "错误"颜色
    ExitApp
} Return

GetColor(x,y) {
PixelGetColor, color, x, y,Fast RGB
StringRight color,color,6 ;取颜色代码的后6位【就是去掉开头的0x】
Return color
}

 

12.鼠标右键双击粘贴

RButton::
RButtonCount++
if RButtonCount=1
	SetTimer, CheckR, -1000
if RButtonCount=1
KeyWait, RButton, U, T0.8
if ErrorLevel
	RButtonCount1:=1
else {
	KeyWait, RButton, D, T0.1
	if ErrorLevel
		RButtonCount1:=2
	else {
		RButtonCount++
		RButtonCount1:=3
	}
}
if RButtonCount1=1
        Menu, tray, Show
else if RButtonCount1=2
        Send {RButton}
else if RButtonCount1=3
        Send ^v
if  (RButtonCount1=1 || RButtonCount1=3)
	Gosub,RCount
Return
 
RCount:
RButtonCount:=0
RButtonCount1:=0
Return
 
CheckR:
if (RButtonCount=1 && RButtonCount1=2)
	Gosub, RCount
Return

 

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.autoahk.com/?s=%Clipboard%&type=post
Clipboard := ""
Clipboard := ClipHuanYuan
ClipHuanYuan := ""
Return

#IfWinActive

 

15.对特殊按键的修改和发送字符串

; 分号键改成半角小写【可用AhkSpy脚本获取对应按键码】
vkBA::Send {text}`;

; Send {text}可以发送字符串,用于录入信息
F1::Send {text}Hello World

给TA打赏
共{{data.count}}人
人已打赏
AHKV1学习

动态设置热键的例子-feiyue

2021-5-18 16:54:16

学习

AutoHotkey使用指定浏览器打开网址

2021-5-21 16:42:23

15 条回复 A文章作者 M管理员
  1. 〇〇13092

    👍赞

  2. 空
    给您打赏了¥5
  3. 沐羽

    赞👍

  4. 蜜獾哥

    大佬的世界问题辣么神秘且完美!

  5. §勇往直前
    §勇往直前给您打赏了¥5
  6. yzqdev

    感谢作者分享,学到了很多

  7. Ghostjack

    谢谢

  8. 龙玉杨

    感谢作者分享,

  9. aahk

    感谢作者分享,非常好的一些源代码。由于AutoAHK.COM 暂时没有可用的离线实时同步源代码库(本地离线数据库与网站在线源代码库登录连接实时同步更新编辑保存),所以我只好自制源代码数据库了,选择使用微软的mdb文件作为数据库( ms office中的Access查看和编辑mdb数据库),用Delphi设计窗口界面,搜索框的OnChange()事件函数可以实现即输即搜,无需按回车键就可以实时全文搜索源代码正文内容,实时修改,实时保存,实时备份历史多版本副本。把源代码分类整理收纳到数据库中,手动备份数据库文件到 群晖DS1821Plus网络附属存储服务器的RAID 1镜像存储池中。 也可以使用Visual FoxPro 9.0 或者 MySQL 或者其他什么编程语言或者数据库来设计自己的源代码库。从而拥有一个可以实时全文搜索源代码正文内容的,分类整理好的,自己长期收集的,强大好用的,《编程源代码》数据库系统应用程序软件。

    之所以自己设计源代码管理软件是因为一些现成的管理软件我感觉不好用。我需要灵活的(离线或者在线都可以用,有网或无网都可以用,可能是我孤陋寡闻了),智能的(全文搜索),实时的(实时搜索,实时保存,实时备份,实时同步),绿色免安装的(Delphi),安全的(指纹识别登录源代码库,实时多版本异地备份),可修改的(有完整的Delphi源代码,想怎么改就怎么改),我感觉还是自己做的软件窗口比较好用一点。

  10. dome

    👍

  11. 1河许人

    nice

  12. 哦哦耶

    谢谢分享

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索