1

我想创建一个发送一些键的热键,然后为刚刚发送的键创建另一个热键,然后发送第三个键。

这似乎是可能的,使用#InputLevel

#InputLevel 1
a::b
#InputLevel 0
b::c

以上按预期工作:按a我得到c

但是,我不仅想重新映射第一个密钥:我还想在发送密钥之前做更多事情。所以我想我可以稍微重写一下上面的内容:

#InputLevel 1
Hotkey *a, foo
#InputLevel 0
b::c

foo:
    ; Do something more here …
    SendInput {Blind}b
    return

然而,上述内容并没有按预期工作:按a我得到b(不是c)。

更新:@Robert Ilbrink 提醒我,您可以执行多个命令,而无需使用Hotkey命令:

#InputLevel 1
*a::
    ; Do something here …
    SendEvent {Blind}b
    return
#InputLevel 0
b::c

以上确实给出了预期的效果:在c中按下a结果。但是,我必须重新表述我的问题。我想问题是:我需要动态设置热键,这意味着我必须使用带有标签的命令(据我所知)。(还要注意我在上面使用。使用产生 a b。奇数。)HotkeySendEventSendInput

(更新结束。)

我知道有一个伴随命令#InputLevel—<a href="http://l.autohotkey.net/docs/commands/SendLevel.htm" rel="nofollow"> SendLevel—这可能是相关的。我试过把它放在很多地方,但从来没有任何区别。

因此,这是简化的理论示例。将 a 重新映射到 b 到 c 在现实中当然是没有用的(最终结果当然可以通过 实现a::c)。关于我的用例。请记住,如果事实证明“真正的”解决方案意味着做我正在尝试以其他方式做的事情,我仍然有兴趣了解更多关于#InputLeveland的信息SendLevel,以及为什么我的示例不能按预期工作。

我正在努力实现双重角色修饰键。例如,单独按下RShift时发送),但与其他键一起按下时发送RShift+键。基本上,RShift on keydown,RShift up and ) on keyup。但是,这有一个缺陷:即使将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

上面的解决方案非常适合我的目的——除了打破用户可能做出的所有重新映射和其他热键:这些根本不会发生。

4

3 回答 3

3

为什么不:

a::
; Do something
Send, b
Return
于 2013-06-25T12:31:41.867 回答
1

据我所知,#InputLevel不咬Hotkey命令。但是,我偶然发现了我最初发布的其中一个片段的解决方案:

Hotkey *a, foo
b::c

foo:
    ; Do something more here …
    SendLevel 1
    SetKeyDelay 0 ; Optional; Only affects this hotkey.
    SendEvent {Blind}b
    return

注意SendEvent必须使用。SendInput产生bSendPlay根本不产生任何东西。我不知道为什么。

但是,如果您想发送热键本身,此技术将不起作用。然后你最终陷入无限循环。使用键盘钩子没有帮助,因为SendLevel它会覆盖它。

所以,我又得到了一个答案,解决了最初的例子之一,但实际上对我没有帮助。我需要自己发送热键。我想我必须让用户使用我的脚本重新映射他们的密钥。叹。

更新:

我现在已经发布了我的双重角色修饰符脚本,以防有人对更多细节以及我如何处理这些问题感兴趣。

更新:

我已经更新了我的双重角色修饰符脚本。我现在远离Hotkey命令。我认为处理这种事情会更容易。

于 2013-06-27T10:53:40.980 回答
1

现在(从 Autohotkey 1.1.01 开始),这可以很容易地实现,如下所示:

~Shift up::
    IfInString, A_PriorKey, Shift
    {
        Send )
    }
return
于 2016-07-29T08:53:23.940 回答