Einzelnen Beitrag anzeigen

Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.096 Beiträge
 
FreePascal / Lazarus
 
#1

Komplettlösung für globalen Keyboard-Hook

  Alt 13. Sep 2008, 21:31
Hi,

da das Problem immer wieder kommt "wie kann ich außerhalb meines Programmes auf das Drücken der XYZ-Taste reagieren" oder so ähnlich, und es dann die nächsten Probleme gibt "mein Hook funktioniert nicht außerhalb meines Programmes, obwohl es ein globaler ist, was mache ich falsch?", biete ich hier mal eine Komplettlösung an. Wer dies nicht will, findet über die SuFu (in der DP und per F1) alles über Hooks und was man da falsch machen kann - und wie mans richtig macht.

Ich biete euch hiermit meine Komplettlösung an, eine DLL, die ich für ein eigenes kleines Programm geschrieben habe, um auf die Druck-Taste zu reagieren. Ihr müsst lediglich noch die Auswertung der Eingaben vornehmen, das kann ich euch leider nicht abnehmen, da ich euer Problem nicht kenne.

Also, ihr packt die DLL aus dem Anhang in euer Programmverzeichnis. Dann fügt ihe irgendwo ganz oben in eurer Unit, noch vor der Deklaration eures Formulars, folgendes ein:

Delphi-Quellcode:
const
  WM_HookCallback = WM_USER + 234;
Die 234 ist eher zufällig entstanden. Wichtig ist, dass eure Message größer ist als WM_USER.


Dann geht ihr in die Deklaration eures Formulars und fügt unter private folgendes ein:

procedure HookCallback(var Message: TMessage); message WM_HookCallback; Außerdem müsst ihr natürlich die DLL einbinden:

Delphi-Quellcode:
const
  FASPHook = 'FASPHook';

function SetHook(Window: HWND; Callback: LongWord): Boolean; stdcall;
external FASPHook;

function RemoveHook: Boolean; stdcall;
external FASPHook;
Und ihr braucht das hier:

Delphi-Quellcode:
procedure TNameEuresFormulares.HookCallback(var Message: TMessage);
begin
  //Hier müsst ihr dann prüfen, ob die richtige Taste gedrückt/losgelassen wurde
  //in wParam steht der VK-Code
  //in lParam alle möglichen Infos über den Tastendruck
  //genaueres im MSDN
end;
MSDN-Link:
http://msdn.microsoft.com/de-de/libr...us,VS.85).aspx

Die Parameter lParam, wParam und der Rückgabewert (Result) befinden sich im Parameter Msg, welcher ein Record ist. Um die Verarbeitung von Code müsst ihr euch nicht kümmern, das übernimmt die DLL für euch. Ihr müsst also kein CallNextHookEx aufrufen.

Über SetHook, wo ihr das Handle eures Formulares sowie die WM_HookCallback übergibt, könnt ihr den Hook nun starten. RemoveHook entfernt ihn wieder. Es wird jeweils false bei Fehlern zurückgegeben, ansonsten irgendein True.

Beispiel:

Delphi-Quellcode:
//im OnCreate
  if not SetHook(Handle, WM_HookCallback) then
  begin
    ShowMessage(StrKbdHookStartError);
    Application.ShowMainForm := false;
    Application.Terminate;
    exit;
  end;

//im OnDestroy
  RemoveHook;
Viel Spaß noch mit der DLL. Ihr dürft sie in euren Freeware-Programmen nutzen. Gebt dann bitte meinen Namen und den Link zu http://faltersoft.de/ in den Credits an.

Was ihr nicht dürft, ist, die Tastatureingaben fremder Leute mitzuprotokollieren. Darauf möchte ich noch einmal hinweisen. Auch wenn ihr noch so gerne das E-Mail-Passwort eurer Freundin wissen wollt, um herauszufinden, mit wem sie fremdgeht.

Source gibts in der DP, wenn ihr die SuFu nutzt. Ich weiß noch nicht genau, was ich mit dem Programm vorhabe, also werde ich es ohne Source veröffentlichen. Wie gesagt, wer suchet, der findet.

Mfg
FAlter
Angehängte Dateien
Dateityp: zip fasphook_478.zip (10,8 KB, 88x aufgerufen)
Felix Alter
  Mit Zitat antworten Zitat