AHK 快餐店[10] 之 键盘也会乾坤大挪移

53
1 Star2 Stars3 Stars4 Stars5 Stars(快来投票)
Loading...


上回讲到鼠标给掌柜我折腾成蜗牛标,今天我们来折腾键盘吧。

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 版

已有 53 条评论, 我要留言

  1. 李二嫂的猪说道:

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

  2. polaris说道:

    我没看懂。。。

  3. helfee说道:

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

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

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

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

  4. caten说道:

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

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

  5. helfee说道:

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

  6. caten说道:

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

  7. helfee说道:

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

  8. sfufoet说道:

    @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

  9. caten说道:

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

    @sfufoet
    等下试试看 先谢谢了

  10. helfee说道:

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

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

  12. caten说道:

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

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

  13. tireless说道:

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

  14. sfufoet说道:

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

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

    send ^m

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

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

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

  15. sfufoet说道:

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

  16. 3m说道:

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

  17. caten说道:

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

  18. sfufoet说道:

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

    send ^m
    MouseMove, 1000,750

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

  19. 3m说道:

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

  20. tireless说道:

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

  21. sfufoet说道:

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

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

  22. 3m说道:

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

  23. sfufoet说道:

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

  24. 说道:

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

  25. 3m说道:

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

  26. 说道:

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

  27. 说道:

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

  28. sfufoet说道:

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

  29. sfufoet说道:

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

  30. 3m说道:

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

  31. helfee说道:

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

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

  32. 说道:

    什么提示都没有哦

  33. 说道:

    用内个什么total commander也删不掉

  34. sfufoet说道:

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

  35. 说道:

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

  36. 说道:

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

  37. sfufoet说道:

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

  38. tireless说道:

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

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

  39. sfufoet说道:

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

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

  41. Dofy说道:

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

    • sfufoet说道:

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

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

      ^!c::

      或者

      ^!+c::

      字母做组合键只能做 1 个

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

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

  44. emisjerry说道:

    Dear sfufoet,

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

    • sfufoet说道:

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

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

  45. wildtoy说道:

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

    • sfufoet说道:

      左边的是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

  46. wildtoy说道:

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

  47. wildtoy说道:

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

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

    • sfufoet说道:

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

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

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

    • sfufoet说道:

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

有不同想法?说说看