Чтобы отслеживать события клавиатуры во всей Windows, нудно поставить ловушку (hook). Для этого нужно создать dll, в которой определить три функции: создание ловушки, обработка события нажатия на клавишу и уничтожение ловушки.
Это текст библиотеки (для ее создания выполните команду File | New, а в появившемся окне выберите dll).
library Key;
uses
WinTypes,
WinProcs,
Messages;
const
KeyEvent = WM_USER + 1;
var
HookHandle: hHook;
function KeyHook(Code: integer; WParam: word; LParam: Longint): Longint;
var
wnd: hWnd;
begin
if Code >= 0 then begin
wnd := FindWindow('TKeyForm', nil);
SendMessage(wnd, KeyEvent, wParam, lParam);
Result := 0;
end else
Result := CallNextHookEx(HookHandle, code, WParam, LParam);
end;
procedure SetKeyHook;
begin
HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyHook, HInstance, 0);
end;
procedure DelKeyHook;
begin
if HookHandle <> 0 then
UnhookWindowsHookEx(HookHandle);
end;
exports
SetKeyHook index 1,
KeyHook index 2,
DelKeyHook index 3;
begin
end.
Ниже приведен код самой программы. Очень важно назвать главное окно KeyForm – иначе ничего не будет работать.
function SetKeyHook: Longint; external 'Key' index 1;
function KeyHook: Longint; external 'Key' index 2;
function DelKeyHook: Longint; external 'Key' index 3;
procedure TKeyForm.WM_NextMSG(var Msg: TMessage);
begin
beep;
end;
procedure TKeyForm.FormCreate(Sender: TObject);
begin
hLib := LoadLibrary('Key.dll');
SetKeyHook;
end;
procedure TKeyForm.FormDestroy(Sender: TObject);
begin
DelKeyHook;
FreeLibrary(hLib);
end;
На приеме у сексопатолога:
- Доктор, мой муж импотент на все 200 процентов!
- Как так?! Ну на сто процентов я понимаю...
- Так оно и было, но вчера он запнулся и прикусил язык.