Листинг 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).