WM_SHOWWINDOW mit Subclassing verhindern?



  • Hallo,

    ich will verhindern dass ein Fenster einer externen Applikation gezeigt wird. Das geht ja etwa mit ShowWindow(someWindow, SW_HIDE); Ich will das jetzt gerne über Subclassing erreichen. Folgendes habe ich probiert:

    WNDPROC old_proc = 0;
    
    LRESULT CALLBACK subclass_proc(HWND window, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    	switch (msg)
    	{
    	case WM_SHOWWINDOW:
    		return CallWindowProc(old_proc, window, msg, 0, 0); // wParam == 0 sollte das Fenster verstecken
    	}
    	return CallWindowProc(old_proc, window, msg, wParam, lParam);
    }
    
    // ...
    void init_subclass()
    {
    	old_proc = (WNDPROC)SetWindowLongPtr(external_window, GWL_WNDPROC, (LONG)subclass_proc);
    }
    

    Leider funktioniert das nicht, das Fenster wird nach wie vor gezeigt. Laut MS Doku sollte ein wParam gleich 0 bedeuten dass das Fenster nicht gezeigt wird.

    Woran könnte das liegen? Ist WM_SHOWWINDOW schon "zu spät" oder warum bringt das subclassing hier nichts?



  • Guck mal unter Remarks: https://msdn.microsoft.com/en-us/library/windows/desktop/ms644898(v=vs.85).aspx
    Du könntest allerdings eine DLL in den anderen Prozess injizieren, welche dann das fenster subclasst.



  • roflo schrieb:

    Guck mal unter Remarks: https://msdn.microsoft.com/en-us/library/windows/desktop/ms644898(v=vs.85).aspx
    Du könntest allerdings eine DLL in den anderen Prozess injizieren, welche dann das fenster subclasst.

    Hallo,

    sorry dass ich das vergessen habe zu erwähnen, aber ich bin bereits in einer injizierten DLL unterwegs. Also prinzipiell funktioniert das Subclassing schon (hab diverse andere Sachen entsprechend manipuliert und das klappt alles).

    Nur hier mit dem WM_SHOWWINDOW mags irgendwie nicht hinhauen...



  • Also es sieht nach ein paar Tests so aus als wäre WM_SHOWWINDOW abzufangen sowieso nicht der richtige Weg, weil sich dieses ganz anders verhält als ShowWindow...

    Folgende Aufrufe (zu Testzwecken manuell versendet) verhalten sich unterschiedlich:

    ShowWindow(window, SW_HIDE); // Versteckt das Fenster korrekt
    SendMessage(window, WM_SHOWWINDOW, FALSE, 0); // Macht nichts
    

    Ich dachte erst ShowWindow ist nur ein Wrapper für den SendMessage-Aufruf aber dem ist wohl nicht so.

    Was ich eigentlich bräuchte ist eine Funktion die vor ShowWindow aufgerufen wird (also quasi eine hook für ShowWindow)... Wie könnte man sowas bewerkstelligen?



  • ShowWindow hooken.


  • Mod

    WM_SHOWWINDW ist die "Benachrichtigung" das ein Fenster angezeigt wird.
    Damit kann man das anzeigen nicht verhindern. Aber man kann sofort das Fenster wieder verstecken.

    Nach meinem Dafürhalten ist dies die einfachste Methode:
    WM_WINDOWPOSCHANGING abfangen und wie folgt behandeln:

    lpwndpos->flags &= ~SWP_SHOWWINDOW; 
    lpwndpos->flags |= SWP_HIDEWINDOW;
    

    @roflo: ShowWindow hooken ist wohl ein Witz. Was ist mit SetWindowPos und allen anderen Funktionen, die ein Fenster auch anzeigen können... ?



  • Auch hooken 🤡



  • Danke, hab jetzt eine Mischung aus den geposteten Vorschlägen gefunden die funktioniert hat... ist zwar (mal wieder) etwas ausgeufert aber dafür funktioniert es.

    Ich finde es nur irgendwie nicht so toll dass man einer Message nicht wirklich ansieht ob die jetzt eine Auswirkung hat, also tatsächlich ein "Command" ist oder doch nur eine Notification.

    Bei WM_SHOWWINDOW war ich mir allein vom Namen her sicher dass das eine "aktive" Message sein muss, aber ist wohl doch nicht so.


  • Mod

    Lies die Anleitung. Steht, da etwa, dass Du sie sendest, oder wie man sie sendet. Es steht da etwas von empfangen.

    @roflo: Genau: Das ist albern. 🕶


Anmelden zum Antworten