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

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

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

Оригинал статьи в AutoHotkey.chm: "Send Messages to a Window or Its Controls", по ссылке из статьи "PostMessage / SendMessage", в содержании - "Window Management" - "Controls" - "PostMessage/SendMessage".

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

Отправка сообщений окну или его элементам управления

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).

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

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

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

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

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

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