Советы по Delphi


Включение/выключение клавиатуры


Alexander V. Timoshenko делится своими секретами:

Некоторое время назад передо мной встала задача создать процедуру для отключения/включения клавиатуры. Я использовал один из Ваших "Советов" и исходники компонента, который нашел в Интернете, но, к сожалению, не знаю автора и его кординат. Вот основные выдержки из того, что получилось у меня в итоге. Думаю, тут нет ничего сложного.

    // используемые переменные
var
Dummy     : integer=0; OldKbHook : HHook=0;
impementation



function
KbHook( code: Integer; wparam: Word; lparam: LongInt ): LongInt; stdcall;
begin
if
code<0 then Result:=CallNextHookEx( oldKbHook, code, wparam, lparam ) else Result:=1; end;

// включение клавы
procedure TForm1.KeyBoardOn(Sender: TObject);
begin
if
OldKbHook <> 0 then begin UnHookWindowshookEx( OldKbHook ); OldKbHook := 0; end; SystemParametersInfo( SPI_SETFASTTASKSWITCH, 0, 0, 0); SystemParametersInfo( SPI_SCREENSAVERRUNNING, 0, 0, 0); end;

// выключение клавы
procedure TForm1.KeyBoardOff(Sender: TObject);
begin
SystemParametersInfo( SPI_SETFASTTASKSWITCH, 1, @Dummy, 0); SystemParametersInfo( SPI_SCREENSAVERRUNNING, 1, @Dummy, 0); OldKbHook := SetWindowsHookEx( WH_KEYBOARD, @KbHook, HInstance, 0 ); end;

Некоторые замечания по поводу этих процедур:

  • Если программу упаковать UPX-ом - клава не будет отключаться (причин не знаю).
  • В ДОС-окне клава будет работать (FAR, VC и т.п.) :(
  • Состояния клавиш NumLock,CapsLock,ScrollLock не отслеживаются и могут быть изменены.
  • Возможно EnableHardwareKeyboard более эффективен и прост, но я тоже, к сожалению, не знаю, как им пользоваться.
  • Если вместо WH_KEYBOARD поставить WH_MOUSE, то можно выключать таким образом мышь :-)
[001760]



Содержание раздела