AHK 快餐店[10] 之 键盘也会乾坤大挪移 1
上回讲到鼠标给掌柜我折腾成蜗牛标,今天我们来折腾键盘吧。

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 不会占用。
    }
return

check:
; 一个代码片段以一个冒号作为标志。复习一下:热键是两个,热字符串是开头两个,结束也是两个。
IfWinNotExist %Title%
; 如果名字叫 Title (就是上面获得的)的窗口不存在,也就是被关闭了。
    hotkey, LWin, off
    ; 关闭热键 LWin,这一关一开只是实现我们定义的热键的关闭与启用。真正实现屏蔽的是下面的 nowin 代码片段。
return

nowin:
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 版