AHK 快餐店[10] 之 键盘也会乾坤大挪移
上回讲到鼠标给掌柜我折腾成蜗牛标,今天我们来折腾键盘吧。
sein 今天路过 AHK 快餐店,进来坐了一下。作为一个狂热的游戏 fans,他对 win 键可是恨之入骨!n(←此恨绵绵)
sein:小众介绍的 NoWinKey – 程序全屏时 Win 键屏蔽 好用是好用,但是为我硬盘上一堆又一堆的游戏创建快捷键方式,根本就是要我命啊。
sfufoet:刚好,我研制出一个 AHK ,正愁没人测试呢。看着,按住 Win + 双击某个游戏图标,win 键就废了,退出游戏,又 ok 鸟。
sein:哇~~~,要了。88
果然是“没科学依据”派的作风。好吧,只好留下我来给大家做讲解了。我们先来看看简单的屏蔽按键的写法:
LWin::return
; 这样写的话 LWin (左边的 Win 键)就完全废掉了。
下面来看看演示给 sein 的代码,这里下载:
#~LButton::
; 快捷键 Win + 左键,没错, AHK 要实现双击判断的话,要用下面的代码
Keywait, LButton, , t0.5
if errorlevel = 1
return
else
Keywait, LButton, d, t0.1
if errorlevel = 0
{
; 上面这段代码是来自简睿随笔《科技篇》,作者的解释是这样的,我死活没弄明白:
; 用 KeyWait 读取键盘输入,如果 0.5 秒内不是按 LButton 则结束
; 0.5 秒内按了 LButton 则再读第二个按键,若为 LButton 则执行下面的代码
; 若第二个按键不为 LButton 则结束
sleep 1000
; 暂停 1 秒,等待程序运行。机子慢一点的电脑可以把这个时间调大一点。
WinGetActiveTitle, Title
; 获得活动窗口的标题,赋值给 Title。这段代码就是根据标题来禁止 LWin 的。
hotkey, LWin, nowin
; hotkey 这个函数就是今天重点要讲的。有时候我们需要在不同的情况启用或者禁用自定义的热键。解释一下:这里先用 hotkey 定义了一个新的热键 LWin 。当按下 LWin 的时候,会运行下面的 nowin 代码段。
hotkey, LWin, on
; hotkey 另一个用法,启用已定义的热键 LWin。
SetTimer,check,10
; 设置一个定时器,间隔 10 毫秒运行一次 check ,check 就是下面的代码片段。这时候会有读者担心,哇,这样 CPU 的占用率不是会非常高?一个 AHk 的脚本会占用 2~4M 的内存,CPU 不会占用。
}
returncheck:
; 一个代码片段以一个冒号作为标志。复习一下:热键是两个,热字符串是开头两个,结束也是两个。
IfWinNotExist %Title%
; 如果名字叫 Title (就是上面获得的)的窗口不存在,也就是被关闭了。
hotkey, LWin, off
; 关闭热键 LWin,这一关一开只是实现我们定义的热键的关闭与启用。真正实现屏蔽的是下面的 nowin 代码片段。
returnnowin:
return
; 这里一定要分开成两行,一行的话, AHK 死活不认。
看完代码和解释后,大家都晕了吧。小结一下:
当我们按下 Ctrl + 左键的时候,开始代码的执行。等待左键的按下。这里就是我们要的 Ctrl + 双击效果。暂停 1 秒后,获得活动窗口的标题。并启动一个定时器,这个定时器是用来监视目标程序存在不存在的。当目标程序不存在的时候,恢复系统的 LWin。
这个脚本还是有 bug,间歇性的,运行第一个程序可能没问题,关闭程序,再打开一个可能就失效了。
上面说到我死活没弄明白,为什么呢,大家运行一下下面的代码,当你按下左边的 Alt 的时候,第三句 Keywait, LAlt, , t0.5 会被执行,也就是,我们只按下一次 Alt,却触发了两个语句。
~LAlt::
errorlevel = 5
Keywait, LAlt, , t0.5
if errorlevel = 1
return
else
tooltip,%errorlevel%
return
算了,我们不用弄明白,知道怎么用就行了。
顺便批掉(快餐店变成批斗会了)小众介绍的 SharpKeys – 键盘映射与失效,这软件挺牛逼的,可惜要注销。
比如我们想调换一下 a,b 两个按键的话,两句代码就够了。
a::b
b::a
下回预告:AHK 快餐店[11] 之 虚拟桌面 AHK 版