Ich setze einen Low-Level Maushaken mit SetWindowsHookEx
:
Da dies ein Callback auf niedriger Ebene ist, wird es in meinem eigenen Prozess ausgeführt. Es wird keine DLL-Injektion durchgeführt.
Nun habe ich bemerkt, dass der Callback manchmal (indirekt) von Standard-API-Funktionen wie GetAncestor
, GetWindowRect
und so aufgerufen wird. Es scheint, dass diese dazu führen können, dass eine Nachrichtenwarteschlange geleert wird.
Eigentlich ist meine Frage dreifach ...
Wann wird der Rückruf aufgerufen?
Kann es von any API-Funktion aufgerufen werden? Wie kann ich es sagen?
In welchem Thread wird der Callback ausgeführt?
Wird es nur auf dem Thread ausgeführt, der den Hook installiert hat, oder kann das System es auf einem beliebigen Thread aufrufen?
Warum werden Hooks überhaupt als Callback implementiert?
(Kommt Raymond Chen hier rum?) Es erscheint mir viel sinnvoller, Hooks einfach als (gesendete) Nachrichten zu implementieren, wie so ziemlich alles andere von Windows. Für Nachrichten weiß ich zumindest, welche Funktionen dazu führen können, dass ausstehende gesendete Nachrichten verarbeitet werden ( GetMessage
, PeekMessage
und eine Handvoll anderer), und ich weiß, auf welchem Thread sie verarbeitet werden (der Thread, der die Nachricht empfangen hat der erste Ort).
Siehe 3.
Es ist ziemlich klar in der Dokumentation geschrieben:
[...] Der WH_MOUSE_LL-Hook wird jedoch nicht in einen anderen Prozess eingefügt. Stattdessen wechselt der Kontext zurück zu dem Prozess, der den Hook installiert hat, und er wird im ursprünglichen Kontext aufgerufen. Dann wechselt der Kontext zurück zu der Anwendung, die das Ereignis generiert hat. [...] Dieser Hook wird im Zusammenhang mit dem Thread aufgerufen, der ihn installiert hat.
Tatsächlich ist so implementiert:
[...] Der Aufruf erfolgt durch Senden einer Nachricht an den Thread, der den Hook installiert hat. Daher muss der Thread, der den Hook installiert hat, eine Nachrichtenschleife haben.
AFAIK: Wenn Ihr Hook aufgerufen werden muss, fügt Windows eine spezielle Nachricht in die Nachrichtenwarteschlange Ihres Threads ein. Ihr Code in der Message-Pumpe ruft Peek / GetMessage auf, die prüft, ob es sich um die spezielle Nachricht handelt, und wenn dies der Fall ist, ruft sie Ihre Hook-Prozedur auf (einige Beweise hier , woher ich das Bild gemacht habe). Hook Dispatching Call Stack http://cboard.cprogramming.com/ attachments / windows-programming / 9323d1253895425-setwindowshookex-niedriglevelmouseproc-hook-callback-callstack-png
Tags und Links multithreading winapi hook