Einzelnen Beitrag anzeigen

G-Baumstamm

Registriert seit: 9. Jan 2010
63 Beiträge
 
Delphi 7 Enterprise
 
#1

Global Keyboard Hook

  Alt 9. Jun 2012, 12:30
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 ...
Daniel NR
  Mit Zitat antworten Zitat