Fenster anderer SW zur Anzeige bringen



  • Hallo zusammen

    Ich möchte in meiner Software eine andere Software zur Anzeige bringen. Dabei soll einfach bei Buttonevent die Software maximiert in die Anzeige gebracht werden (falls sie noch nicht läuft, wird diese gestaret). Allgemein klappt das auch schon bei mir.

    Aber es gibt da ein Problem. Die Fremd-SW kann modale Fenster für Hinweise anzeigen. Wenn nun diese SW minimiert ist und ein modales Fenster anzeigt (auch minimiert), kann ich diese SW nicht richtig zur Anzeige bringen. Sobald ich über ShowWindow oder SetWindowPos das Fenster anzeigen will, erscheint nur das modale Fenster.

    Gibt es in der WinAPI entsprechende Funktionen mit denen ich mein Problem lösen kann? Wenn ich die andere SW anzeigen lasse, soll diese maximiert dargestellt werden und den Focus bekommen. Falls diese ein modales Fenster beinhaltet, soll diese auch angezeigt werden und der Focus liegt dort.

    Hier mal mein aktueller Code, damit ihr vielleicht direkt sehen könnt, ob ich da was falsch mache:

    AnsiString DestSWName = ".\\TestAppl.exe";
        AnsiString DestSWTitle = "TestAppl";
        AnsiString Anzeigekommentar;
        AnsiString Startkommentar;
        HWND DestSWHandle = NULL;
        UINT error;
        bool IsErrorDetected;
        const UINT ErrorDetectionLevel = 31;
    
        DestSWHandle = FindWindow(NULL, DestSWTitle.c_str());
        if(NULL == DestSWHandle)
        {
            error = WinExec(DestSWName.c_str(), SW_SHOWMAXIMIZED);
            Startkommentar = "Rückmeldung NBCInspector: ";
            if(ErrorDetectionLevel <= error)
                Startkommentar += "Fehler aufgetreten. Fehlernummer: " + AnsiString(error);
            else
                Startkommentar += "Software gestartet.";
            MemoInfo->Lines->Add(Startkommentar + "\n");
            DestSWHandle = FindWindow(NULL, DestSWTitle.c_str());
        }
        else
        {
            IsErrorDetected = ShowWindow(DestSWHandle, SW_SHOWMAXIMIZED);
            /*SetWindowPos(DestSWHandle,
                                            HWND_TOPMOST,
                                            0, 0, 0, 0,  //diese werden durch SWP_NOSIZE ingnoriert
                                            SWP_NOSIZE);
            IsErrorDetected = SetWindowPos(DestSWHandle,
                                            HWND_TOP,
                                            0, 0, 0, 0,  //diese werden durch SWP_NOSIZE ingnoriert
                                            SWP_NOSIZE);*/
            Anzeigekommentar = "Fehler bei SetWindowPos: ";
            if(IsErrorDetected)
                Anzeigekommentar += "true";
            else
                Anzeigekommentar += "false";
            Anzeigekommentar += "\n";
            MemoInfo->Lines->Add(Anzeigekommentar);
        }
    

    Die auskommentierten Bereich habe ich mal getestet. Leider ohne entsprechenden Erfolg.


  • Mod

    Schon mal SW_RESTORE probiert?
    Was ist mit WM_SYSCOMMAND SC_RESTORE?

    BTW: WinExec ist obsolete, verwende ShellExecute!



  • Sowohl mit SW_RESTORE als auch über die Nachrichtenschleife mit WM_SYSCOMMAND und SC_RESTORE hat es den gleichen Effekt. Leider bleibt das modale Fenster hinter dem Hauptfenster, so dass der Bediener blockiert ist.

    Muss ich evtl. das modale Fenster manuell in den Vordergrund bringen? Dann müsste ich allgemein alle Children abrufen und nach vorne bringen, falls es mehrere gibt. Aber ansich sollte es doch auch möglich sein, einfach die Applikation mit allen zugeordneten Fenster wieder herzustellen, oder?

    Danke für den Hinweis bzgl. WinExec. Das habe ich direkt umgebaut.


Anmelden zum Antworten