данный момент нажата;

• если установлен младший бит, то функция, закрепленная за этой клавишей (например, Caps Lock), включена.

Для индексации массива можно использовать ASCII-коды символов, а также константы, соответствующие несимвольным клавишам (обозначения и коды для таких клавиш приводятся в приложении 1).

Каждой контролируемой клавише (листинг 3.17) соответствует кнопка на форме. Для принудительной установки кнопки в нажатое или ненажатое состояние используется посылка сообщения BMSETSTATE. Пример определения состояния клавиш в некоторый момент времени показан на рис. 3.3.

Рис. 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).

...

Листинг 3.23.

Запуск и остановка огней

var

initCaps, initNum, initScroll: Boolean; //Первоначальные

//состояния клавиш

curCaps, curNum, curScroll: Boolean; //Текущие состояния

//клавиш

procedure TForm1.cmbStartClick(Sender: TObject);

begin

if cmbStart.Caption = 'Старт' then

begin

//Сохраняем первоначальные состояния клавиш

initCaps := (GetKeyState(VK_CAPITAL) and 1) <> 0;

initNum := (GetKeyState(VK_NUMLOCK) and 1) <> 0;

initScroll := (GetKeyState (VK_SCROLL) and 1) <> 0;

//Включаем только Caps Lock

if not initCaps then PressKey (VK_CAPITAL);

curCaps := True;

if initNum then PressKey(VK_NUMLOCK);

curNum := False;

if initScroll then PressKey(VK_SCROLL);

curScroll := False;

//Запускаем «бегущие огни»

Timer1.Interval := StrToInt(txtInterval.Text);

Timer1.Enabled := True;

cmbStart.Caption := 'Стоп

end

else

begin

//Останавливаем «бегущие огни»

Timer1.Enabled := False;

cmbStart.Caption := 'Старт

//Восстанавливаем первоначальные состояния клавиш

if initCaps <> curCaps then PressKey(VK_CAPITAL);

if initNum <> curNum then PressKey(VK_NUMLOCK);

if initScroll <> curScroll then PressKey(VK_SCROLL);

end;

end;

В начале листинга 3.23 приведены используемые глобальные переменные:

• initCaps, initNum, initScroll – для сохранения первоначального состояния клавиш Caps Lock, Num Lock и Scroll Lock с целью его восстановления при остановке огней, чтобы не раздражаться необходимостью вручную устанавливать состояния этих клавиш;

• curCaps, curNum, curScroll – для быстрого определения текущего состояния клавиш (вместо постоянного обращения к функциям типа GetKeyboardState).

Перемещение огней происходит при каждом срабатывании таймера Timer1 (листинг 3.24).

...

Листинг 3.24.

Перемещение огней

procedure TForm1.Timer1Timer(Sender: TObject);

begin

//Изменяем состояние лампочек на клавиатуре

if curCaps then

begin

//С Caps Lock на Num Lock

PressKey(VK_NUMLOCK);

PressKey (VK_CAPITAL);

curCaps := False;

curNum := True;

end

else if curNum then

begin

//С Num Lock на Scroll Lock

PressKey(VK_SCROLL);

PressKey (VK_NUMLOCK);

curNum := False;

curScroll :=

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату