Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Autohotkey 自动热键发送键,让它触发其他热键(#输入级混淆)_Autohotkey - Fatal编程技术网

Autohotkey 自动热键发送键,让它触发其他热键(#输入级混淆)

Autohotkey 自动热键发送键,让它触发其他热键(#输入级混淆),autohotkey,Autohotkey,我想创建一个热键来发送一些密钥,然后为刚刚发送的密钥创建另一个热键,然后再发送第三个密钥 这似乎是可能的,使用: 上述操作按预期进行:按a可获得c 但是,我不仅想重新映射第一个密钥:我还想在发送密钥之前做更多的工作。所以我想我可以重写一下上面的内容: #InputLevel 1 Hotkey *a, foo #InputLevel 0 b::c foo: ; Do something more here … SendInput {Blind}b return 但是,上

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

这似乎是可能的,使用:

上述操作按预期进行:按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提醒我,您可以执行多个命令,而无需使用
热键
命令:

#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
<代码>发送输入产生b
SendPlay
根本不产生任何结果。我不知道为什么

但是,如果您想发送热键本身,此技术将不起作用。然后你会进入一个无限循环。使用键盘挂钩没有帮助,因为
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
<代码>发送输入产生b
SendPlay
根本不产生任何结果。我不知道为什么

但是,如果您想发送热键本身,此技术将不起作用。然后你会进入一个无限循环。使用键盘挂钩没有帮助,因为
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解决了简化示例中的第一个问题(能够做的不仅仅是重新映射)。