Fremde Software wieder maximieren



  • Hallo zusammen

    Ich möchte aus meiner Software heraus eine andere, die minimiert ist, wieder maximieren. Dabei soll genau das geschehen, wie es passiert, wenn ich in der Taskleiste auf die Software klicke.

    Zu meinen bisherigen Versuchen habe ich bereits einen Thread hier:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-210291.html
    Leider klappt das alles nicht so, wie ich es mir vorstelle.

    Die anzuzeigende Software kann ein weiteres Fenster beinhalten. Dieses kann verschiedenste Titel haben, so dass ich nicht über FindWindow einen Handle auf dieses ermitteln kann (OK, evtl könnte ich das über die Klasse, aber ich bin mir nicht sicher, ob es immer die selbe ist).

    Mit ShowWindow habe ich nun schon bzgl. des Hauptfensters herumprobiert, aber ohne richtigen Erfolg. Denn es ist immer so, dass das kleine Fenster nicht mit angezeigt wird. Zudem hilft es mir wenig, wenn ich mir alle Children geben lasse. Das habe ich bereits versucht und ich habe die einfach alle zur Anzeige gebracht. Leider werden viele Fenster in der Software genutzt, um verschiedenen Dialoge umzusetzen. Und wenn diese alle angezeigt werden, ist die Software nicht mehr zu bedienen.

    Wie gesagt ich möchte eigentlich nur exact das gleiche Verhalten, wie es bei einem Klick in die Taskleiste auf eine minimierte Software ist. Hinzu kommt leider noch, dass ich auf der Zielplattform keine Taskleiste habe. Aber ich gehe davon aus, dass Windows die Funktion auch über die WinAPI ermöglicht. Ich weiß nur nicht wie.



  • versteh ich nicht so ganz. ist das kleine jawohl ein child fenster vom hauptfenster? dann wirds doch wieder mit maximiert. oder meinst du daß andere childs es überlagern`? zeig mal ein reproduzierendes beispiel, dann kann ich dir die lösung sagen.



  • Hallo rofler

    Das kleine Fenster müsste ein Childfenster der anzuzeigenden Anwendung sein. Aber wenn ich mit ShowWindow die Anwendung wieder zur Anzeige bringen will, erscheint dieses kleine Fenster nicht. Einen Einblick in den Quellcode kannst du über den Link haben.

    Wenn ich nur das Hauptfenster mit ShowWindow (zB mit SW_RESTORE) anzeigen lasse, fehlt das kleine Fenster. Das finde ich schon mal seltsam, da ich allgemein davon ausgegangen bin, dass die Anwendung dann wieder normal zur Ansicht kommt (zumal das kleine Fenster modal ist).

    Um es manuell in die Anzeige zu bringen, muss ich irgendwie das richtige Childfenster herausfinden (zumal das kleine nicht da sein muss). Und alle Childfenster darf ich nicht zur Anzeige bringen, da dann die Software nicht mehr bedienbar ist (dort werden Fenster intern genutzt, die aber dabei dann auch angezeigt werden).

    Leider weiß ich nicht, wie ich dir ein reproduzierendes Beispiel geben soll. Schließlich kann ich dir schlecht mein Testprogramme hier posten.



  • Nachtrag: Das kleine Fenster ist modal und kann von der Software automatisch angezeigt werden (z.B. wenn ein Verbindungsabbruch erkannt wurde). Nur wenn die Software minimiert ist, während ein solches Event auftritt, kann es zur beschriebenen Problemstellung kommen.


  • Mod

    Versich mal mit GetLastActivePopup an das Handle zu kommen.
    Und evtl. dieses mit WM_SYSCOMMAND SC_RESTORE zu beglücken.
    http://msdn2.microsoft.com/en-us/library/ms633507(VS.85).aspx

    Ich kann mir aber auch vorstellen, dass die Applikation einfach falsch mit diesem Dialog umgeht und kein Parent handle gesetzt hat!



  • Hallo Martin Richter

    Danke für den Hinweis, aber leider hilft mir das auch nicht weiter, denn die Funktion GetlastActivePopup liefert kein Popup (Ergebninshandle == Hauptfensterhandle). Somit scheint in der Software das Fenster nicht richtig benutzt zu werden (wie du schon sagst z.B. Parent falsch).

    Gibt es denn evtl. allgemein einen anderen Ansatz? Da ich das auszuführende Executable kenne, könnte ich evtl. kontrollieren, ob davon bereits eine Instanz läuft. Ist dieses bereits der Fall, gebe ich dem OS bescheid, dass diese Applikation maximiert bzw. in den Vordergrund soll. Ist eine solche Lösung möglich und wenn ja, wie kann ich da ansetzen? Kann ich damit evtl. die Arbeit mit Fensterhandles umgehen, die mir ja momentan nicht so viel weiterhelfen?


  • Mod

    Bin mir nicht ganz sicher ob GetLastActivePopup mit dem Input Thread zusammenhängt, wie GetFocus.

    Evtl. solltest Du mal noch vorher AttachThreadInput durchführen.

    Ansonsten Parent mal mit dem Spy++ kontrollieren.
    Mit Enum(Thread)Windows könntest Du evtl. auch an dieses Top-Level Window kommen...



  • OK, ich werde damit mal ein wenig herumprobieren.

    Aber noch etwas zum Verständnis: Eine Anwendnung kann nur über ein Handle auf das entsprechende Fenster angesteuert werden? Um Task-Manager habe ich ja eine Liste der Prozesse. Kann ich nicht darüber einen Zugriff erhalten? So dass ich dem OS mitteilen kann, dass die Anwendung zu maximieren ist.

    Ich kann sicherstellen, dass nur eine Instanz der Software laufen wird. Somit gäbe es nicht das Problem, die richtige Instanz anzusprechen. Und ansich will ich ja gar nicht mit den Fenstern hantieren sondern nur die Software wieder zur Anzeige bringen.



  • Klar kannst du Zugriff auf einen Prozess erhalten, aber das hat nix mit irgendwelchen Fenstern am Hut, die irgendwelche Threads im Prozess besitzen. Da musst du schon ans entsprechende Fenster eine Nachricht senden, anders geht das ned.



  • Hmm, schade aber ok. Wenn das so ist, muss ich das wohl so hinnehmen. Mal sehen, wie ich dann mein Problem mit den Fensterhandles in den Griff bekomme.



  • Mit EnumWindows() und dem dir bekannten Prozessnamen (EXE der fremden Programmes)kannst Du das Fenster-Handle heraussuchen und dann an dieses Fenster
    eine Nachricht schicken mit WM_MAXIMIZE oder so. Muss man einfach mal probieren.
    Siehe meinen Beitrag 'Prozessnamen ermitteln' in diesem Forum. Vielleicht hilft
    dir das weiter. Ist ein wenig aufwendig - viel Glück!



  • Nachtrag: Es geht nicht mit einer Nachricht, sondern direkt mit ShowWindow(hwndZiel,SW_SHOWNORMAL); wobei hwndZiel das Fensterhandle des Zielprogrammes ist. Der Rest bleibt gleich: EnumWindows() und EnumWindowsProc) einsetzen, um an das Fensterhandle heranzukommen. Ich habe es probiert, es läuft einwandfrei!


Anmelden zum Antworten