...
type
tagKBDLLHOOKSTRUCT = record
vkCode: DWORD;
scanCode: DWORD;
flags: DWORD;
time: DWORD;
dwExtraInfo: DWORD;
end;
TKbDllHookStruct = tagKBDLLHOOKSTRUCT;
PKbDllHookStruct = ^TKbDllHookStruct;
...
Const
WH_KEYBOARD_LL = 13;
var
hkeyhook: HHOOK;
...
function KeyEvent(code: integer; wParam: word; lParam: longword): longword; stdcall;
var
szKeyName: array[0..255] of Char;
hooked: TKbDllHookStruct;
dwMsg: DWORD;
i: integer;
AltPressed : Boolean;
Key : String;
begin
if ( (code = HC_ACTION) and ( (wParam = WM_SYSKEYDOWN) or (wParam = WM_KEYDOWN) ) ) then begin
CopyMemory(@hooked,Pointer(lParam),sizeof(TKbDllHookStruct));
dwMsg := 1;
dwMsg := dwMsg + (hooked.scanCode shl 16);
dwMsg := dwMsg + (hooked.flags shl 24);
AltPressed := dwMsg And (1 shl 29) <> 0;
ZeroMemory(@szKeyName,sizeof(szKeyName));
szKeyName[0] := '[';
i := GetKeyNameText(dwMsg, szKeyName+1, sizeof(szKeyName))+1;
szKeyName[i] := ']';
Key := szKeyName;
end;
If Not ((Key = '[Tab]') And AltPressed) Then
Result := CallNextHookEx(hkeyhook,code,wParam,lParam);
end;
procedure TForm1.FormShow(Sender: TObject);
begin
hkeyhook := SetWindowsHookEx(WH_KEYBOARD_LL, @Keyevent, hinstance, 0);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnhookWindowsHookEx(hKeyHook);
end;
Konkretno ovaj kod sluzi da bi "mrak pojeo" Alt+Tab kombinaciju tastera. Kod radi savrseno, ali sam hteo da napravim od njega KeyboardHook komponentu u kojoj bi za svaki pritisnuti taster iz KeyEvent funkcije pozivao OnKeyHooked event. Tu dolazimo do problema. Ako KeyEvent ubacim unutar klase (sto moram da bih pozvao moj Event) funkcija vise ne radi (predpostavljam da SetWindowsHookEx, ne moze da poziva kao treba funkciju unutar klase, ali ovo je moja predpostavka, nisam bas u najboljim odnosima sa Win API-jem

