3

Вопрос

Я бы хотел, чтобы AutoHotkey автоматически определял, когда появляется определенное всплывающее диалоговое окно, и предпринимал определенные действия. Как я могу это сделать?

Конкретный пример

В моем конкретном случае я бы хотел, чтобы AutoHotkey закрывал диалоговое окно « Обновление оглавления », отображаемое Word, когда я хочу обновить оглавление.

Это рабочий процесс:

  1. Я обновляю заголовки в моем документе Word
  2. Я нажимаю Ctrl+A, чтобы выбрать весь документ
  3. Я нажимаю F9, чтобы обновить все поля
  4. Это раздражающее модальное диалоговое окно появляется (который не может быть настроен согласно моим поискам Google)

  5. Теперь мне нужно нажать стрелку вниз, чтобы выбрать Обновить всю таблицу, а затем Enter, чтобы нажать Ok и продолжить.

Я бы хотел, чтобы AutoHotkey автоматически выдавал команду « Стрелка вниз», « Ввод», потому что описанный выше рабочий процесс я выполняю десятки раз в день.

Конечно, поскольку я запускаю рабочий процесс, я могу просто написать скрипт AutoHotkey, который сделает все за меня, начиная с Ctrl+A, например:

#IfWinActive ahk_class OpusApp
F9::
Send, ^a
Send, {F9}
Sleep, 200
Send, {Down}
Send, {Enter}
return

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

Мои исследования до сих пор

  • Некоторые интернет-источники предлагают использовать цикл AutoHotkey, который бесконечно зацикливается и проверяет, скажем, каждую секунду, существует ли окно с определенным заголовком, а затем закрывает его. Но я считаю, что это пустая трата ресурсов процессора
  • В некоторых других интернет-источниках упоминается хук оболочки вместе с фрагментом кода, и я думаю, что так оно и есть, но я не понимаю фрагмент кода; Может ли кто-нибудь объяснить, как это работает, и дать понятный пример, если это было решением?

Следующий фрагмент кода скопирован отсюда.

SetBatchLines, -1
Process, Priority,, High


Gui +LastFound
hWnd := WinExist()


DllCall( "RegisterShellHookWindow", UInt,hWnd )
MsgNum := DllCall( "RegisterWindowMessage", Str,"SHELLHOOK" )
OnMessage( MsgNum, "ShellMessage" )
Return


ShellMessage( wParam,lParam ) {
  If ( wParam = 32772 or WParam = 4) ;  HSHELL_WINDOWACTIVATED := 4 or 32772
       WinGetActiveTitle, Title
  If  ( Title = "sun 4 - foxtrot - Remote Desktop Connection" ) 
        SetCapsLockState, on
    else SetCapsLockState, off
}

Я вижу

If (Title = "sun 4 - foxtrot - Remote Desktop Connection") 

часть. Что делает весь отдых?

2 ответа2

0

Вы углубляетесь. Наличие монитора программы для заданного имени окна не является большим налогом на системные ресурсы. Это, вероятно, путь.

ShellMessage может быть любым именем по вашему выбору, потому что это функция, вызываемая OnMessage , которая запускается, когда ваш скрипт получает сообщение. Содержимое этой функции должно быть вашим кодом, чтобы убедиться, что вы находитесь в правильном окне, а затем выполнить команды, которые вы хотите отправить. Ваша функция может принимать до четырех параметров, как определено в файле справки для OnMessage .

DllCall - это таинственный бит, который связывает Windows, чтобы получать сообщения из системы. Это где вы должны знать, что вы делаете, если вы собираетесь вмешиваться в Windows.

SetBatchLines, -1 и Process, Priority,, High говорят, что ваш скрипт очень важен и должен работать на полной скорости все время, и никакой другой системный процесс никогда не должен его замедлять.

Gui +LastFound и hWnd := WinExist() находят уникальный идентификатор этого скрипта при его запуске, чтобы его можно было зарегистрировать в Windows в последующем DllCall .

0

Для эффективного кода, который не опрашивает и является более отзывчивым, вы можете адаптировать код здесь:

http://www.autohotkey.com/board/topic/84397-winwait-framework-do-something-to-a-window-when-it-appears/

В установочной части файла добавьте эти операторы:

Update Table of Contents ahk_exe WINWORD.EXE    B       WordTOCupdate
Update Table of Figures ahk_exe WINWORD.EXE     B       WordTOCupdate

Убедитесь, что между столбцами в этой части настройки скрипта есть вкладки (а не пробелы, в зависимости от используемого вами редактора). Имя exe также чувствительно к регистру, так как оно использует сопоставление RegEx, если вы не измените его.

Затем этот код записывается в теле скрипта ...

;-------------------------------------------------------
; Check for Microsoft Word Update Table of Contents
;-------------------------------------------------------
WordTOCupdate:
    WinActivate             ;Set Window to Be on top
    SendInput !e{Enter}
return

Вы также можете использовать фрагмент, который вы разместили ... это в основном то же самое.

Gui +LastFound
hWnd := WinExist()


DllCall( "RegisterShellHookWindow", UInt,hWnd )
MsgNum := DllCall( "RegisterWindowMessage", Str,"SHELLHOOK" )
OnMessage( MsgNum, "ShellMessage" )
Return


ShellMessage( wParam,lParam ) {
  If ( wParam = 32772 or WParam = 4) ;  HSHELL_WINDOWACTIVATED := 4 or 32772
       WinGetActiveTitle, Title
  If  (Title="Update Table of Contents" ) 
  {
       SendInput !e{Enter}   
  }
} 

!e посылает Alt+e, чтобы обновить всю таблицу.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .