Autohotkey 使用自动热键防止物理按键与发送的按键冲突

Autohotkey 使用自动热键防止物理按键与发送的按键冲突,autohotkey,Autohotkey,我想使用自动热键定义一个快捷方式,自动导航到Word功能区菜单中的“单元格宽度”文本框(即在Word中发送Alt、j、l、w键) 我最初尝试使用脚本时遇到了一个问题,即在脚本发送键之前,物理按键的Up操作尚未完成,导致脚本失败 虽然我有一个解决方案(使用sleep 250,如下所示),但我想了解是否有更优雅的解决方案-例如,此值是通过反复试验选择的,并且此解决方案可能在不同的机器上失败,或者如果我的笔记本电脑一天不好 本质上,我想找到一个解决方案,避免硬编码等待时间 有什么建议吗 问题 在我的

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

我最初尝试使用脚本时遇到了一个问题,即在脚本发送键之前,物理按键的
Up
操作尚未完成,导致脚本失败

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

本质上,我想找到一个解决方案,避免硬编码等待时间

有什么建议吗


问题 在我的初始脚本中,我试图在Word中定义热键Alt+Shift+p,以按顺序发送Alt、j、l、w。此操作失败,将文本“jlw”输入活动表格单元格

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

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

剧本 关键历史
变通办法 通过添加
sleep 250
语句,热键和sent键按预期顺序运行。注:未触发其他按键(未显示任何

剧本 关键历史
如果目标窗口无法可靠地接收击键,则可以尝试通过的第二个参数(例如)增加send命令中的按下持续时间


不知道你为什么要用正确的alt,甚至都不认为这是可行的。只需使用“Alt”。我认为你的热键在这方面不是很好。单词与输入混淆。
但我想也许这样做可以奏效

!+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
现在有一个更好的选择,使用自动化。使用for这是正常的和预期的方式,但您也可以使用AHK(或任何其他语言)。
下面是更改第一个表格的第一个单元格宽度的快速AHK示例:

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

当然,这不是一个很好的方法,我相信你可以引用活动表和活动单元格,我只是快速阅读文档并编写了它。实际上,我自己从来没有在实践中使用过这些东西。

我发现了一个更优雅的解决方案。与我之前的处理脚本相比,我认为这更为优雅,因为它不需要硬编码等待时间。这只是等待按下的键出现,然后脚本继续,以防止任何冲突:

剧本 关键历史
有趣的是,上面的脚本修改为使用
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               
VK SC Type Up/Dn键注释
-------------------------------------------------------------------------------------------------------------
A4 038 d 1.17 LAlt
A0 02A d 0.11升档
50 019小时直径0.14便士
50 019南美0.09便士
A0 02A u 0.16升档
A4 038 u 0.00 LAlt

A4 038 i d 0.02 LAlt我使用RAlt只是为了在故障排除时将其与密钥历史记录中的LAlt区分开来。在我的机器上,它在这方面同样有效。在此期间,虽然我找到了一个解决方案,我将很快发布,我发现它更优雅,因为它避免了硬编码等待时间。了解这一点很有趣,以供将来参考-但是我想延迟发送键,而不是延长其按下时间。
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!
!+p::
    SetKeyDelay, 10, 10
    Send, {RAlt down}{RAlt up}jlw
Return
!+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 := ComObjActive("Word.Application")
Word.ActiveDocument.Tables(1).Cell(1, 1).Width := 500
#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               $
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