Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Komplettlösung für globalen Keyboard-Hook (https://www.delphipraxis.net/120622-komplettloesung-fuer-globalen-keyboard-hook.html)

FAlter 13. Sep 2008 20:31


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:
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:

Delphi-Quellcode:
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. :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

Laufi 13. Sep 2008 22:17

Re: Komplettlösung für globalen Keyboard-Hook
 
Hallo!

Zitat:

Zitat von FAlter
Auch wenn ihr noch so gerne das E-Mail-Passwort eurer Freundin wissen wollt, um herauszufinden, mit wem sie fremdgeht. :stupid:

Schade dass das offenbar der grund ist warum du den hook gemacht hast :(

Liebe Grüsse
Laufi

toms 14. Sep 2008 09:53

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?

Apollonius 14. Sep 2008 13:17

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.

alzaimar 14. Sep 2008 13:41

Re: Komplettlösung für globalen Keyboard-Hook
 
Get 'RegisterHotKey' nicht?

FAlter 1. Okt 2008 19:07

Re: Komplettlösung für globalen Keyboard-Hook
 
Hi,

Zitat:

Zitat von Apollonius
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.

das wären meine Gedanken für die nächste Version gewesen, aber über die Umsetzung hab ich noch nachgedacht. Danke für den 4KiB-Tipp. :)

Zitat:

Zitat von Laufi
Schade dass das offenbar der grund ist warum du den hook gemacht hast

Ähm nein, das war es nicht. Ich habe nicht einmal eine Freundin, und wenn ich eine hätte, würde ich sie sicher nicht wegen so einer besch[eid]enen DLL verlieren wollen. Außerdem läuft das Programm bisher nur auf meinem PC, wenn ich loggen würde, würde ich ja nur mich selbst mitloggen, denn jemand anderen lass ich gar nicht rauf. (OK, bei ner Freundin gäbe es vielleicht eine Ausnahme.)

Zitat:

Zitat von alzaimar
Get 'RegisterHotKey' nicht?

Ich habe es nicht probiert :oops: aber ich denke nein, da ich auf die Drucktaste reagieren möchte (VK_SNAPSHOT). Dabei soll die Systemfunktion (Screenshot erstellen) jedoch erhalten bleiben, ich möchte nur eine Zusatzfunktion anbieten, bzw. selbst haben, die eben mit dieser Taste bzw. dem Screenshot zusammenhängt und wozu mein Programm auf den Tastendruck reagieren muss. Zukünftig soll noch mehr passieren, also auch die Auswertung anderer Tasten oder bestimmter Tastenfolgen (Roll Druck Roll oder so - die Tasten liegen ja nebeneinander und Rollen wird meist gar nicht verwendet). Und ob Tastenfolgen noch über Hotkeys gehen?

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

Medium 1. Okt 2008 23:43

Re: Komplettlösung für globalen Keyboard-Hook
 
Wer daran interessiert ist, wie eine solche DLL im Klartext aussehen kann, der könnte hier fündig werden.
(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.)

blablab 20. Mär 2009 22:14

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 08:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz