【问题标题】:Preventing physical key presses from conflicting with sent keys using AutoHotKey使用 AutoHotKey 防止物理按键与发送的按键发生冲突
【发布时间】:2020-01-14 06:27:15
【问题描述】:

我想使用 autohotkey 定义一个快捷方式,自动导航到 Word 功能区菜单中的单元格宽度文本框(即发送键 Altj l,w 在 Word 中)。

我对脚本的初始尝试引入了一个问题,即物理按键的Up 操作在脚本发送按键之前尚未完成,导致它失败。

虽然我有一个解决方法(使用sleep 250,如下所示),但我想了解是否有更优雅的解决方案 - 例如此值是通过反复试验选择的,此解决方法可能会在另一台机器上失败,或者如果我的笔记本电脑遇到了糟糕的一天。

基本上,我想找到一种避免硬编码等待时间的解决方案。

有什么建议吗?


问题

在我的初始脚本中,我尝试在 Word 中定义热键 Alt+Shift+p 以发送 Alt kbd>,j,l,w。这会失败,而是将文本“jlw”输入到活动表格单元格中。

这是因为对于物理按下的键(在下面的 cmets 中用# 标记),当脚本已经开始发送键(用$ 表示)时,Up 操作尚未运行。这会破坏发送序列 Alt,j,l,w,因此它会失败。

另请注意标有? 的事件可能是失败操作的副产品。

脚本

; Jump to table cell width entry when Alt+Shift+p pressed in Word only
#IfWinActive, ahk_exe WINWORD.EXE
!+p::
Send, {RAlt down}{RAlt up}jlw
Return

关键历史记录

VK  SC  Type    Up/Dn   Elapsed Key     Comment
-------------------------------------------------------------------------------------------------------------
A4  038     d   1.03    LAlt            #
A0  02A     d   0.14    LShift          #
50  019 h   d   0.13    p               #, h=Hook Hotkey
A5  138 i   d   0.02    RAlt            $
A5  138 i   u   0.00    RAlt            $
11  01D i   d   0.00    Control         ?
11  01D i   u   0.00    Control         ?
A4  038 i   u   0.00    LAlt            #
A0  02A i   u   0.00    LShift          #
4A  024 i   d   0.00    j               $
4A  024 i   u   0.00    j               $
4C  026 i   d   0.00    l               $
4C  026 i   u   0.00    l               $
57  011 i   d   0.00    w               $
57  011 i   u   0.00    w               $
11  01D i   d   0.00    Control         ?
A4  038 i   d   0.00    LAlt            ?
11  01D i   u   0.00    Control         ?
A0  02A i   d   0.00    LShift          ?
50  019 s   u   0.08    p               #
A0  02A     u   0.25    LShift          ?
A4  038     u   0.00    LAlt            ?

解决方法

通过添加sleep 250 语句,热键和发送键按预期顺序运行。请注意,不会触发其他键(? 未表示任何内容)。

脚本

; Jump to table cell width entry when Alt+Shift+p pressed in Word only
#IfWinActive, ahk_exe WINWORD.EXE
!+p::
Sleep 250
Send, {RAlt down}{RAlt up}jlw
Return

关键历史记录

VK  SC  Type    Up/Dn   Elapsed Key     Comment
-------------------------------------------------------------------------------------------------------------
A4  038     d   0.39    LAlt            #
A0  02A     d   0.20    LShift          #
50  019 h   d   0.20    p               #, h=Hook Hotkey
50  019 s   u   0.11    p               #
A0  02A     u   0.11    LShift          #
A4  038     u   0.00    LAlt            #
A5  138 i   d   0.03    RAlt            $
A5  138 i   u   0.00    RAlt            $
4A  024 i   d   0.00    j               $
4A  024 i   u   0.00    j               $
4C  026 i   d   0.00    l               $
4C  026 i   u   0.00    l               $
57  011 i   d   0.00    w               $
57  011 i   u   0.00    w               $, SUCCESS!

【问题讨论】:

    标签: autohotkey


    【解决方案1】:

    如果目标窗口没有可靠地接收到击键,您可以尝试通过SetKeyDelay的第二个参数在发送命令中增加按下时长,例如。

    !+p::
        SetKeyDelay, 10, 10
        Send, {RAlt down}{RAlt up}jlw
    Return
    

    【讨论】:

    • 有兴趣知道这一点以供将来参考 - 但是我想延迟发送键,而不是延长其按下持续时间。
    【解决方案2】:

    不确定您为什么要使用正确的 alt,甚至认为这不应该有效。只需使用“Alt”。而且我认为您的热键对此不是很好。 Word 与输入混淆。
    但我认为也许这样做,可以工作

    !+p up:: ;up means it'll run once u release p, might help a bit
        SetKeyDelay, 500, 10 ;good amount of delay, can probably do with less
        Send, {Shift Up}{Alt Up}{Alt}jlw ;send shift and alt up first
    Return
    

    现在有了更好的替代选择,使用Word ComObject 将其自动化。使用 VBA正常 和预期的方式,但您也可以使用 AHK(或任何其他语言)。
    这是一个更改第一个表格的第一个单元格宽度的快速 AHK 示例:

    Word := ComObjActive("Word.Application")
    Word.ActiveDocument.Tables(1).Cell(1, 1).Width := 500
    

    当然,这不是一个很好的解决方法,我相信您可以以某种方式引用活动表和活动单元格,我只是快速阅读文档并写下它。我自己实际上从未在实践中使用过这些东西。

    【讨论】:

    • 在进行故障排除时,我使用 RAlt 只是为了将其与密钥历史记录中的 LAlt 区分开来。在我的机器上,它同样有效地用于此目的。与此同时,虽然我找到了一个很快就会发布的解决方案,但我发现它更优雅,因为它避免了对等待时间的硬编码。
    【解决方案3】:

    我使用KeyWait 找到了一个更优雅的解决方案。与我之前的解决方法脚本相比,我认为这更优雅,因为它不需要硬编码等待持续时间。这只是在脚本继续之前等待按下的键出现,防止任何冲突:

    脚本

    #IfWinActive, ahk_exe WINWORD.EXE
    !+p::
    KeyWait Alt
    KeyWait Shift
    KeyWait p
    Send, {Alt Down}{Alt Up}jlw
    Return
    

    关键历史记录

    VK  SC  Type    Up/Dn   Elapsed Key     Comment using previous notation
    -------------------------------------------------------------------------------------------------------------
    A4  038     d   0.63    LAlt            #
    A0  02A     d   0.11    LShift          #
    50  019 h   d   0.11    p               #
    50  019 s   u   0.06    p               #
    A0  02A     u   0.19    LShift          #
    A4  038     u   0.00    LAlt            #
    12  038 i   d   0.01    Alt             $
    12  038 i   u   0.00    Alt             $
    4A  024 i   d   0.00    j               $
    4A  024 i   u   0.00    j               $
    4C  026 i   d   0.00    l               $
    4C  026 i   u   0.00    l               $
    57  011 i   d   0.00    w               $
    57  011 i   u   0.00    w               $
    

    有趣的是,修改为使用Send, !jlw 的上述脚本有效(即导航到单元格宽度框),但发送的键按如下顺序出现。我不会使用它,只是为了避免这种不按顺序发生的任何意外后果。

    VK  SC  Type    Up/Dn   Elapsed Key     Comment 
    -------------------------------------------------------------------------------------------------------------
    A4  038     d   1.17    LAlt            
    A0  02A     d   0.11    LShift          
    50  019 h   d   0.14    p               
    50  019 s   u   0.09    p               
    A0  02A     u   0.16    LShift          
    A4  038     u   0.00    LAlt            
    A4  038 i   d   0.02    LAlt            <--
    4A  024 i   d   0.00    j               
    4A  024 i   u   0.00    j               
    A4  038 i   u   0.00    LAlt            <--
    4C  026 i   d   0.00    l               
    4C  026 i   u   0.00    l               
    57  011 i   d   0.00    w               
    57  011 i   u   0.00    w               
    

    【讨论】:

      猜你喜欢
      • 2020-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-19
      • 1970-01-01
      • 2012-05-18
      相关资源
      最近更新 更多