![]() |
In Hook auslösender Prozess ermitteln
Hallo zusammen
Habe vermutlich wieder mal eine nasse Zündschnur. Ich habe ein Programm mit einer zugehörigen DLL. In der DLL hängt ein globaler Tastatur-Hook zum Abfangen einer Tastenkombination für eine Alarmmeldung. Das funktioniert alles bestens. Nun möchte ich aber noch gerne wissen, in welchem Prozess die Tastenkombination ausgelöst wurde. Kann ja irgend ein Programm sein. So im Stil von mProc := GetCurrentProcessID; Nur das geht natürlich nicht. Wenn ich das in die DLL einbaue, bekomme ich die PID meines eigenen Programms zurück und nicht diejenige, in welchem der Benutzer die Tastenkombination gedrückt hat. Gibt es irgend eine Möglichkeit, die PID herauszufinden, aus der in die DLL/den Hook gesprungen wurde? |
AW: In Hook auslösender Prozess ermitteln
Ich befürchte, dass du die Taste abfängst, bevor sie das jeweilige Programm erreicht, aber mit folgendem könntest du das aktive Programm (Fenster) ermitteln:
Delphi-Quellcode:
var
tid: Cardinal; hw: HWND; begin hw := GetForegroundWindow; tid := GetWindowThreadProcessID(hw, nil); |
AW: In Hook auslösender Prozess ermitteln
Bekommst du beim InstallHook nicht das Window geliefert, wo der Hook drangehängt wird?
Dort einfach das Fenster, bzw. die Fenster oder gleich die Prozess-ID merken. Beim Fenster dann über GetWindowThreadProcessId. |
AW: In Hook auslösender Prozess ermitteln
Danke für Eure Antworten, aber vermutlich habe ich mich unverständlich ausgedrückt. Die DLL mit dem Hook (genauer dem Hook-Call-Back) 'hängt' an einem Programm ALARM.EXE, welches seinerseits auch noch 'versteckt' läuft. Es ist nur ein Tray-Icon sichtbar.
Nun kann der Benutzer also irgendwo eine Tastenkombination (üblicherweise PageUp-PageDown) drücken und damit einen Alarm auslösen, der dann von ALARM.EXE über TCP/IP weiter geleitet wird. Das der Hintergrund und das funktioniert auch alles problemlos. Nun kann der Benutzer aber wie gesagt die Tastenkombination in irgend einem Prozess betätigen, je nachdem, was er gerade am machen ist. Es geht sogar bei laufendem Bildschirmschoner oder mit Ctrl-Alt-Del blockiertem Rechner. So, und nun möchte ich einfach die PID wissen von dem (fremden) Prozess, der aktiv war, als der Benutzer die Tastenkombination gedrückt hat. Der Ansatz von baumina tönt irgendwie nicht schlecht. CallBack setzt man ja immer zum Schluss Result := CallNextHookEx(HookTastatur, Code, wParam, lParam); um (sofern ich das richtig verstehe), die Taste auch noch an das Programm/den Prozess weiter zu geben, wo die Eingabe erfolgt ist. Also muss ja 'irgendwo' bekannt sein, wie und wohin, aber eben... himitsu, mit dem eigenen Fenster, Handle, PID, etc. habe ich wirklich keine Probleme. |
AW: In Hook auslösender Prozess ermitteln
Du hast himitsu missverstanden. Die Datenstruktur, die du in deinem Hook Callback geliefert bekommst, enthält seiner (und meiner) Meinung nach ein Feld mit dem Fensterhandle des momentan aktiven Programmes.
Darüber kannst du an die ProcessId und somit auch an den Prozessnamen gelangen. |
AW: In Hook auslösender Prozess ermitteln
Ich hab's vermutet dass ich eine nasse Zündschnur habe, aber ich schnall's immer noch nicht. Die Struktur gemäss Microsoft
![]() Eine etwas seltsame Funktion hat der WPARAM der CallBack-Funktion: Zitat:
|
AW: In Hook auslösender Prozess ermitteln
Ich glaube die beiden meinten das InstallHook(Hwnd : Cardinal) wie hier beschrieben:
![]() |
AW: In Hook auslösender Prozess ermitteln
hab's ausprobiert. Im dwExtraInfo kommt kein Fensterhandle daher.
Irgendwie brauche ich immer noch jemand, der bei mir den Rollladen hoch zieht. Und eigentlich bin ich beim Thema DLL und Hook ganz gut bewandert. Die Tutorials von Assarbad kenne ich seit Jahren und im Link, den mir baumina geschickt hat, ist ein Fehler: Maus- und Tastatur-Hook müssen nicht in eine DLL untergebracht werden (kann man sich IPC ersparen). Und wenn ich in diesem Beispiel von Assarbad die InstallHook function anschaue, resp. den ganzen Code, sehe ich keinen Sinn für WindowHandle. Wird gar nie verwendet. Also Ihr seht, so ganz auf den Kopf gefallen bin ich eigentlich nicht, nur habe ich momentan echt das Gefühl, er stecke irgendwie im Sand. |
AW: In Hook auslösender Prozess ermitteln
Ausgehend von
![]() was für ein Fenster kommt denn bei
Delphi-Quellcode:
an?
function InstallHook(Hwnd: Cardinal): Boolean; stdcall;
|
AW: In Hook auslösender Prozess ermitteln
Soweit ich mich richtig erinnere, sollte die PID (Prozess ID) jedem Prozess und NICHT jedem Modul (dll) zugeordnet sein. Dh. wenn du einen globalen Hook hast, was im Grunde einfach dem Betriebssystem sagt - "hey du, die Dll da -- lass alle mal laden"~ kannste in der Dll die ProzessID holen welche dann die des Prozesses ist. Es gibt diverse Enumerier-API Funktionen, mit denen du dann zum zugehörigen PID die Fenster Handles ermitteln kannst (sofern du sie brauchst)
Edit: Habs grad ausgetest und alles wie erwartet! GetCurrentProcessID() liefert ordentlich die PID des Prozesses! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:51 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