Hmm..
Wenn Du auf Tastendruck oder Mausbewegung reagieren willst, welche außerhalb deiner App erfolgen, dann wirst Du nicht um einen Low-Level Hook herum kommen....
In einer Schleife/Timer den letzten Tastendruck abzufragen ist unschön
Hier mal ein Schnipsel:
Delphi-Quellcode:
type
tagKBDLLHOOKSTRUCT = record
vkCode: DWORD;
scanCode: DWORD;
flags: DWORD;
time: DWORD;
dwExtraInfo: DWORD;
end;
TKbdDLLHookStruct = tagKBDLLHOOKSTRUCT;
PKbdDLLHookStruct = ^TKbdDLLHookStruct;
var
HookHandle : HHOOK;
WindowHandle : Hwnd;
function LowLevelKeyboardProc(nCode: Integer; wParam: wParam;
lParam: lParam): LRESULT; stdcall;
var vkCode: Cardinal;
begin
if (nCode >= 0) and (wParam = WM_KEYDOWN) then
begin
vkCode := PKbdDLLHookStruct(lParam)^.vkCode;
Form1.Memo1.Lines.Add('vkCode ' + IntToStr(PKbdDLLHookStruct(lParam)^.vkCode));
Form1.Memo1.Lines.Add('scanCode ' + IntToStr(PKbdDLLHookStruct(lParam)^.scanCode));
Form1.Memo1.Lines.Add('flags ' + IntToStr(PKbdDLLHookStruct(lParam)^.flags));
Form1.Memo1.Lines.Add('time ' + IntToStr(PKbdDLLHookStruct(lParam)^.time));
Form1.Memo1.Lines.Add('dwExtraInfo ' + IntToStr(PKbdDLLHookStruct(lParam)^.dwExtraInfo));
// meine Anweisungen
PostMessage(WindowHandle, WM_SYSKEYDOWN, vkCode, lParam);
end;
Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
end;
function InstallHook(Hwnd: Cardinal): Boolean;
begin
Result := False;
if HookHandle = 0 then
begin
HookHandle := SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, 0, 0);
WindowHandle := Hwnd;
Result := HookHandle <> 0;
end;
end;
function UninstallHook: Boolean;
begin
Result := UnhookWindowsHookEx(HookHandle);
HookHandle := 0;
end;