Frage

Zwei Fragen.

1) Ich verstehe das ein erwartetes Ergebnis sein muss, aber vielleicht kann mir jemand sagen, was ich falsch mache; Ich versuche, alle Fensterklassen in einem globalen Haken Unterklasse und es funktioniert, außer dass ich in der Nähe Geschäft nicht in der Lage bin, wie ich soll, und wenn das Programm zunächst den Haken Registrierung hebt die Registrierung die Haken und Ausfahrten, subclassed Anwendungen starten abstürzt.

Hier ist, wie ich versuche, es zu tun ..

// stores original wndprocs. In the hook dll, outside the shared memory.
map<HWND, WNDPROC> origWndProcs;

// in an EnumWindows callback, executed for all HWND's, also in the hook dll (UWM_REMOVE_HOOK is a registered unique message)
SendMessageTimeout(hWnd, UWM_REMOVE_HOOK, 0, 0, SMTO_ABORTIFHUNG | SMTO_NORMAL, 15000, res);

// Still in the same hook, in the subclassing wndproc..
if (msg == UWM_REMOVE_HOOK) {
   if (origWndProcs.find(hwnd) != origWndProcs.end()) {
      SetWindowLongPtr(hwnd, GWL_WNDPROC, (LONG_PTR)origWndProcs[hwnd]);
   }
}

// clears the hook..
__declspec(dllexport) BOOL ClearHooks(HWND hWnd) {

    BOOL unhooked = UnhookWindowsHookEx(hook) &&
       UnhookWindowsHookEx(kb_hook) &&
       UnhookWindowsHookEx(mouse_hook) && 
       UnhookWindowsHookEx(cbt_hook);

    if(unhooked)
       hWndServer = NULL;
    return unhooked;
}

In DllMain Ich mache nichts auf DLL_PROCESS_DETACH. Stattdessen heißt ClearHooks () aus dem Programm, das ursprünglich die Haken Registrierung und dort erst nach dem Haken hat eine Nachricht Signalisierung gesendet, dass sie die EnumWindows Operation (Wiederherstellungen original wndprocs, siehe oben) ausgeführt haben.

ich Unterklasse Fenster in einer WndProc Haken; alle sichtbaren Fenster, die eine Nachricht und deren aktuelle Wndproc ist nicht derjenige in der DLL werden subclassed.

erhalten

Grundsätzlich sind alle (soweit ich das beurteilen kann) Anwendungen beim Beenden abstürzen trotz der Tatsache, dass die Fenster scheinen die Wndproc Set zurück zu bekommen, was es war, als es ersetzt wurde. Wer eine Ahnung, was ich tun könnte falsch sein?

2) Ich muss das Intercept WM_MINMAXINFO und Fenster maxsize ändern, wenn ein Fenster maximiert wird. Leider kann ich in der DLL tue dies nicht, aber ich habe mit einem Programm sprechen, um die Größe Info zu bekommen. Also, was ist der beste Weg, um das Fenster zu sprechen; Ich brauche es einige Informationen zu übergeben zurück, damit ich die Struktur ändern kann, die mit der ursprünglichen WM_MINMAXINFO Nachricht kam. Wird eine Struktur in WM_COPYDATA zu den Erträgen bei Sendmessagetimeout es die Daten, bis der Anruf erhalten?

Danke

War es hilfreich?

Lösung

Es gibt viele Schmerzpunkte hier. Sie gehen davon aus, dass kein anderer Code wird das Fenster Unterklasse. Und dass ein solcher Code Willen un-Unterklasse sie in der richtigen Reihenfolge. Es gibt keine richtige Bestellung Ihres Einhaken von der Ausführung des Programms recht asynchron ist.

Aber, ist die Abhilfe einfach genug. Sie sind bereits mit SetWindowsHookEx Einhaken, könnte genauso gut ein mehr tun. WH_CALLWNDPROC oder WH_CALLWNDPROCRET, je nachdem, was Sie tun möchten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top