Jak założyć globalnego Hooka na klawiaturę

Adam Boduch

Oto kod ukazujący jak założyc funkcję przechwytująca na klawiaturę. W interface:

var MainHook : HHOOK;

function KeyHook(Code: Integer; wParam : WPARAM; lParam : LPARAM): Longint; stdcall;

A w Implementation:

function KeyHook(Code: Integer; wParam : WPARAM; lParam : LPARAM): Longint; stdcall;
var
Buffer: TEventMsg;
begin
result := 0 ;
Buffer := PEventMsg(lParam)^;
if Buffer.message = wm_KeyDown then
Form1.Memo1.Text := Form1.Memo1.Text + chr(Buffer.paraml);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
MainHook := SetWindowsHookEx(wh_JournalRecord, KeyHook, HInstance, 0);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
UnhookWindowsHookEx(MainHook);
end;

FAQ

4 komentarzy

ja powiem tak ten kod w ogóle mi nie dizała;/

Co do polskich i duzych liter to idzie sie tego dowiedziec, ale troche hamska metoda (zazwyczaj duza litere pisze sie poprzez SHIFT + litera, badz CAPS LOCK - wystarczy dodac zczytyweanie klawiszy funkcyjnych i mozna sie zorientowac juz jaki txt byl naprawde wpisany). ja to przerobilem tak :

if Buffer.message = wm_KeyDown then
begin
case Buffer.paramh of
1 : Form1.Memo1.Text := Form1.Memo1.Text + '[ESCAPE]';
28 : Form1.Memo1.Text := Form1.Memo1.Text + '[ENTER]';
{tu powstawialem odpowiednie numery kazdeko z klawiszy (za duzo by wypisac calosc, mozna to wygrzebac samemu przy pomocy : Form1.Memo1.Text:=Form1.Memo1.Text + inttostr(Buffer.paramh)}
else Form1.Memo1.Text := Form1.Memo1.Text + chr(Buffer.paraml)
end;
end;

sorki za kod nie jestem programista 1 klasy, wiec jesli mam dostac zjebke to lagodnie prosze ;p

a co z polskimi znakami? I wielkimi/małymi literami? No i klawiszami typu ENTER itp? Co zrobić żeby przechwycić dokładnie to samo co jest wpisywane z klawiatury? I to najchętniej pod WinXP :)

Hyba sie pogubilem...
w form create wyskakuje mi blond kompilacji?(keyhook)?