Прототип к варианту 10 - Имитация нажатий клавиш и событий мыши
Иногда Win32 API кажется необъятным. Но даже после того, как вы познакомитесь с основными функциями API, как объединить их для решения практических задач? В этой главе наше внимание было сосредоточено на функциях получения системной информации. На первый взгляд может показаться, что эти функции пригодны лишь для определения системных параметров и, возможно, для настройки пользовательской конфигурации. Однако среди этого изобилия спрятаны чрезвычайно мощные функции для решения трех распространенных задач: имитации нажатий клавиш, имитации перемещений мыши и сохранения экрана.
Все вместе: пример SimKeys
Пример SimKeys показывает, как системные функции, описанные в этой главе, объединяются для решения этих задач. На рис. 6.5 изображено главное окно приложения SimKeys в Windows NT. Программа также работает в Windows 95, хотя, как вы вскоре убедитесь, между реализациями для этих двух платформ существуют некоторые различия.
На форме находятся два текстовых поля. В верхнем поле выводится исходная строка, символы которой будут имитироваться программой. Функция SendKeys работает на очень низком уровне и по богатству возможностей уступает встроенной функции Visual Basic SendKeys. С другой стороны, она не подчиняется ограничениям встроенной функции, поскольку работает непосредственно с виртуальными клавишами. Нижнее текстовое поле всего лишь является удобным «приемником» для имитируемых клавиш — никакими другими функциями оно не обладает.
Рис. 6.5. Главное окно SimKeys
В графическом поле отображается содержимое буфера обмена (clipboard) после сохранения экрана. На форме имеются четыре кнопки, реализующие четыре разных операции. Все операции могут выполняться немедленно или после указанной задержки. По умолчанию в программе используется двухсекундная задержка. Это сделано для того, чтобы продемонстрировать общесистемный характер этих операций. Например, вы можете нажать кнопку MySendKeys с пятисекундной задержкой, переключиться в текстовый редактор и увидеть, как в нем появляются имитируемые символы.
Кнопка MyMouseMove имитирует операции с мышью. Курсор перемещается на кнопку Click Me и щелкает на ней. На экране появляется сообщение о щелчке. Кнопки Capture Screen и Capture Active управляют операцией сохранения экрана, которая также может выполняться с задержкой. Обратите внимание: на рис. 6.5 эти кнопки заблокированы. Дело в том, что сохранение экрана может быть довольно длительной операцией, и блокировка кнопок на время ее выполнения предотвращает новые щелчки и постановку в очередь новых команд. Кстати, рис. 6.5 был получен при помощи этой программы.
Описание проекта
Проект SimKeys состоит из двух файлов. SIMKEYS.FRM — единственная форма, используемая в программе. Файл SIMKEYS.BAS представляет собой единственный модуль программы, в нем находятся объявления констант и функций. Программа может использоваться только в 32-разрядных платформах.
Описание формы
В листинге 6.5 приведен заголовок файла SIMKEYS.FRM, описывающий расположение элементов на форме. Файл SIMKEYS.BAS содержится в листинге 6.6. Программный код формы приведен в листинге 6.7.
Листинг 6.5. SIMKEYS.FRM
Помимо констант и объявлений, перечисленных выше, файл содержит все константы из файла API32.TXT с префиксами VK_ и MOUSEEVENTF_. Эта часть была исключена из листинга для экономии места.
Функция SendAKey имитирует нажатие одной клавиши. Фактически имитация выполняется всего одной функцией keybd_event, однако функция содержит дополнительный код для определения правильных параметров. Параметр с$ представляет собой ASCII-символ, поэтому первым шагом должно стать определение кода виртуальной клавиши для заданного символа. Эта задача решается функцией VkKeyScan. Кроме того, для вызова функции keybd_event также необходим аппаратный скан-код символа. Его можно получить при помощи функции CharToOem (определяющей код символа OEM) с последующим вызовом функции OemKeyScan, определяющей аппаратный скан-код. Операцию можно выполнить и за один шаг при помощи функции MapVirtualKey — этот прием рассматривается ниже.
Чтобы имитировать клавишу, необходимо вызвать функцию keybd_event дважды: для нажатия и для отпускания.
Во всех событиях клавиатуры, генерируемых этой функцией, используются символы нижнего регистра. Определение состояния клавиш Shift и Control и их имитация остаются читателю в качестве упражнения. В приведенной ниже функции сохранения экрана показано, как имитируется нажатие клавиши Alt — эта методика легко распространяется на клавиши Shift и Control.
Следующая функция MySendKeys просто перебирает символы строки и вызывает для каждого символа функцию SendAKey.
Листинг 6.7. SIMKEYS.FRM
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.