AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Komplettlösung für globalen Keyboard-Hook

Komplettlösung für globalen Keyboard-Hook

Ein Thema von FAlter · begonnen am 13. Sep 2008 · letzter Beitrag vom 20. Mär 2009
Antwort Antwort
Benutzerbild von FAlter
FAlter
Registriert seit: 21. Jul 2004
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, 86x aufgerufen)
 
Laufi
 
#2
  Alt 13. Sep 2008, 22:17
Hallo!

Zitat von FAlter:
Auch wenn ihr noch so gerne das E-Mail-Passwort eurer Freundin wissen wollt, um herauszufinden, mit wem sie fremdgeht.
Schade dass das offenbar der grund ist warum du den hook gemacht hast

Liebe Grüsse
Laufi
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms

 
Delphi XE Professional
 
#3
  Alt 14. Sep 2008, 09:53
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?
Thomas
  Mit Zitat antworten Zitat
Apollonius

 
Turbo Delphi für Win32
 
#4
  Alt 14. Sep 2008, 13:17
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.
  Mit Zitat antworten Zitat
alzaimar

 
Delphi 2007 Enterprise
 
#5
  Alt 14. Sep 2008, 13:41
Get 'RegisterHotKey' nicht?
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

 
Delphi 10.2 Tokyo Starter
 
#6
  Alt 1. Okt 2008, 19:07
Hi,

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 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 von alzaimar:
Get 'RegisterHotKey' nicht?
Ich habe es nicht probiert 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
Felix Alter
  Mit Zitat antworten Zitat
Medium

 
Delphi 2007 Enterprise
 
#7
  Alt 1. Okt 2008, 23:43
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.)
  Mit Zitat antworten Zitat
blablab

 
Delphi 7 Enterprise
 
#8
  Alt 20. Mär 2009, 22:14
Danke FAlter!

Würde mich übrigens über den Source der dll sehr freun...
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:17 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