Heyho,
mein Programm muss in der Lage sein, Tastendrucke egal in welchem Programm abzufangen & entsprechend darauf zu reagieren.
Dazu benutze ich folgende Prozeduren (habe ich vor ner Weile mal irgendwo gefunden, weiß die Quelle leider gerade nicht mehr, scheint aber was relativ häufig verwendetes zu sein):
Delphi-Quellcode:
procedure TMainForm.FormCreate(Sender: TObject);
begin
// ...
InstallHook(
Handle);
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
// ...
UninstallHook;
end;
function InstallHook(Hwnd: Cardinal): Boolean;
stdcall;
begin
Result := False;
if HookHandle = 0
then
begin
HookHandle := SetWindowsHookEx(13, LowLevelKeyboardProc, 0, 0);
WindowHandle := Hwnd;
Result := HookHandle <> 0;
end;
end;
function UninstallHook: Boolean;
stdcall;
begin
Result := UnhookWindowsHookEx(HookHandle);
HookHandle := 0;
end;
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;
// meine Anweisungen
end;
Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
end;
Das ganze funktioniert am Anfang soweit auch. Allerdings habe ich das Problem, dass es das irgendwann einfach nicht mehr tut. Keine Ahnung womit das zusammenhängt. Ich hab das Gefühl, das es eher auftritt wenn das Programm schon ne ganze Weile läuft, es könnte aber genauso gut irgendwas anderes der Auslöser sein.
Also, kann sich irgendwer von euch ein Szenario vorstellen, in dem diese ganze Konstruktion, obwohl sie vorher einwandfrei funktioniert hat, einfach nichts mehr macht (LowLevelKeyboardProc wird nicht mehr aufgerufen) ? Am versehentlichen Aufrufen des Uninstalls kanns nicht liegen, das steht wirklich nur im OnDestroy. Wenn ich, nachdem es nicht mehr geht, allerdings einfach Uninstall und Install hintereinander aufrufe gehts übrigens wieder.
Seltsam ...