Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также саму программу AutoHotkey и проблемы её использования)

Проект перевода документации AutoHotkey: перечень переведённых статей и статей в работе.

AutoHotkey: ожидание окон приложений

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


Задача: при запуске приложения 1С:Предприятие v7.7 необходимо автоматически передавать фокус списку информационных баз (элемент управления ListBox1). Текст скрипта:

#NoTrayIcon

SetTimer, timer_MonitorWindows, 100
return

timer_MonitorWindows:
WinGet, wid_list, List, Запуск 1С:Предприятия
Loop, %wid_list%
{
	wid := wid_list%A_Index%
	if ( ! proc[%wid%] )
	{
		proc[%wid%] := True
		ControlFocus, ListBox1, ahk_id %wid%
	}
}
Return

^!0::
MsgBox Скрипт "1C" будет завершён.
ExitApp
return

Рассмотрим работу скрипта в целом:

  1. Директива #NoTrayIcon подавляет вывод иконки скрипта в трее (чтобы не загромождать трей).
  2. Вначале скрипт устанавливает таймер с интервалом 100 миллисекунд (команда SetTimer). Это значит, что каждые 100 миллисекунд будет исполняться код, начиная с метки timer_MonitorWindows:, которая идёт ниже.
  3. В конце скрипта мы видим назначение горячей клавиши Ctrl+Alt+0, которая завершает работу скрипта с выводом предупреждающего сообщения (это будет единственный способ корректно завершить скрипт, т.к. иконки в трее не будет).

Разберём работу скрипта от метки timer_MonitorWindows:

  1. Команда WinGet получает список хэндлов окон с заголовком "Запуск 1С:Предприятия". Это именно те окна, при появлении которых нам нужно передавать фокус. Полученные хэндлы перебираются в цикле.
  2. Если очередной хэндл не входит в массив proc[] (а при первом обращении этот массив будет пуст), хэндл добавляется в массив (команда proc[%wid%] := True).
  3. Команда ControlFocus устанавливает фокус, куда нам нужно, в окне, имеющем этот хэндл.

Таким образом, каждые 100 миллисекунд скрипт перебирает имеющиеся окна с заголовком "Запуск 1С:Предприятия" (если таковые имеются) и устанавливает в каждом из них фокус в нужное место. Проверка на вхождение хэндла окна в массив позволяет избежать повторной (многократной) установки фокуса в одном и том же окне, что помешало бы работе пользователя.


Задача: при запуске отладчика 1С:Предприятия v7.7 разворачивать дочернее окно MDI-документа во весь экран (отладчик всегда открывает такой документ при запуске автоматически). Текст скрипта:

#NoTrayIcon

SetTimer, timer_MonitorDebugger, 100
return

timer_MonitorDebugger:
WinGet, wid_list, List, Отладчик -
Loop, %wid_list%
{
	wid := wid_list%A_Index%
	if ( ! proc[%wid%] )
	{
		proc[%wid%] := True
		WinActivate, ahk_id %wid%
		Send, !-{DOWN 4}{ENTER}
		;Send, !-р
	}
}
Return

^!0::
MsgBox Скрипт "1C" будет завершён.
ExitApp
return

В целом скрипт полностью аналогичен предыдущему, поэтому рассмотрим только действия с окном отладчика:

  1. Команда WinActivate передаёт фокус окну отладчика, т.к. последующая команда Send работает с активным в данный момент окном.
  2. Команда Send посылает нажатие клавиш Alt+-, которое приводит к вызову системного меню нужного нам дочернего окна, затем четыре нажатия клавиши "стрелка вниз", чтобы подойти к команде "Развернуть", и затем нажатие Enter, чтобы выполнить эту команду. Примечание: закомментированный вариант с посылом Alt+-, а затем русской "р", будет работать быстрее, но только в том случае, если язык по умолчанию в системе - русский.

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.