Autohotkey 自动热键:使用相同键的函数之间的冲突

Autohotkey 自动热键:使用相同键的函数之间的冲突,autohotkey,Autohotkey,最近我用了很多“$”键,在我的(西班牙语)键盘上,我必须每次按Shift+4,所以我决定使用AutoHotkey来加快速度。 这个想法通过使用“ç”键来加快速度,因为我不经常使用它 ç:: Send $; new use of the key Return 这很有效,但有时我确实需要写“ç”和“ç”,所以我尝试添加这个 !ç:: Send ç ; to get the "ç" back in game Return +ç:: Send Ç ;original use of

最近我用了很多“$”键,在我的(西班牙语)键盘上,我必须每次按Shift+4,所以我决定使用AutoHotkey来加快速度。 这个想法通过使用“ç”键来加快速度,因为我不经常使用它

ç::
  Send $; new use of the key
Return
这很有效,但有时我确实需要写“ç”和“ç”,所以我尝试添加这个

!ç::
   Send ç  ; to get the "ç" back in game
Return

+ç::
   Send Ç ;original use of the "ç" key
Return
但它不起作用(继续发送$,因为“ç”现在是“$”)。
我觉得这应该很明显,但仍然找不到解决办法。感谢您的时间

解决此问题的最简单方法是增加 用于重新映射的热键

#InputLevel 1
ç::
  Send $ ; new use of the key
Return
#InputLevel 0
这可以防止它被炒鱿鱼购买脚本。如果
InputLevel
>=,则由于
Send
而不会执行热键。默认情况下,它们都是0

实际上,在这种情况下,问题不在于
SendLevel
(它不大于
InputLevel
),而在于
ç
热键注册为
reg
热键,
reg
热键无法区分模拟输入和真实输入,因此它总是会被触发

使用
#UseHook on
而不是设置输入级别也可以解决问题
#InputLevel 1
使
ç
成为
k-hook
键(因为所有具有
InputLevel>0
的热键都使用键盘挂钩)。在这种情况下,这才是重要的,而不是级别本身。

首选的直观方式:使用
ç::$
而不是命令块。 这将重新映射键,而不是为其指定宏。这种方式在AHK脚本中非常直观,因为主要和次要语法与主要和次要意图很好地对应,即:

  • (主)完全重新映射密钥(在AHK中,这是在没有宏的情况下完成的)
  • (次要)添加一些执行非标准功能的宏
  • •使用
    #InputLevel
    优先级排序不会使事情变得不必要的复杂化

    更改后的完整代码:

    !ç::
       Send ç  ; to get the "ç" back in game
    Return
    
    +ç::
       Send Ç ;original use of the "ç" key
    Return
    
    ; new use of the key
    ; ### this code has to be b̲e̲l̲o̲w̲ the macros
    ç::$
    

    经过测试,它的工作原理与预期一致。(版本1.1.25.012017-03-05)

    @Oleg–我在发布答案之前对它进行了测试。它很好用。你知道为什么它不起作用吗?如果没有,也许你可以考虑收回你的否决。谢谢你公平的对待。你可能只是认为你做到了;)<代码>ç::$扩展为
    *ç:
    *çup::
    这将吃掉所有的
    热键。如果您在测试时将
    ç::$
    放在其他热键下,那么它会解释为什么它对您有效(原因与它变成
    k-hook
    热键相同,并且不会吃掉其他热键)。我测试了你在答案中发布的代码,它不起作用,我不知道它是如何起作用的。也可能是我版本中的一个bug。我用的是一个相当旧的,我用过,甚至还提交了一份。目前没有回应。我仍然不明白你的代码是如何工作的。@Oleg–我的错,我发现测试版本的末尾是
    ç::$
    。我修正了答案,我为此道歉。我忘记了那个细节,我只是在再次测试时才想起它。您的详细解释似乎是正确的。这对我来说很有效,但另一个答案也提供了一个解决方案,代码中的更改更少。非常感谢您的解释,感谢您,现在我了解了“SendLevel”是如何工作的,我可能会将其用于其他代码。@Mosky np,选择对您最有用的答案正是您应该做的。