Рис. 3.3. Состояние некоторых клавиш клавиатуры
Интересно, что рассмотренный способ работы с клавиатурой можно использовать даже для определения неисправных клавиш на клавиатуре, например, как это сделано в одной из программ пакета Norton Utilities.
Имитация нажатия клавиш
Состояние клавиш на клавиатуре можно не только определять, его также можно программно изменять. Рассмотрим один из способов программного нажатия клавиш, который крайне прост благодаря наличию API-функции keybdevent, как раз и предназначенной для имитации клавиатурного ввода.
Назначения параметров этой функции поясним на примере (листинг 3.18).
...
Листинг 3.18.
Показываем меню Пуск
procedure TForm1.cmbStartClick(Sender: TObject);
begin
//Имитируем нажатие клавиши Windows
keybd_event(VK_LWIN, 0, 0, 0);
//Имитируем отпускание клавиши Windows
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);
end;
Нас интересуют, прежде всего, первый и третий параметры функции keybdevent (второй не используется, а третий предназначен для установки дополнительной информации, относящейся к нажатию клавиши). Первым параметром функции передается код «нажимаемой» или «отпускаемой» клавиши. Третий параметр равен нулю при «нажатии» и константе KEYEVENTF_KEYUP при «отпускании» клавиши.
...
Внимание!
При использовании keybd_event главное – не забывать «отпускать» программно нажатые клавиши (как это делается в приведенных здесь примерах). Иначе есть риск изрядных «г люков» клавиатурного ввода.
Аналогичный приведенному в листинге 3.18 пример программного нажатия клавиши Print Screen (снятия копии экрана) приводится в листинге 3.19.
...
Листинг 3.19.
Снятие копии экрана
procedure TForm1.cmbPrintScreenClick(Sender: TObject);
begin
//Нажимаем Print Screen
keybd_event(VK_SNAPSHOT, 0, 0, 0);
keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0);
end;
В листинге 3.20 приводится пример нажатия комбинации из нескольких клавиш (Windows+M для сворачивания всех окон).
...
Листинг 3.20.
Сворачивание всех окон
procedure TForm1.cmbMinimizeAllClick(Sender: TObject);
begin
//Нажимаем Windows+M
keybd_event(VK_LWIN, 0, 0, 0);
keybd_event(Byte(\'M\'), 0, 0, 0);
keybd_event(Byte(\'M\'), 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);
end;
Добавление к этой комбинации клавиши Shift приведет к восстановлению первоначального состояния окон.
Последний пример иллюстрирует, как можно использовать программное нажатие клавиш для ускорения быстрого доступа к программам. Имеется в виду программное нажатие сочетаний клавиш, ассоциированных с ярлыками, расположенными на Рабочем столе или находящимися в меню Пуск. Допустим, на компьютере используется сочетание клавиш Ctrl+Alt+Eдля запуска Internet Explorer. Пример программного нажатия этой комбинации клавиш приведен в листинге 3.21.
...
Листинг 3.21.
Быстрый запуск программы
procedure TForm1.cmbEIxplorerClick(Sender: TObject);
begin
//Нажимаем комбинацию Ctrl+Alt+E
keybd_event(VK_CONTROL, 0, 0, 0);
keybd_event(VK_MENU, 0, 0, 0);
keybd_event(Byte(\'E\'), 0, 0, 0);
keybd_event(Byte(\'E\'), 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
end;
Последний пример особенно полезен для запуска сразу нескольких программ (для этого ярлыкам этих программ должны быть назначены сочетания клавиш).
«Бегущие огни» на клавиатуре
В завершение рассмотрим довольно забавный пример, так же, как и предыдущий, основанный на программном нажатии клавиш Caps Lock, Num Lock и ScroLL Lock. Как известно, этим клавишам соответствуют три лампочки (по крайней мере, на большинстве клавиатур). Суть примера состоит в последовательном включении/выключении упомянутых клавиш, которое автоматически сопровождается включением/выключением соответствующих лампочек.
Перед рассмотрением основных процедур примера приведем текст процедуры PressKey, которая далее используется практически на каждом шагу (листинг 3.22). Она имитирует нажатие одной клавиши с переданным кодом.
...
Листинг 3.22.
Нажатие одной клавиши
procedure PressKey(keyCode: Byte);
begin
keybd_event(keyCode, 0, 0, 0 );
keybd_event(keyCode, 0, KEYEVENTF_KEYUP, 0 );
end;
Запуск и остановка огней осуществляется при нажатии кнопки (помимо кнопки, на форме должно быть текстовое поле, в котором вводится интервал между сменой состояния огней, а также таймер со свойством Enabled, равным False) (листинг 3.23).
Читать дальше
Конец ознакомительного отрывка
Купить книгу