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

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

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

AutoHotkey: автоматизация приложений

Программа AutoHotkey предоставляет поразительные возможности автоматизации "неуправляемых" приложений, которые не поддерживают нужные вам опции командной строки и/или OLE-автоматизацию. Например, с помощью Outlook Express можно подготовить к отправке письмо, используя URL наподобие такого:

mailto:aaa@bb.ru?subject=Тема сообщения&cc=bbb@cc.ru&bcc=cc@dd.ru&body=Тело%0a%0dсообщения

Если вы напечатаете этот URL в окне "Запуск программы" (меню "Пуск" - "Выполнить") и нажмёте ОК, в результате вы увидите в окне почтового клиента, заданного по умолчанию в вашей системе (предполагается, что это Outlook Express), письмо, готовое к отправке. Однако вставить файл (вложение) в это письмо с помощью URL крайне затруднительно. К сожалению, Outlook Express не поддерживает OLE-автоматизацию, поэтому "покомандовать" им с помощью скриптов не удастся. К ещё большему сожалению, Outlook Express не поддерживает и опций командной строки для таких целей. Однако, в такой ситуации можно воспользоваться скриптом для AutoHotkey (не спешите сразу запускать этот скрипт):

Run, mailto:aaa@bb.ru?subject=Тема сообщения&cc=bbb@cc.ru&bcc=cc@dd.ru&body=Тело`%0a`%0dсообщения
WinWait, Тема сообщения
PostMessage, 0x111, 40237, 0, , Тема сообщения
WinWait Вставка
ControlSetText, Edit1, c:\boot.ini, Вставка
PostMessage, 0x111, 1, 0, , Вставка

Разберём построчно, как работает скрипт (всего 6 строк):

  1. Запуск указанного URL. Это равносильно использованию меню "Пуск" - "Выполнить". Ожидаемый результат - окно нового письма Outlook Express, готового к отправке.
  2. Ожидание появления в системе окна с заголовком "Тема сообщения". Это именно то окно, которое рано или поздно должно появиться в результате исполнения предыдущей строки скрипта.
  3. Посылаем сообщение WM_COMMAND (код этого сообщения - 0x111) элементу управления с идентификатором 40237, который находится в окне с заголовком "Тема сообщения". Элемент управления с идентификатором 40237 - это команда меню "Вставка" - "Вложение файла".
  4. Ожидание появления в системе окна с заголовком "Вставка". Это окно выбора файла, которое рано или поздно должно появиться в результате исполнения предыдущей строки скрипта.
  5. Устанавливаем текст в поле ввода с классом окна "Edit1", равный "c:\boot.ini" (поле ввода находится в окне с заголовком "Вставка"). Это именно то поле ввода в окне выбора файла, рядом с которым находится надпись "Имя файла:". Таким образом, мы начинаем вкладывать в письмо файл "c:\boot.ini".
  6. Посылаем сообщение WM_COMMAND (код этого сообщения - 0x111) элементу управления с идентификатором 1, который находится в окне с заголовком "Вставка". Элемент управления с идентификатором 1 - это кнопка "Вложить" в окне выбора файла. Практически мы имитируем нажатие на эту кнопку.

Таким образом, в результате работы скрипта мы получаем письмо, готовое к отправке, в которое уже вложен файл "c:\boot.ini".

Однако, этот скрипт совсем необязательно будет у вас работать, т.к. идентификаторы элементов управления в разных версиях Outlook Express теоретически могут не совпадать. Хуже того - скрипт может работать, но работать неправильно, производя непредсказуемые действия (посылая команды не тем пунктам меню, нажимая не на те кнопки и т.д.). Поэтому при написании подобных скриптов вам придётся самостоятельно определять идентификаторы элементов управления и классы окон для своих приложений (приложений, которые вы хотите автоматизировать). К счастью, сделать это не так уж и сложно.

Для того, чтобы найти идентификаторы нужных элементов управления, можно воспользоваться программой "Winspector", которая скачивается с сайта http://www.windows-spy.com/ (эта программа распространяется свободно).

Чтобы найти идентификатор ресурса нужной команды меню (для третьей строки вышеприведённого скрипта) и кнопки (для шестой строки того же скрипта), после установки Winspector проделайте следующее:

  1. Запустите Outlook Express и откройте окно нового сообщения.
  2. Запустите Winspector.
  3. Перетащите "мишень" из окна Winspector'а "Window list" на строку заголовка окна нового сообщения Outlook Express. Соответствующая окну нового сообщения Outlook Express строка в окне Winspector'а "Window list" окажется выделенной. Откройте окно сообщений для этой строки, воспользовавшись командой контекстного меню "Messages...".
  4. Отредактируйте фильтр сообщений в открывшемся окне "Messages", воспользовавшись командой контекстного меню "Edit message filter...". В списке справа должно остаться только сообщение "WM_COMMAND" (оно нас и будет интересовать), в списке слева - все остальные сообщения.
  5. В окне нового сообщения Outlook Express выполните команду меню "Вставка" - "Вложение файла..." так, чтобы открылось окно выбора файла "Вставка".
  6. В окне Winspector'а "Messages" раскройте последнее сообщение "WM_COMMAND". Вы найдёте там ControlID нужной команды меню: 40237.
  7. В окне выбора файла "Вставка" выберите одинарным щелчком какой-нибудь файл (например, "c:\boot.ini") так, чтобы его имя попало в поле "Имя файла". Перетащите "мишень" из окна Winspector'а "Window list" на строку заголовка окна выбора файла "Вставка". Соответствующая окну выбора файла строка в окне Winspector'а "Window list" окажется выделенной. Откройте окно сообщений для этой строки, воспользовавшись командой контекстного меню "Messages...".
  8. Отредактируйте фильтр сообщений в открывшемся окне "Messages", воспользовавшись командой контекстного меню "Edit message filter...". В списке справа должно остаться только сообщение "WM_COMMAND" (оно нас и будет интересовать), в списке слева - все остальные сообщения.
  9. В окне выбора файла "Вставка" нажмите кнопку "Вложить".
  10. В окне Winspector'а "Messages" раскройте последнее сообщение "WM_COMMAND". Вы найдёте там ControlID нужной кнопки: 1 (код сообщения - BN_CLICKED).

Чтобы найти класс окна поля ввода "Имя файла" (в вышеприведённом скрипте - "Edit1"), можно воспользоваться программой AU3_Spy.exe, которая поставляется вместе с AutoHotkey. Проделайте следующее:

Таким образом, вся необходимая информация для написания скрипта была получена. Естественно, вышеописанные методы получения информации могут быть использованы не только для автоматизации Outlook Express, но и для автоматизации других приложений. Подробную справку по синтаксису методов PostMessage, ControlSetText и других вы можете получить в справочном файле AutoHotkey.

Наверное, подготовить таким способом к отправке письмо в Outlook Express можно было бы и с использованием только стандартных методов Windows Script Host (методом SendKeys, т.е. эмулируя нажатия клавиш). Однако, случайная потеря фокуса у нужного окна при использовании эмуляции нажатий клавиш могла бы привести к большим неприятностям. Преимущество же вышеописанного метода автоматизации состоит в его относительной безопасности в этом плане.

Ещё один пример автоматизации: скрипт, приведённый ниже, позволяет приостанавливать/запускать воспроизведение музыки в Windows Media Player, а также "шагами" уменьшать/увеличивать громкость. Скрипт написан для Windows Media Player 9.00.00.3250 с помощью тех же приёмов, которые уже применялись выше. Нажатие Ctrl+Alt+Space устанавливает/снимает паузу, нажатие Ctrl+Alt+NumpadSub (минус) уменьшает громкость на "шаг", нажатие Ctrl+Alt+NumpadAdd (плюс) увеличивает громкость на "шаг". Будучи запущенным, скрипт ожидает нажатий указанных клавиш и никогда не завершает свою работу автоматически (постоянно находится в памяти компьютера). Удобство применения этого скрипта в том, что для регулировки громкости и установки/снятия паузы вам не нужно переключаться в Windows Media Player (делать его окно активным), а можно выполнять эти действия прямо "на ходу", работая в других приложениях.

^!Space:: ;ПАУЗА/ВОСПРОИЗВЕДЕНИЕ
IfWinExist, Проигрыватель Windows Media
{
	PostMessage, 0x111, 18808, 0, , Проигрыватель Windows Media
	return
}
;====================================================================
^!NumpadSub:: ;ТИШЕ
IfWinExist, Проигрыватель Windows Media
{
	PostMessage, 0x111, 18816, 0, , Проигрыватель Windows Media
	return
}
;====================================================================
^!NumpadAdd:: ;ГРОМЧЕ
IfWinExist, Проигрыватель Windows Media
{
	PostMessage, 0x111, 18815, 0, , Проигрыватель Windows Media
	return
}

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

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