Autor Beitrag
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 18.02.08 21:37 
Hallo, liebe Delphi-Gemeinde!

Zur Zeit beschäftige ich mich mit Hooks und komme damit so schlecht und recht voran.

Gelernt habe ich schon/inzwischen, daß unter den NT-Betriebsprogrammen solche Hooks in eine(r) DLL-Datei auszulagern sind. Nur unter Win9x (und vorher) ist nur eine Exe-Datei möglich, was ich recht gut unter entwickler-forum.de/...dex.php/t-36595.html beschrieben fand.

Nun wird von der PC-Welt jedoch ein Tool angeboten, das da pcwhoverwheel heißt und unter www.pcwelt.de/downlo..._tools/tools/139375/ beschrieben wird, Download unter www.pcwelt.de/index....44&vc=1&ty=1 oder alternativ unter pcwelt-praxis.de/dow.../at_download/release.

Es besteht nur aus einer (einzigen) Exe-Datei und fängt eindeutig systemweit von der Maus (konkret: dem Mausrad) verursachte Botschaften (oder, hardwarseitig, Hardware-Interrupts?!) ab. Diese werden an das (nicht zwangsläufig aktive!) Fenster weitergeleitet, über dem sich just der Mauscursor befindet.

Natürlich funktioniert das Programm auch (und, falls ich mich recht entsinne, nur) unter einem NT-Betriebsprogramm (bei mir zur Zeit Windows 2000).

Kann (sich) das jemand erklären?

Vielen Dank im voraus für Eure Antworten!

Delphi-Laie


Zuletzt bearbeitet von Delphi-Laie am Mi 20.02.08 13:37, insgesamt 2-mal bearbeitet
Assarbad
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 20.02.08 01:59 
Für eine detaillierte Analyse (des Quelltextes!) fehlt mir derzeit einfach die (Frei)Zeit, daher hier nur ein Abriß.

An verschiedenen Stellen im Code werden mindestens Hooks der Typen 1 (WH_JOURNALPLAYBACK), 13 (WH_KEYBOARD_LL, daher nur NT) und 14 (WH_MOUSE_LL, ebenfalls nur NT) gesetzt.

Es handelt sich entweder um einen Build oder eine abgespeckte Version von www.autohotkey.com/download/ - mit ein wenig C++-Kenntnissen, kannst du also des Rätsels Lösung selbst finden. Herausgefunden habe ich das durch ein wenig Reverse-Engineering (vielleicht 30 min). Natürlich bin ich zu faul weiter im Disassemblat zu wühlen, wenn der Quelltext vorhanden ist.

Übrigens sagt MS:
Zitat:
The LowLevelKeyboardProc hook procedure is an application-defined or library-defined callback function used with the SetWindowsHookEx function. The system calls this function every time a new keyboard input event is about to be posted into a thread input queue. The keyboard input can come from the local keyboard driver or from calls to the keybd_event function. If the input comes from a call to keybd_event, the input was "injected". However, the WH_KEYBOARD_LL hook is not injected into another process. Instead, the context switches back to the process that installed the hook and it is called in its original context. Then the context switches back to the application that generated the event.


Scheint so, als müsse wirklich mal eine neue Version der Tutorials her ;)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 20.02.08 07:08 
Ich habe den Quelltext mal überflogen, der ist ja sehr sehr gut kommentiert, es sollte also möglich sein, den nachzuvollziehen, ich denke auch ohne besondere C++-Kenntnisse. ;-)

Der Code, der sich um die Hooks kümmert, steht in der Datei hook.cpp. Was gemacht wird, ist, einen neuen Thread zu erzeugen (dessen Quelltext findet sich in HookThreadProc ab Zeile 4263). Dieser Thread bekommt über Windows Messages mitgeteilt, was er mit den Hooks anstellen soll (setzen / löschen).

Die andere interessante Funktion ist AddRemoveHooks (Zeile 4003), die dafür sorgt, dass, wenn gerade kein Hook aktiv ist, ein neuer Thread zur Steuerung erstellt wird und diesem dann die entsprechenden Befehlt gibt.
Die Initialisierung der notwendigen Variablen geschieht in ChangeHookState (Zeile 3518), die AddRemoveHooks aufruft.

Die Callback-Funktionen, die aufgerufen werden, sind LowLevelKeybdProc (Zeile 158) und LowLevelMouseProc (Zeile 289).

Ich habe mir den Code jetzt nur ein paar Minuten angesehen, aber ich glaube, ich habe einigermaßen verstanden wie das ganze funktioniert. Eigentlich müsste das ganze genauso in Delphi umsetzbar sein, allerdings fehlt mir ebenfalls die Zeit, das einfach mal auszuprobieren.
Ich hoffe aber die Hinweise zum Quelltext stimmen und helfen ;-).
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mi 20.02.08 13:30 
Hallo Ihr beiden, besten Dank für Eure Antworten, und insbesondere an Dich, Assarbad, daß Du auf diese Weise auf meine E-Mail reagiert und damit den Stein ins Rollen gebracht hast!

Ich will Euch auch gar nicht länger strapazieren, einen C(++/#)-Quelltext kann ich auch selbst durcharbeiten, auch wenn es mühsam ist (aber das ist ja die gesamte Programmiererei). Nur bin ich vielleicht irgendwie zu ungeschickt, etwas aufzuspüren. Ihr sprecht beide von einem Quelltext. Von diesem Mouse-Wheel-Programm? Wo kann man den den herbeziehen?

Vielen Dank noch einmal!

Netter Gruß

Delphi-Laie


Zuletzt bearbeitet von Delphi-Laie am Mi 20.02.08 13:40, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 20.02.08 13:32 
Auf der von user profile iconAssarbad verlinkten Seite steht u.a. "Source Code (C++) (982 KB, self-extracting RAR)" ;-).
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mi 20.02.08 13:39 
Ach so, es ging um den Autohotkey.

Vielen Dank an Euch beide und weiterhin viel Spaß beim Programmieren auch und gerade mit Delphi wünscht Euch

Der Delphi-Laie