Предотвращение конфликта физических клавиш с отправленными ключами с помощью AutoHotKey - PullRequest
0 голосов
/ 14 января 2020

Я хочу определить ярлык, используя autohotkey, который автоматизирует навигацию к текстовому полю «Ширина ячейки» в меню ленты Word (т. Е. Отправляет клавиши Alt , j , l , w в Word).

Моя первоначальная попытка выполнения сценария приводит к проблеме, при которой действия Up нажатий физических клавиш не были выполнены до отправки ключей. по сценарию, приводящему к сбою.

Хотя у меня есть обходной путь (использующий sleep 250, показанный ниже), я хотел бы понять, существует ли более элегантное решение - например, это значение было выбрано методом проб и ошибок, и этот обходной путь может завершиться неудачей на другом компьютере, или если у моего ноутбука плохой день.

По сути, я хотел бы найти решение, позволяющее избежать жесткого кодирования продолжительности ожидания.

Есть предложения?


Проблема

В моем исходном скрипте я попытался определить горячую клавишу Alt + Shift + p в Word, чтобы отправить Alt , j , l , w в последовательности. Это приводит к сбою, и вместо этого вводится текст "jlw" в ячейку активной таблицы.

Это связано с тем, что для физически нажатых клавиш (отмеченных # в комментариях ниже) действия 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!

Ответы [ 3 ]

0 голосов
/ 14 января 2020

Не уверен, почему вы используете правильный 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

Конечно, это не очень хороший способ go об этом, я уверен, что вы можете как-то ссылаться на активную таблицу и активную ячейку, я просто быстро прочитал документы и написал это. На самом деле я никогда не использовал ничего подобного на практике.

0 голосов
/ 16 января 2020

Я нашел более элегантное решение, используя 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               
0 голосов
/ 14 января 2020

Если целевое окно не получает надежных нажатий клавиш, вы можете попробовать увеличить продолжительность нажатия в команде отправки с помощью второго параметра SetKeyDelay , например,

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