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


Tag: , , 2,980 views
有 53 个留言,我也要留言

a::b
b::a
真够方便的……

我没看懂。。。

我想了另一种方式呀,主要是这些

GroupAdd,game,ahk_class OpWindow ;或者标题
return
#IfWinActive,ahk_group game
LWin::return

然后可以定个键来取得 ahk_class 或 标题,写到文件里
GroupAdd那里用个loop来读取

实现:第一次进入游戏后按下快捷键禁用win,以后自动禁用~

能否用这个实现 鼠标移动到屏幕一角的时候 激活一个快捷键?

比如鼠标移动到右下角并停留500毫秒 激活CTRL+M

@caten,你可以像火山今天所介绍的脚本那样在快捷键里加条件呐,
比如按下CTRL+M后,检查鼠标坐标,,符合了再继续,这还不用等那500毫秒了

我的意思是 鼠标移动要右下角之后 自动激活快捷键 而不是我手按快捷键…..

什么叫激活快捷键啊,看不懂了

@caten,试试下面的代码,我这里测试成功。

#Persistent
; 让脚本永远运行,这句必备
CoordMode Mouse, Screen
; 把坐标系统设定为相对 Screen,还有一种是相对某个窗口。

SetTimer, ActiveHotkey, 10
; 每 10 毫秒运行一次 ActiveHotkey 代码段

ActiveHotkey:
MouseGetPos, xpos, ypos
; 获得鼠标位置,赋值给 xpos 和 ypos
W:=A_ScreenWidth-10
; 把屏幕的宽减去 10,A_ScreenWidth 是 AHK 自带的变量,代表屏幕的宽。
H:=A_ScreenHeight-10
if (xpos > W and ypos > H)
; 如果鼠标的坐标都大于屏幕的坐标减去 10 ,也就是说到达 右下角了。
{
; 这里放你想要的命令
}
return

@helfee
就是我做了这个鼠标动作 系统就认为我按了这个快捷键

@sfufoet
等下试试看 先谢谢了

@caten,鼠标移动到那了就发送CTRL+M吗?..那火山的就OK~~
想知道你这是用来干啥的呢?

[...] 下回预告:AHK 快餐店[10] 之 键盘也会乾坤大挪移 (1 votes, average: 5 out of 5) Tags: AHK, 鼠标 | 564 views | 抓虾 | 鲜果 | GReader | Del.icio.us | QQ 书签 | 就喜欢 相关文章StrokeIt-无处不在的鼠标手势 (23)德深鼠标输入法 - 只用鼠标的输入法 (19)鼠标移动距离/键盘点击次数统计 (15)HLine - 鼠标水平线 (3) [...]

很多啊 比如听歌的时候 要切换到下一首 在播放器设置个全局热键 然后直接划拉就行了 不用按快捷键
最小化窗口 等等

对了 这个是只运行一次的吗?如果我鼠标一直在那个位置 不会一直CTRL+M吧….
括号里的东西也帮忙写全了吧…………

能双击AHK脚本就发送快捷键吗?最好是发送完后退出。
如发送Ctrl+Alt+z

@caten ,没错,如果鼠标一直待在那里的话,就会一直发送。

如果你要发送的快捷键是 Ctrl + M
那么括号内的写法就是:

send ^m

顺便啰嗦一下:^ 代表 Ctrl,! 代表 Alt,+ 代表 Shift,# 代表 Win,其他按键比如 Esc 的写法是 {esc} ,前后的花括号不能省略。

建议 caten 好好地看一下这一些列教程。

@tireless ,双击脚本?你指的是系统托盘的 AHK 图标吧?

如果你想实现鼠标手势控制电脑的话,建议用 StrokeIt-无处不在的鼠标手势

我记得ahk的帮助文档里面就附有一个鼠标手势的例子, 也许可以参考一下…

@ sfufoet
有没有只发送一次的方法?
StrokeIt我不喜欢 - -

当然有办法啦。把花括号的内容修改为:

send ^m
MouseMove, 1000,750

这样,当你把鼠标移动到制定位置之后,会发送 Ctrl + m,然后 AHK 会把鼠标移动到坐标 1000,750。

@sfufoet
这样可以不?
多加一个变量来控制触发,
if(xpos<W or ypos<H)
a=1
else
{
if a=1
{
send ^m
a=0
}
}

@sfufoet,不是,就是运行AHK脚本,它的功能就是发送快捷键,发完后退出。

@3m,错了。是大于不是小于。
就是是大于,你这样写也是不对的。

@tireless,我问的是双击 AHK 的图标么?
其他的我能理解。如果能判断双击 AHK 图标的话,是可以实现的。

@tireless
那在脚本里面直接写send命令就行了, send完快捷键脚本自动退出.

@tireless ,3m 上面的意思是一个 ahk 脚本只有一句,就是那句 send。

内个。。。用alt+0160创建的隐形文件夹真的删不掉啊!!!
我是创建在vista系统(双系统)的桌面上了。改名也改不了,也无法移动。
双击打开是的路径是这样的D:\Users\xpw\Desktop\??,(注:逗号前面是空格)。哪位高人能提供个解决方案啊?

@sfufoet
在我这里测试通过…
意思是当鼠标不在设定的范围内的时候, 就a=1, 如果鼠标移到设定的范围内, 就执行一次命令, 然后a=0, 这样鼠标在设定的范围内再移动的时候就不会再重复执行命令, 只有移出设定的范围, 再移入, 才会再次执行.

雪地裸体一字码跪求帮助~~~~~~~~~~~~~

好奇害死猫啊。。。。。。。。。。

@3m,对哦。抱歉是我看错了。测试都不测试一下,怪我。

@菲,好彩。你在上面详细地说明你是双系统的。去另外的系统删除不就 ok 了。你不会安装两个 vista 吧?

@sfufoet, 没事, 感谢提供这么多ahk教程, 笑.

@tireless,ahk默认就是执行完脚本退出的啊,如果没定快捷键等

@菲,你总说删不掉有什么提示啊?

什么提示都没有哦

用内个什么total commander也删不掉

@菲,去另外的系统删除不就 ok 了。

好了,谢谢!!o(∩_∩)o…哈哈

但是为什么不能直接删掉呢?
是字符的原因吗?

@菲,是 vista 的原因。xp 下是可以直接删除的。

无语,知道了:Send ^!z
开始是用Send, {LCtrl}{LAlt}z{LControl up},用“那个”录制的。
由于我没入门,所以问了些简单死了的问题,自己都不好意思了。

其实是有个人问怎么双击批处理发送这个键…

@tireless,:)没事。谁都是从菜鸟开始的。

[...] AHK 快餐店[10] 之 键盘也会乾坤大挪移 11-01-2007 [...]

我想问下, 不算控制键的三键或多键组合怎么设置? 例如用 ^abc 做快捷键?

非常抱歉,现在才看到你的留言。

用 AHK 实现起来非常复杂,要用到 keywait 之类的命令。^abc 做快捷键也没什么意义吧?呵呵。如果你希望用三个键来热键的话,可以这样写:

^!c::

或者

^!+c::

字母做组合键只能做 1 个

sfufoet reply on 五月 22nd, 2008,9:12 下午:

[...] 今天的代码好简单,看过这一系列的朋友应该都能看明白的。Hotkey 命令在第十期有过详细的介绍。 [...]

[...] WIN 键 .ahk 加强版的废掉 Winkey,打开脚本 , 进入游戏后 , 按小键盘上的 * [...]

Dear sfufoet,

简睿随笔《科技篇》的HyperLink不對,無法確定您是取材自那篇文章的… :(

简睿随笔《科技篇》 在大陆访问不了。

那个地址是通过在线代理的地址。

sfufoet reply on 三月 31st, 2008,7:02 下午:

请问小键盘上的数字在ahk里怎么表示啊

左边的是Num Lock灯开启的时候,右边是关闭的时候:
Numpad0 NumpadIns
Numpad1 NumpadEnd
Numpad2 NumpadDown
Numpad3 NumpadPgDn
Numpad4 NumpadLeft
Numpad5 NumpadClear
Numpad6 NumpadRight
Numpad7 NumpadHome
Numpad8 NumpadUp
Numpad9 NumpadPgUp
NumpadDot (.) NumpadDel
NumpadDiv (/) NumpadDiv (/)
NumpadMult (*) NumpadMult (*)
NumpadAdd (+) NumpadAdd (+)
NumpadSub (-) NumpadSub (-)
NumpadEnter NumpadEnter

sfufoet reply on 六月 19th, 2008,3:08 下午:

还有一直按住某键的命令是怎么呢

例如 send 命令中:
send {a down}

sfufoet reply on 六月 19th, 2008,3:09 下午:

唉我以为自己能搞定呢,看来还是得再次求教
我玩魔兽时想用键盘代替右边小键盘
比如
::/war::
s::Numpad7
d::Numpad8
return
可是在里面经常须要说话,所有在不战斗的时候又想退出这个角本
本来想加上
::/warq::
s::s
d::d
return
反正这是我能想到比较笨的办法了,不知道为什么不好使
还有我希望能通过热键一直按下或弹起ALT键
也是打算放在
::/war:: 和return中的
本来想用#a::send {! down} 这样的代码,测试又不好使
总之就是在一段代码里开启另一段代码并可以停止的办法,请小众教一下

最后想说,AHK很强大,我现在基本上用它代替按键精灵,除了不支持C语言插入开发,希望小众软件能写个教程,将按键精灵里常规的功能用AHK都实现

键盘的映射只能映射一次。所以只能用别的键来映射到 Numpad7 和 Numpad8。

下面是一段左Alt键映射为:第一次按下左Alt等于Alt按下,第二次按下左Alt等于Alt弹起。

LAlt::
if time=0
{
send {Alt Down}
time=1
}
else
{
send {Alt Up}
time=0
}
return

sfufoet reply on 六月 19th, 2008,7:18 下午:

变量默认值是 0,所以第一次会执行到 if time=0

sfufoet reply on 六月 19th, 2008,7:19 下午:

留下评论

(必需)

(必需)