Externes Fenster dauerhaft unsichtbar machen
-
Hallo zusammen,
ich versuche gerade ein Edit-Fenster einer externen Anwendung (also einer Anwendung von der ich nur die .exe habe) dauerhaft unsichtbar zu machen.
Vorerst geht das sehr einfach mit ShowWindow(hWnd, 0). Problem ist allerdings dass die externe Anwendung auch noch einen TreeView hat, der mit dem Edit-Fenster verknüpft ist. Wenn ich jetzt auf einen anderen Eintrag des TreeViews klicke, wird das versteckte Fenster wieder sichtbar.
Jemand eine Idee wie ich das verhindern könnte?
Hab schon folgendes probiert, ohne Erfolg:
SendMessage(hWnd, WM_SETREDRAW, false, 0)
EnableWindow(hWnd, 0)Viele Grüße,
hs
-
Das Problem ist, dass dein Edit Fenster ein Child des TreeView ist und somit von seinen Parents Eigenschaften übernimmt, was über Messages von jenen zu dem Edit geschieht.
Spontan würde ich vorschlagen, einen Hook einzubauen, um eben jene Nachrichten zum Edit, welche es wieder sichtbar machen, abzufangen.
-
Hallo,
danke schonmal für die Antwort.
Youka schrieb:
Das Problem ist, dass dein Edit Fenster ein Child des TreeView ist und somit von seinen Parents Eigenschaften übernimmt, was über Messages von jenen zu dem Edit geschieht.
Hm, also hab das schon mit Spy++ nachgeprüft. Sowohl der TreeView als auch das Edit-Control sitzen auf einem gemeinsamen Parent-Fenster (haben also den gleichen Parent).
Youka schrieb:
Spontan würde ich vorschlagen, einen Hook einzubauen, um eben jene Nachrichten zum Edit, welche es wieder sichtbar machen, abzufangen.
Ok, das klingt gut. Aber wie fange ich eine Nachricht so ab dass sie nicht ausgeführt wird? Einen Hook habe ich schon installiert, dieser feuert bei TVN_SELCHANGED, also wenn die Auswahl im TreeView verändert wird.
Wenn ich jetzt also noch für die WM_SHOWWINDOW Message einen Hook einbau, bau ich dafür ja eine Callback Funktion ein... aber wie sage ich dem Fenster jetzt dass es diese Message ignorieren soll?
-
happystudent schrieb:
Wenn ich jetzt also noch für die WM_SHOWWINDOW Message einen Hook einbau, bau ich dafür ja eine Callback Funktion ein... aber wie sage ich dem Fenster jetzt dass es diese Message ignorieren soll?
Ich kenn mich da leider nicht so gut aus, aber wenn ich raten müsste, würde ich vorschlagen, dass du im Falle der WM_SHOWWINDOW Nachricht deines Edit Fensters im Hook den nächsten Hook mit ungültigem Code ausführen lässt, um das weitere Standard-Verfahren auszusetzen.
-
Hm, ein ungültiger code ist wahrscheinlich einfach ein negativer Wert? Oder gibt es da was bestimmtes zu beachten dass man nix kaputt macht?
-
Man könnte ne DLL in die Applikation injecten, sich in der DLL das Window-Handle des Controls suchen, und dann die Window-Procedure des Controls überschreiben. Und in der neuen Windows-Procedure dann
WM_SHOWWINDOW
mitwParam != 0
damit zu quittieren, dass manShowWindow(hWnd, SW_HIDE)
aufruft. Und alle anderen Messages dann einfach 1:1 an die alte Window-Procedure weiterleiten.Wenn ich jetzt also noch für die WM_SHOWWINDOW Message einen Hook einbau, bau ich dafür ja eine Callback Funktion ein... aber wie sage ich dem Fenster jetzt dass es diese Message ignorieren soll?
Ich bin mir nicht sicher ob das überhaupt geht, bzw. überhaupt etwas bringt. Wenn, dann einfach indem die Window-Proc
return 0;
macht. ("If an application processes this message, it should return zero.")
Man liest aber auch in diversen Threads dassWM_SHOWWINDOW
eine Benachrichtgung, und kein Kommando ist. Das würde heissen dass die Änderung so oder so passiert (oder schon passiert ist), und Windows dir nur die Möglichkeit gibt dies mitzubekommen.
-
Hallo,
danke für die Antwort. Das return 0 hab ich mittlerweile ausprobiert, leider ohne Erfolg.
Einfach in dem Callback von WM_SHOWWINDOW dann ShowWindow(hWnd, SW_HIDE) aufzurufen klingt nach einer schönen Lösung, aber nachdem ich es getestet und nochmal in der MS Doku gelesen habe musste ich leider feststellen dass dieser Event zu früh ausgelöst wird:
... the window receives this message after it is created, but before it is displayed.
Hab nach stundenlangem rumprobieren und fluchen jetzt aber doch noch eine Lösung gefunden: WM_WINDOWPOSCHANGED. Weiß nicht ob das für alle Fenster gilt, aber zumindest bei meiner externen Anwendung wird ein WM_SHOWWINDOW immer mit einem WM_WINDOWPOSCHANGED abgeschlossen, welches erst feuert nachdem das Fenster wieder gezeigt wurde.
Grüße,
hs