Keine der angegebenen Antworten hat mir geholfen, mein Problem zu lösen, aber ich habe die Antwort selbst gefunden. Hier ist es.
Mit SetWindowsHookEx()
mit WH_KEYBOARD_LL
war der richtige Ansatz. Allerdings sind die anderen Parameter zu SetWindowsHookEx()
unintuitive:
- Der letzte Parameter,
dwThreadId
muss 0.
- Der zweitletzte Parameter,
hMod
, bis zu einem gewissen DLL-zu-Punkt sein muss. Ich verwendete User32
, die eine DLL ist, die sowieso immer geladen wird und von allen Prozessen mit einer GUI verwendet wird. Ich habe diese Idee von a CodeProject post about this.
So sieht der Code ein bisschen wie folgt aus:
instance = LoadLibrary("User32");
hhook = SetWindowsHookEx(WH_KEYBOARD_LL, hookFunction, instance, 0);
Die Dokumentation ist unklar, über die zweitletzte Parameter. Es heißt:
Der hMod-Parameter muss auf NULL gesetzt werden, [...] wenn die Hook-Prozedur innerhalb des Codes ist, der dem aktuellen Prozess zugeordnet ist.
Es gibt nicht an, dass dies auf einige Arten von Haken gilt nur, aber nicht beschränkt auf WH_KEYBOARD_LL
und WH_MOUSE_LL
.
Ja, es ist was sie bedeuten - für eine Low-Level-Maus oder Tastatur-Hook (oder einen anderen lokalen Hook) sollte HMod IntPtr.Zero sein. –
Hmmm, du sagst, dass die anderen Beiträge nicht hilfreich waren, fahre fort, die gleiche Antwort zu posten, die nobugz bereits angegeben hat, und markiere deine als die richtige Antwort. –
Nobugz sagt überhaupt nichts über hMod, und im Gegensatz zu Ihrem ersten Kommentar schlägt diese Antwort vor, dass hMod auf etwas ** anderes ** als IntPtr.Zero gesetzt wird. –