Чтение онлайн

на главную - закладки

Жанры

Шрифт:
...

Листинг 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 := True;

end

else

begin

//С Scroll Lock на Caps Lock

PressKey(VK_CAPITAL);

PressKey(VK_SCROLL);

curScroll := False;

curCaps := True;

end;

end;

Поделиться:
Популярные книги

Дневник

Гомбрович Витольд
Проза:
современная проза
5.00
рейтинг книги
Дневник

Британские коммандос

Паркер Джон
Детективы:
спецслужбы
5.50
рейтинг книги
Британские коммандос

Под солнцем Сатаны. Дневник сельского священника. Новая история Мушетты. (сборник)

Бернанос Жорж
Проза:
классическая проза
5.00
рейтинг книги
Под солнцем Сатаны. Дневник сельского священника. Новая история Мушетты. (сборник)

Вечера в древности

Мейлер Норман
Проза:
классическая проза
историческая проза
5.00
рейтинг книги
Вечера в древности

Олесь Бердник

Харьковский ???
5.00
рейтинг книги
Олесь Бердник

Столица

Синклер Эптон Билл
Проза:
классическая проза
5.00
рейтинг книги
Столица

Неучтенный. Дилогия

Муравьёв Константин Николаевич
Неучтенный
Фантастика:
боевая фантастика
попаданцы
7.98
рейтинг книги
Неучтенный. Дилогия

Беглец

Бубела Олег Николаевич
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Беглец

Барон устанавливает правила

Ренгач Евгений
6. Закон сильного
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Барон устанавливает правила

Рассвет русского царства. Книга 2

Грехов Тимофей
2. Новая Русь
Фантастика:
альтернативная история
попаданцы
историческое фэнтези
5.00
рейтинг книги
Рассвет русского царства. Книга 2

Хроники Перна: Первое Падение

Маккефри Энн
2. Всадники Перна: Предыстория
Фантастика:
эпическая фантастика
9.00
рейтинг книги
Хроники Перна: Первое Падение

Пустоши

Сай Ярослав
1. Медорфенов
Фантастика:
фэнтези
попаданцы
5.40
рейтинг книги
Пустоши

А. Смолин, ведьмак. Цикл

Васильев Андрей Александрович
А. Смолин, ведьмак
Фантастика:
городское фэнтези
5.00
рейтинг книги
А. Смолин, ведьмак. Цикл

Час дракона

Зайцев Михаил Георгиевич
1. Русский ниндзя
Детективы:
боевики
8.11
рейтинг книги
Час дракона