...
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 . Ako jos dodam da se poziva Event, windows se tako lepo srusi da to odavno nisam video Zna li neko kako se ovo moze izvesti? Procitah negde na net-u da bih za ove stvari funkciju KeyEvent trebao da strpam u DLL ali ne mogu vise da nadjem to na net-u. Ako je ovo tacno, zna li neko kako bi to trebalo otprilike da izgleda, i kako bih uopste iz DLL-a pozivao moj Event?