Перейти на главную страничку сайта (список статей, файлы для скачивания)
Проект перевода документации AutoHotkey: перечень переведённых статей и статей в работе.
Оригинал статьи в AutoHotkey.chm: "PostMessage/SendMessage", в содержании - "Window Management" - "Controls" - "PostMessage/SendMessage", v1.0.46.03.
Ник переводчика: YMP.
Настоящее имя переводчика: Юрий Попов.
Посылают сообщение окну или его контролу (элементу управления). 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 | Окна, чей текст включает значение этого параметра, исключаются. |
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 При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.