上回讲到鼠标给掌柜我折腾成蜗牛标,今天我们来折腾键盘吧。
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
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 个
[…] 今天的代码好简单,看过这一系列的朋友应该都能看明白的。Hotkey 命令在第十期有过详细的介绍。 […]
[…] WIN 键 .ahk 加强版的废掉 Winkey,打开脚本 , 进入游戏后 , 按小键盘上的 * […]
Dear sfufoet,
简睿随笔《科技篇》的HyperLink不對,無法確定您是取材自那篇文章的… 🙁
简睿随笔《科技篇》 在大陆访问不了。
那个地址是通过在线代理的地址。
请问小键盘上的数字在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
还有一直按住某键的命令是怎么呢
例如 send 命令中:
send {a down}
唉我以为自己能搞定呢,看来还是得再次求教
我玩魔兽时想用键盘代替右边小键盘
比如
::/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
变量默认值是 0,所以第一次会执行到 if time=0