Читаем Delphi. Трюки и эффекты полностью

В завершение рассмотрим довольно забавный пример, так же, как и предыдущий, основанный на программном нажатии клавиш 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;

...

Перейти на страницу:

Похожие книги

Забытое
Забытое

Захватывающая история Сиенны Престон продолжается во второй части головокружительной серии «Игра обмана».Семнадцатилетняя Сиенна не понаслышке знает о душевной боли и потерях. Но на этот раз всё по-другому: кто-то вмешался в воспоминания её возлюбленного, и теперь ей предстоит найти ответы.След ведёт её к сверкающим небоскрёбам и роскоши Рубекса, столицы Пасифики, где она проникает в правительственное Ведомство интеллекта и генетики. Но ответы получить не так-то просто, особенно когда её собственные воспоминания могут быть искажены. К счастью, рядом есть Зейн Райдер, готовый помочь ей сложить вместе кусочки головоломки. Его преданность и забота размывают границу между дружбой и чем-то большим.Когда Сиенна подбирается слишком близко к тёмным секретам Ведомства, её обвиняют в убийстве видного государственного деятеля, и ей приходится пуститься в бега. Как бы ни разрывалось сердце Сиенны в попытке понять, кого она любит, это всё вскоре перестаёт иметь значение — потому что единственное, что её сейчас ждёт, это смертный приговор.

Марина Козикова , Александр Степанович Грин , Марина Суржевская , Кристин Смит

Любовное фэнтези, любовно-фантастические романы / Проза / Классическая проза / Самиздат, сетевая литература / Технические науки / Любовно-фантастические романы