![]() |
Komplettlösung für globalen Keyboard-Hook
Liste der Anhänge anzeigen (Anzahl: 1)
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:
Die 234 ist eher zufällig entstanden. Wichtig ist, dass eure Message größer ist als WM_USER.
const
WM_HookCallback = WM_USER + 234; Dann geht ihr in die Deklaration eures Formulars und fügt unter private folgendes ein:
Delphi-Quellcode:
Außerdem müsst ihr natürlich die DLL einbinden:
procedure HookCallback(var Message: TMessage); message WM_HookCallback;
Delphi-Quellcode:
Und ihr braucht das hier:
const
FASPHook = 'FASPHook'; function SetHook(Window: HWND; Callback: LongWord): Boolean; stdcall; external FASPHook; function RemoveHook: Boolean; stdcall; external FASPHook;
Delphi-Quellcode:
MSDN-Link:
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; ![]() 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:
Viel Spaß noch mit der DLL. Ihr dürft sie in euren Freeware-Programmen nutzen. Gebt dann bitte meinen Namen und den Link zu
//im OnCreate
if not SetHook(Handle, WM_HookCallback) then begin ShowMessage(StrKbdHookStartError); Application.ShowMainForm := false; Application.Terminate; exit; end; //im OnDestroy RemoveHook; ![]() 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. :stupid: 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 |
Re: Komplettlösung für globalen Keyboard-Hook
Hallo!
Zitat:
Liebe Grüsse Laufi |
Re: Komplettlösung für globalen Keyboard-Hook
Hallo Felix
Ehrlich gesagt würde ich kaum einen Hook verwenden, bei welchem ich nicht hinter die Kulisse schauen kann. (d.h keine Sourcen vorhanden). Denn es gibt im Netz genügend Hooks + Sourcen. Denn wie kann ich so beurteilen, wie "gut" der Hook programmiert ist? |
Re: Komplettlösung für globalen Keyboard-Hook
Recht unpraktisch ist außerdem, dass nicht zwei Programme die DLL nutzen können, weil du lediglich eine MMF mit dem Namen 'FASP_HookRecMemBlock' hast, deren Daten überschrieben werden, wenn ein zweites Programm SetHook aufruft.
Zur Lösung könntest du einfach deine MMF von 12 Byte auf 4096 Byte (Page-Größe) vergrößern. Das kostet keine System-Ressourcen und du könntest dann eine Liste von Callbacks erstellen, die in der Hook-Prozedur aufgerufen werden. Du musst dann natürlich aufpassen, dass das ganze threadsicher ist. |
Re: Komplettlösung für globalen Keyboard-Hook
Get 'RegisterHotKey' nicht?
|
Re: Komplettlösung für globalen Keyboard-Hook
Hi,
Zitat:
Zitat:
Zitat:
Den Source gibts vielleicht später mal, dann wird die DLL aber unabhängig vom Programm entwickelt, vorerst jedenfalls nicht, solange es ein großes Projekt ist. Mfg FAlter |
Re: Komplettlösung für globalen Keyboard-Hook
Wer daran interessiert ist, wie eine solche DLL im Klartext aussehen kann, der könnte
![]() (Ich hab die Antwort von Corpsman darin erst jetzt gesehen... Ich werd die Host-pas noch mal bauen und hochladen, die hab ich nämlich vorm Packen des Archivs wohl aus Versehen gelöscht :?. Daher: Dauert n Tag bis 2, aber der DLL Code ist davon ja völlig unberührt.) |
Re: Komplettlösung für globalen Keyboard-Hook
Danke FAlter! :thumb:
Würde mich übrigens über den Source der dll sehr freun... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz