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

Материал из DRKB

Включение и выключение клавиатуры[править | править код]

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

implementation

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, то можно выключать таким образом мышь :-)


Source: http://delphiworld.narod.ru/
ID: 01532



program antiklava;
{ подключение необходимых модулей }
uses
  Windows;
{ объявление логической переменной}
var
  klava: boolean;
begin
  { устанавливаем значение переменной }
  klava := true;
  { начинаем бесконечный цикл }
  while true do
  begin
    { делаем так, чтобы всё не подвисло :)}
    Yield;
    { ничего не делаем 2 минуты }
    Sleep(2*60*1000);
    { присваиваем переменной противоположное значение }
    klava := not klava;
    { и в зависимости от переменной,
    отключаем или включаем клаву с мышкой}
    EnableHardwareInput(klava);
  end;
end.


Source: http://delphiworld.narod.ru/
ID: 01533



Вот недокументированная функция из User32.dll, которая блокирует ввод (мышь, клавиатуру кроме Ctrl+Alt+Del). При нажатии Ctrl+Alt+Del все разблокируется :-(


procedure BlockInput; external 'user32.dll';

Передаем параметры в стек вручную через push, иначе что-то глючит:

1 - заблокировать
0 - разблокировать


procedure Block;
asm
  push 1
  call BlockInput
end;

procedure UnBlock;
asm
  push 0
  call BlockInput
end;


ID: 01534