WM_CREATE
-
Ich weis ja nicht wie du das übersetzt
aber bei mir heißt das soviel wie, "wParam gibt an ob die Nachricht vom aktuellen Thread gesendet wurde, wenn ja ist wParam ungleich 0, ansonsten 0"
Und die Nachricht selber ist dann dein nCode. Also Prüfe nCode auf WM_CREATE.du hast ja immer eine Nachricht (normalerseie message oder msg, bei dir nCode) und dazu zwei Datenfelder wParam und lParam wo zusatzinformationen zu dieser Nachricht gespeichert werden.
MfG schirrmie
-
Ich will alle Fenster anzapfen (naja zumindest alle ParentFenster).
Die Hook-Dll soll sich ja in jeden Prozess einhängen(deswegen gibt es ja auch einen gemeinsamen Variablen Bereich , sonst hätten die Variablen auch mit den ganzen Hook-Dll´s nichts miteinander zu tun)Was mich verwundert: Ich debugge diese Hook-Dll und ich bleibe nur (immer wenn ich den Explorer starte im Breakpoint) hängen. Theoretisch erwarte ich , dass ich bei jedem WM_Create hängen bleibe.(auch bei allen child windows)
Kann ich in WinSpy die Einstellung vornehmen, dass ich das ganze system überwache? Oder nur ein Fenster?(was mir nichts nützne würde, da ich auf create untersuchen will)
-
@schirrmie:
Für mich heißt das: Falls eine Nachricht spezifiziert wurde(sprich !=0) sende die nachricht(in Form von WM_xxx)
-
Hmm ich weis nicht genau wie du das meinst aber wenn du vorher prüfen möchtest ob die Nachricht vom aktuellen Thread kommt dann mach es so (oder so ähnlich).
LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam) { ... switch( nCode ) { case WM_CREATE: if( wParam ) cntWMCREATE++; break; } }Du darfst nicht wParam auf WM_CREATE prüfen!!!
schirrmie
-
@schirrmie:
In der Doku steht(s.letzte URL):
nCode
[in] Specifies whether the hook procedure must process the message. If nCode is HC_ACTION, the hook procedure must process the message. If nCode is less than zero, the hook procedure must pass the message to the CallNextHookEx function without further processing and must return the value returned by CallNextHookEx.Da steht: Wenn nCode == AC_ACTION mache was , wenn nCode < 0 rufe CallNextHookEx() auf. Das bedeutet doch im Umkehrschluss : Ich kann nCode gar nicht auf WM_Create untersuchen.
-
Ja du hast recht tut mir leid, hab gerade mal in der MSDN geschaut. Aber eins steht fest du darfst trotzdem nicht wParam auf WM_CREATE überprüfen!!!
schirrmie
-
@schirrmie:
Mal abgesehen vom switch():
Müsste ich nicht immer in das if-statement(vor dem switch) via Breakpoint gelangen und das bei jeder WindowsMessage?
-
So jetzt habe ich weiter gelesen

lParam
Pointer to a CWPRETSTRUCT structure that contains details about the message.Also musst du lParam in eine CWPRETSTRUCT konvertieren und dann auf message in der struktur prüfen.
Jetzt sollten wir es haben

schirrmie
-
wuTangl schrieb:
@schirrmie:
Mal abgesehen vom switch():
Müsste ich nicht immer in das if-statement(vor dem switch) via Breakpoint gelangen und das bei jeder WindowsMessage?Probier deine Funktion mal so
LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam) if (nCode == HC_ACTION){ // Mache das was du willst } return CallNextHookEx(hhook, nCode, wParam, lParam) ; // Die Nachrichten an den nächsten Hook weiterreichen. }schirrmie
-
@schirrmie:
klingt gut.. ausprobiert .. ist es aber leider auch nicht!
Es bleibt nicht mehr in WM_CREATE stehen!(wenn ich den Explorer starte) ...komisch
-
Zeig mal wie dein Code dann jetzt aussieht!
Hast du es mal mit einem anderen Programm (Notepad, Rechner) ausprobiert, wie dann das verhalten ist?schirrmie
-
LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode < 0) { return CallNextHookEx(hhook, nCode, wParam, lParam); } // UINT message = ((CWPSTRUCT*)lParam)->message; switch(message) { case WM_CREATE: cntWMCREATE++;break; case WM_NCCREATE: cntWMNCCREATE++; break; //überprüfe ob Window ein child oper parent Window is } return CallNextHookEx(hhook, nCode, wParam, lParam); }Ich glaube, dass es ein Problem des Debuggens ist. Es existiert ja zu jedem Prozess diese Hook-DLL. Und ich vermute stark, dass da was durcheinander läuft.
Im erste Schritt geht es mir ja darum, zu verstehen, ob der Debugger richtig funzt oder nicht!
Wie schon gesagt, ich komme nur in diese Funktion, wenn ich den Explorer starte oder was am eigentlichen Programm(welches die DLL koppelt und somit nicht systemweit anzusehen ist) mache. (Sprich mit der Mouse über den SystemTrayIcon)
-
Merkwürdig erscheint mir auch die Tatsache, dass wenn ich den Explorer starte, ich dann nur Message nr 992 -->0x3E0 sehe .. welche es gar nicht gibt!
vgl dazu
[url]
http://192.197.62.35/courses/comp638/src/week01/messages/wm.h
[/url]Ander Programme zeigen keine Auswirkung auf die Breakpoints
-
#define WM_DDE_FIRST 0x03E0 #define WM_DDE_INITIATE (WM_DDE_FIRST) #define WM_DDE_TERMINATE (WM_DDE_FIRST+1) #define WM_DDE_ADVISE (WM_DDE_FIRST+2) #define WM_DDE_UNADVISE (WM_DDE_FIRST+3) #define WM_DDE_ACK (WM_DDE_FIRST+4) #define WM_DDE_DATA (WM_DDE_FIRST+5) #define WM_DDE_REQUEST (WM_DDE_FIRST+6) #define WM_DDE_POKE (WM_DDE_FIRST+7) #define WM_DDE_EXECUTE (WM_DDE_FIRST+8) #define WM_DDE_LAST (WM_DDE_FIRST+8)Verwende einfach mal Spy++ und Du kannst alle Nachrichten "wirklich" monitoren...
-
@Martin Richter:
Wie stelle ich denn eine systemweite Überwachung mit Spy++ ein? Ich kann immer nur auf ein exist. Fenster eine Überwachung starten. (Will WM_Create abfangen)
-
Ausprobiert hast Du wahrscheinlich nichts oder?
- Spy++ starten.
- Log messages (Strg+M)
- Haken bei "All windows in system"Aber Achtung! Mach dass nie wenn der Debugger läuft!
-
@Martin Richter:
Habe jetzt mal ein bischen rumgespielt, ist schon ein nützliche Hilfe.
Aber wo bekomme ich ein vernüftiges Tut. für win-api bzgl systemweite Hooks her? Die Api ist zwar schon und gut .. aber nicht immer so hilfreich , wenn man die Funktionsnamen nicht kennt.