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

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

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

Оригинал статьи в AutoHotkey.chm: "PostMessage/SendMessage", в содержании - "Window Management" - "Controls" - "PostMessage/SendMessage", v1.0.46.03.

Ник переводчика: YMP.

Настоящее имя переводчика: Юрий Попов.

PostMessage / SendMessage

Посылают сообщение окну или его контролу (элементу управления). SendMessage, кроме того, ждёт подтверждения.

PostMessage, Msg [, wParam, lParam, Control, WinTitle, WinText, ExcludeTitle, ExcludeText]
SendMessage, Msg [, wParam, lParam, Control, WinTitle, WinText, ExcludeTitle, ExcludeText]

Параметры

Msg Номер сообщения (может быть выражением). Номера некоторых сообщений можно посмотреть в статье "Коды оконных сообщений".
wParam Первый компонент сообщения (может быть выражением). Если опущен или пустой, будет послан 0.
lParam Второй компонент сообщения (может быть выражением). Если опущен или пустой, будет послан 0.
Control Контрол. Если опущен или пустой, сообщение будет послано прямо указанному окну. Может задаваться как ClassNN (имя класса и номер данного экземпляра) или как имя/текст контрола. Все эти значения можно определить, используя программу Window Spy. При использовании имени/текста метод их поиска можно задавать командой SetTitleMatchMode.

Чтобы указать контрол через его HWND (window handle, идентификатор окна), оставьте параметр Control пустым и задайте ahk_id %ControlHwnd% как значение параметра WinTitle - это работает также и для скрытых контролов, даже если обнаружение скрытых окон (команда DetectHiddenWindows) не включено. HWND, как правило, узнаётся через команды ControlGet Hwnd, MouseGetPos или DllCall.
WinTitle Заголовок или часть заголовка окна (метод поиска можно задавать командой SetTitleMatchMode). Если этот и следующие 3 параметра опущены, будет использовано последнее найденное окно. Если параметр задан буквой А и следующие 3 параметра опущены, будет использовано активное окно. Чтобы задать окно через его класс, используйте конструкцию ahk_class ТочноеИмяКласса (можно посмотреть программой Window Spy). Чтобы использовать идентификатор процесса (PID), задайте параметр как ahk_pid %ПеременнаяСодержащаяPID%. Чтобы использовать группу окон, задайте параметр как ahk_group ИмяГруппы. Чтобы использовать идентификатор окна, задайте параметр как ahk_id %ПеременнаяСодержащаяID%. Сектор поиска можно сузить, задав несколько критериев, например, My File.txt ahk_class Notepad.
WinText Подстрока из одиночного текстового элемента окна (можно посмотреть программой Window Spy). Скрытые текстовые элементы определяются, если включено определение скрытого текста (команда DetectHiddenText).
ExcludeTitle Окна, чей заголовок включает значение этого параметра, исключаются.
ExcludeText Окна, чей текст включает значение этого параметра, исключаются.

ErrorLevel

PostMessage: нуль, если программа выполнена успешно; иначе 1.

SendMessage: ErrorLevel содержит слово FAIL, если возникли проблемы. Иначе содержит числовой результат сообщения, который иногда может быть "ответом", в зависимости от типа сообщения и целевого окна.

Примечания

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

PostMessage помещает сообщение в очередь сообщений, связанную с указанным окном. Она не ждёт подтверждения или ответа. Напротив, SendMessage ждёт до 5 секунд, пока целевое окно обработает сообщение. Если в течение 5 секунд сообщение не будет обработано, команда завершается и задаёт переменной ErrorLevel значение FAIL.

Параметры Msg, wParam и lParam должны быть целыми числами между -2147483648 и 4294967295 (0xFFFFFFFF). Как обычно в AutoHotkey, префикс 0x означает шестнадцатеричное число. Например, 0xFF эквивалентно 255.

Послать строку через параметры wParam или lParam можно путём указания адреса переменной. Пример ниже использует оператор адреса (&), чтобы сделать это:

SendMessage, 0xC, 0, &MyVar, ClassNN, WinTitle

Начиная с версии 1.0.43.06, строка, помещаемая в MyVar получателем сообщения, распознаётся корректно без необходимости каких-либо дополнительных шагов. Однако это работает, только если первым символом параметра является амперсанд (&). Например, 5+&MyVar не будет работать, а &MyVar или &MyVar+5 будут.

Начиная с версии 1.0.40.05 строка в кавычках (литеральная строка) также может быть послана; оператор & в этом случае не используется. Например:

Run Notepad
WinWait Безымянный - Блокнот
SendMessage, 0xC, 0, "Новый заголовок окна" ; 0XC означает сообщение WM_SETTEXT

Чтобы послать сообщение всем окнам в системе, включая те, что скрыты или заблокированы, задайте параметру WinTitle значение ahk_id 0xFFFF (0xFFFF означает сообщение HWND_BROADCAST). Этот способ должен использоваться только с сообщениями, которые предназначены для рассылки всем окнам. Пример:

SendMessage, 0x1A,,,, ahk_id 0xFFFF ; 0x1A - сообщение WM_SETTINGCHANGE

Чтобы скрипт сам мог принимать сообщения, используйте функцию OnMessage().

Об использовании этих команд см. также статью "Отправка сообщений окну или его элементам управления".

Заголовки и текст окон чувствительны к регистру. Скрытые окна не определяются, если это не задано командой DetectHiddenWindows.

Примеры

#o:: ; Win+O выключает монитор.
Sleep 1000
; Дать пользователю время отпустить клавиши (на случай, если их отпускание может включить монитор).
; Выключить монитор:
SendMessage, 0x112, 0xF170, 2,, Program Manager
; 0x112 - сообщение WM_SYSCOMMAND, 0xF170 - сообщение SC_MONITORPOWER.
; Примечание: для включения монитора используйте -1 вместо 2.
; Используйте 1 вместо 2, чтобы отправить монитор в спящий режим.
return

; Запустить выбранную пользователем заставку:
SendMessage, 0x112, 0xF140, 0,, Program Manager ; 0x112 - сообщение WM_SYSCOMMAND, 0xF140 - SC_SCREENSAVE.

; Прокрутить вверх на одну строку (для контролов с вертикальной полосой прокрутки):
ControlGetFocus, control, A
SendMessage, 0x115, 0, 0, %control%, A

; Прокрутить вниз на одну строку:
ControlGetFocus, control, A
SendMessage, 0x115, 1, 0, %control%, A

; Переключить раскладку клавиатуры/язык для активного окна на английский:
PostMessage, 0x50, 0, 0x4090409,, A ; 0x50 - сообщение WM_INPUTLANGCHANGEREQUEST.

; Этот пример запрашивает у Winamp номер активного трека:
SetTitleMatchMode, 2
SendMessage, 1024, 0, 120, - Winamp
if ErrorLevel <> FAIL
{
    ErrorLevel++ ; Winamp считает с 0, перейти к счёту с 1.
    MsgBox, Трек №%ErrorLevel% сейчас активен или проигрывается.
}
; Больше подробностей см. в статье "Automating Winamp".

; Определить идентификатор процесса скрипта (альтернатива команде "WinGet PID").
; Замените SomeOtherScript.ahk на имя какого-либо запущенного скрипта.
SetTitleMatchMode, 2
DetectHiddenWindows, on
SendMessage, 0x44, 0x405, 0, , SomeOtherScript.ahk - AutoHotkey v
MsgBox Идентификатор процесса - %ErrorLevel%.

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

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