Autohotkey 自动热键发送键,让它触发其他热键(#输入级混淆)
我想创建一个热键来发送一些密钥,然后为刚刚发送的密钥创建另一个热键,然后再发送第三个密钥 这似乎是可能的,使用: 上述操作按预期进行:按a可获得c 但是,我不仅想重新映射第一个密钥:我还想在发送密钥之前做更多的工作。所以我想我可以重写一下上面的内容:Autohotkey 自动热键发送键,让它触发其他热键(#输入级混淆),autohotkey,Autohotkey,我想创建一个热键来发送一些密钥,然后为刚刚发送的密钥创建另一个热键,然后再发送第三个密钥 这似乎是可能的,使用: 上述操作按预期进行:按a可获得c 但是,我不仅想重新映射第一个密钥:我还想在发送密钥之前做更多的工作。所以我想我可以重写一下上面的内容: #InputLevel 1 Hotkey *a, foo #InputLevel 0 b::c foo: ; Do something more here … SendInput {Blind}b return 但是,上
#InputLevel 1
Hotkey *a, foo
#InputLevel 0
b::c
foo:
; Do something more here …
SendInput {Blind}b
return
但是,上述操作无法按预期进行:按a我得到b(而不是c)
更新:@Robert Ilbrink提醒我,您可以执行多个命令,而无需使用热键
命令:
#InputLevel 1
*a::
; Do something here …
SendEvent {Blind}b
return
#InputLevel 0
b::c
以上确实给出了预期的效果:按a会产生c。然而,我必须重新表述我的问题。我想问题是:我需要动态设置热键,这意味着我必须使用带有标签的热键
命令(据我所知)。(还要注意,我在上面使用了SendEvent
。使用SendInput
会产生一个b奇数。)
(更新结束。)
我知道#InputLevel
有一个附带的命令,这可能是相关的。我试过把它放在很多地方,但从来没有任何不同
这就是简化的理论例子。将a映射到b再映射到c在现实中当然是无用的(当然,最终结果可以通过a::c
实现)。关于我的用例。请记住,如果事实证明“真正”的解决方案意味着以其他方式完成我正在尝试做的事情,那么我仍然有兴趣了解更多关于#InputLevel
和SendLevel
的信息,以及我的示例无法按预期工作的原因
我正在努力实施。例如,单独按重新换档时发送),但与其他键一起按下时发送重新换档+键。基本上,RShift在按下键时,和RShift up和)在按下键时。但是,这有一个缺陷:即使将RShift与其他键组合时,)仍会被发送。因此,脚本需要知道何时出现组合。我的解决方案是向所有字母键、箭头键和其他一些键添加热键,如下所示:
for comboKey in filteredComboKeys {
Hotkey % "*" comboKey, Dual_comboKey
}
; Later in script:
Dual_comboKey:
; The following function lets the dual-role modifier keys know that they have
; been combined with another key (and a few other things, which I don't think
; are important for the issue.)
Dual.combo() ;
key := Dual.cleanKey(A_ThisHotkey)
SendInput {Blind}%key%
return
上述解决方案对我来说效果很好,只是用户可能已经创建了“断开所有重映射”和其他热键:这些根本不会发生。为什么不:
a::
; Do something
Send, b
Return
为什么不:
a::
; Do something
Send, b
Return
据我所知,
#InputLevel
不会咬住热键
命令。然而,对于我最初发布的一个片段,我偶然发现了一个解决方案:
Hotkey *a, foo
b::c
foo:
; Do something more here …
SendLevel 1
SetKeyDelay 0 ; Optional; Only affects this hotkey.
SendEvent {Blind}b
return
请注意,必须使用SendEvent
<代码>发送输入产生bSendPlay
根本不产生任何结果。我不知道为什么
但是,如果您想发送热键本身,此技术将不起作用。然后你会进入一个无限循环。使用键盘挂钩没有帮助,因为SendLevel
会覆盖它
所以,我有一个答案,解决了其中一个最初的例子,但在现实中对我没有帮助。我需要发送热键本身。我想我必须让用户使用我的脚本重新映射他们的密钥。唉
更新:
我现在已经发表了,以防有人对更多细节感兴趣,以及我如何处理这些问题
更新:
我已经更新了我的双角色修改器脚本。我现在远离
热键
命令。我认为处理这类事情更容易。据我所知,#InputLevel
不会咬住热键
命令。然而,对于我最初发布的一个片段,我偶然发现了一个解决方案:
Hotkey *a, foo
b::c
foo:
; Do something more here …
SendLevel 1
SetKeyDelay 0 ; Optional; Only affects this hotkey.
SendEvent {Blind}b
return
请注意,必须使用SendEvent
<代码>发送输入产生bSendPlay
根本不产生任何结果。我不知道为什么
但是,如果您想发送热键本身,此技术将不起作用。然后你会进入一个无限循环。使用键盘挂钩没有帮助,因为SendLevel
会覆盖它
所以,我有一个答案,解决了其中一个最初的例子,但在现实中对我没有帮助。我需要发送热键本身。我想我必须让用户使用我的脚本重新映射他们的密钥。唉
更新:
我现在已经发表了,以防有人对更多细节感兴趣,以及我如何处理这些问题
更新:
我已经更新了我的双角色修改器脚本。我现在远离热键
命令。我认为,处理这类事情更容易。现在(启动Autohotkey 1.1.01),这可以很容易地实现,如下所示:
~Shift up::
IfInString, A_PriorKey, Shift
{
Send )
}
return
现在(启动自动热键1.1.01),可以很容易地实现这一点,如下所示:
~Shift up::
IfInString, A_PriorKey, Shift
{
Send )
}
return
啊,我怎么能忘记那个语法呢?这确实让我做了比重新映射更多的事情。(有趣的是,
SendInput
不起作用。)尽管如此,我还是必须使用热键
命令,因为“组合键”是动态的,用户甚至可以将其设置为支持a–z以外的其他字符。我现在更新了这个问题。感谢和+1解决了简化示例中的第一个问题(能够做的不仅仅是重新映射)。啊,我怎么能忘记这个语法呢?这确实让我做了比重新映射更多的事情。(有趣的是,SendInput
不起作用。)尽管如此,我还是必须使用热键
命令,因为“组合键”是动态的,用户甚至可以将其设置为支持a–z以外的其他字符。我现在更新了这个问题。感谢和+1解决了简化示例中的第一个问题(能够做的不仅仅是重新映射)。