Как заставить AutoHotkey автоматически закрывать всплывающее диалоговое окно?

Вопрос или проблема

Вопрос

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

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

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

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

  1. Я обновляю заголовки в своем документе Word

  2. Я нажимаю Ctrl+A, чтобы выбрать весь документ

  3. Я нажимаю F9, чтобы обновить все поля

  4. Этот раздражающий модальный диалог появляется (который нельзя настроить, согласно моим поискам в Google)
    введите описание изображения здесь

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

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

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

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

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

Мое исследование на данный момент

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

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

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 или 32772
       WinGetActiveTitle, Title
  If  ( Title = "sun 4 - foxtrot - Remote Desktop Connection" ) 
        SetCapsLockState, on
    else SetCapsLockState, off
}

Я вижу часть

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

Что делает весь остальной код?

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

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

Строки DllCall — это арканные части, которые связываются с Windows для получения сообщений от системы. Здесь вам следует знать, что вы делаете, если собираетесь вмешиваться в работу Windows.

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

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

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

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, если вы не измените это.

Затем этот код помещается в тело скрипта…

;-------------------------------------------------------
; Проверка на Microsoft Word Обновить таблицу содержания
;-------------------------------------------------------
WordTOCupdate:
    WinActivate             ;Установить окно поверх
    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 или WParam = 4) ;  HSHELL_WINDOWACTIVATED := 4 или 32772
       WinGetActiveTitle, Title
  If  (Title="Update Table of Contents" ) 
  {
       SendInput !e{Enter}   
  }
} 

Символ !e отправляет Alt+e для обновления всей таблицы.

Ответ или решение

Как автоматически закрывать всплывающее диалоговое окно с помощью AutoHotkey

Ваша задача заключается в том, чтобы автоматизировать процесс закрытия всплывающего диалогового окна обновления оглавления в Microsoft Word. Это может значительно ускорить вашу работу, поскольку такой диалог появляется каждый раз, когда вы обновляете содержимое документа. Рассмотрим, как можно добиться этого с помощью скриптов AutoHotkey.

Шаги по созданию скрипта AutoHotkey

  1. Установите AutoHotkey: Если у вас ещё не установлен AutoHotkey, загрузите и установите его с официального сайта AutoHotkey.

  2. Создайте новый скрипт: Щелкните правой кнопкой мыши на рабочем столе или в любом каталоге, выберите "Создать" -> "AutoHotkey Script". Дайте файлу подходящее имя, например CloseTOCDialog.ahk.

  3. Напишите код для отслеживания и закрытия диалогового окна:
    В открывшемся редакторе кода введите следующий скрипт:

    #Persistent  ; Делает скрипт работающим постоянно
    SetBatchLines, -1  ; Максимальная скорость выполнения скрипта
    Process, Priority,, High  ; Устанавливает высокий приоритет для процесса
    
    ; Определяем, какие диалоговые окна отслеживать
    Update Table of Contents ahk_exe WINWORD.EXE    B       HandleTOCUpdate
    Update Table of Figures ahk_exe WINWORD.EXE     B       HandleTOCUpdate
    
    return
    
    HandleTOCUpdate:
       WinActivate  ; Активируем диалог
       SendInput {Down}  ; Нажимаем вниз, чтобы выбрать "Обновить всю таблицу"
       SendInput {Enter}  ; Подтверждаем выбор
    return

    Объяснение кода:

    • #Persistent: Этот заголовок заставляет скрипт работать постоянно в фоновом режиме.
    • SetBatchLines, -1: Устанавливает максимальную скорость выполнения команд.
    • Process, Priority,, High: Обеспечивает высокий приоритет для текущего процесса, что делает его более отзывчивым.
    • В разделе Update Table of Contents ... мы прописываем названия диалоговых окон, которые нужно отслеживать (в этом случае это "Обновить таблицу содержания" и "Обновить таблицу иллюстраций").
    • В функции HandleTOCUpdate мы активируем окно и отправляем нажатия клавиш Down и Enter, чтобы автоматически выбрать "Обновить всю таблицу" и подтвердить выбор.
  4. Запустите ваш скрипт: Дважды щелкните на созданный файл CloseTOCDialog.ahk, чтобы запустить его. Теперь скрипт будет отслеживать и автоматически закрывать указанные диалоговые окна в Microsoft Word.

Оптимизация по ресурсам

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

Заключение

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

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

Оцените материал
Добавить комментарий

Капча загружается...