Яндекс.Метрика

Send Messages to a Window or Its Controls -Autohotkey

Здесь обсуждаются команды PostMessage и SendMessage, и содержатся ответы на некоторые вопросы, такие, как:

by Rajat


Здесь обсуждаются команды PostMessage и SendMessage, и содержатся ответы на некоторые вопросы, такие, как:

"Как нажать кнопку в свернутом окне?"

"Как выбирать пункт меню, если WinMenuSelectItem не работает?!"

"Это – окно со скином..., как послать ему команду, которая будет работать?"

"и что насчет скрытых окон?!"


Требования: AutoHotkey v1.0.09+ и Winspector Spy (http://www.windows-spy.com).

В качестве первого примера, обратите внимание, что WinMenuSelectItem не будет работать с меню "New Message" в окне Outlook Express'а. Другими словами, следующий код не сработает:

WinMenuSelectItem, New Message,, &Insert, &Picture...

Но PostMessage может сделать это:

PostMessage, 0x111, 40239, 0, , New Message

Работает! Но что это за цифры? 0x111 - шестнадцатеричный код сообщения wm_command, а 40239 - код, который это специфическое окно понимает как выбор пункта меню 'Insert Picture'. Теперь позвольте мне рассказать вам, как найти значение типа 40239:

  1. Запустите Winspector Spy и откройте окно "New Message".
  2. Перетащите перекрестие из окна Winspector Spy на заголовок окна "New Message" (на часть, не закрытую оверлеем Winspector Spy).
  3. Сделайте правый клик на выделенном окне в списке слева, и выберите "Messages…".
  4. Сделайте правый клик на пустом окне справа, и выберите 'Edit message filter'.
  5. Нажмите кнопку 'filter all', и затем сделайте двойной клик на "wm_command" в списке слева. Так вы будете отслеживать только эти сообщения.
  6. Теперь переключитесь в окно "New Message" и выберите в его панели меню: Insert > Picture.
  7. Вернитесь в Winspector Spy и нажмите кнопку светофора, чтобы приостановить отслеживание.
  8. Просмотрите (раскройте) собранные сообщения wm_command (забудьте про другие, если они есть).
  9. То, что нам (обычно) нужно – это сообщение wm_command, начинающееся с "Code: 0". Иногда есть сообщения wm_command "win activated" или "win destroyed", и другие - они нам не нужны. А нужно сообщение "wm_command Code: 0 Control ID: 40239"... вот оно!
  10. Теперь введите это число в вышеупомянутую команду как значение wParam.

Для следующего примера я возьму Paint, потому что, скорее всего, он есть у каждого. Например, вы хотите в панели инструментов выбрать инструмент, используя AutoHotkey; скажем, должен быть выбран инструмент «пипетка».

Что вы сделаете? Наиболее логично кликнуть мышью на кнопке в панели «Набор инструментов», правильно? Но эта панель может быть перемещена или скрыта. Тогда этот пункт вашего скрипта не сработает. Но нижеуказанная команда все равно будет работать:

PostMessage, 0x111, 639,,, Безымянный - Paint

Другое преимущество PostMessage состоит в том, что нужное окно может быть на заднем плане; в отличие от этого, клики мыши требуют, чтобы окно было активным.

Вот еще некоторые примеры. Обратите внимание: я использую WinXP Pro (SP1)... Если вы используете другую операционку, тогда ваши параметры могут измениться (только для приложений Wordpad и Блокнот, которые поставляются с Windows; для других приложений параметры не должны измениться):

; меняет цвет шрифта на зеленый в Wordpad PostMessage, 0x111, 32788, 0, , Документ - WordPad ; открывает окно «О программе» в Блокноте PostMessage, 0x111, 65, 0, , Безымянный - Блокнот ; переключает «Перенос по словам» в Блокноте PostMessage, 0x111, 32, 0, , Безымянный - Блокнот ; play/pause в Windows Media Player PostMessage, 0x111, 32808, 0, , Windows Media Player ; заморозить горячие клавиши в выполняющемся скрипте MyScript.ahk! DetectHiddenWindows, on SetTitleMatchMode, 2 PostMessage, 0x111, 65305,,, MyScript.ahk - AutoHotkey

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

Вот еще некоторые замечания:

  • Замечание, сделанное выше относительно XP и возможного изменения значений сообщения в различных операционках, является просто предостерегающим. Если вы нашли сообщение, которое работает на вашей системе (с определенным приложением), то вы можете быть уверены, что оно также будет работать и на другой системе с той же версией приложения. Кроме того, большинство приложений сохраняют свои управляющие сообщения и в своих новых версиях (например, Windows Media Player и Winamp).
  • Если в Winspector Spy вы установили фильтр, чтобы показывать только wm_command, и, тем не менее, получаете поток разных сообщений, тогда кликните правой кнопкой мыши на нежелательном сообщении, и выберите «Hide (имя сообщения)...». Так вы не будете видеть сообщения, которые появляются без вашего участия, а являются служебными для выбранной программы.
  • Зеленая стрелка, направленная вправо в Winspector Spy, показывает посланные сообщения, а светлые стрелки влево - показывают возвращаемое значение. Значение «Return: 0» может быть взято как «no error» по умолчанию (если вы используете SendMessage, то это возвращаемое значение будет в %ErrorLevel%).
  • Чтобы посылать сообщения окнам с частичным совпадением заголовков, добавьте в скрипт:
    SetTitleMatchMode, 2
  • Чтобы посылать сообщения скрытым окнам, добавьте в скрипт:
    DetectHiddenWindows, On

ВНИМАНИЕ: есть приложения, с которыми эта методика не работает. Иногда удачно, а иногда – нет, я применял эту методику с VB и Delphi приложениями. Лучше всего эта методика работает с приложениями C, C++. С VB приложениями 'LParam' той же самой команды может меняться от запуска к запуску. А в некоторых Delphi приложениях, GUI (графический интерфейс пользователя, т.е. окна) вовсе не используют wm_command. Тогда можно использовать клики мыши.

Вперед к исследованиям..., и делитесь вашими исследованиями на Форуме AutoHotkey. Приходите - добро пожаловать!

Это руководство не предназначено для полных новичков (надеюсь, никто не обидится), так как эти команды считаются продвинутыми. Так, если после прочтения вышеупомянутого вы ничего не поняли – просто забудьте это.

Теги страницы: