FindWindow - BringWindowToTop -> Geht nicht



  • Bitte um konstruktive Hinweise und nicht um blöde Sprüche wie "Suchfunktion benutzen" oder "Schau in die Hilfe" -- das habe ich nämlich schon.
    Mein Problem ist das folgende:

    Ich habe ein Anwendung die nicht doppelt gestartet werden soll.
    Das funktioniert gut nach der OpenMutex-Geschichte:

    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
            try
            {
                    Application->Title = "MyApp v1";
    
                    // Programminstanz bereits am laufen?
                    HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, "MyApp");
    	       if(!hMutex)
    		{
                            hMutex = CreateMutex(0, 0, "MyApp");
    		}
                    else
    		{
    		        HWND hWnd = FindWindow(0, Application->Title.c_str());
                            BringWindowToTop(hWnd);  // <---   GAY-t nich !!!! 
                            return 0;
    		}
                     Application->Initialize();
                     Application->CreateForm(__classid(TForm1), &Form1);
                     Application->Run();
            }
            catch (Exception &exception)
            {
                     Application->ShowException(&exception);
            }
            catch (...)
            {
                     try
                     {
                             throw Exception("");
                     }
                     catch (Exception &exception)
                     {
                             Application->ShowException(&exception);
                     }
            }
            return 0;
    }
    

    Benutze ich den oben stehenden Code, so kann ich das Programm nicht mehrmals starten (ok), aber es kommt partout nicht in den Vordergrund!!
    Habe alle möglichen API-Funktionen & Kmbinationen durchprobiert; jedes Beispiel im Board und Netz durchgespielt: nix!

    Das Fenster bleibt wo es ist (verdeckt, minimiert) und rührt sich nicht. FindWindow liefert true; IsWindowVisible liefert true;

    Woran liegt`s? Hat jemand ein funktionierendes Code-Schnippsel?



  • ähm,

    Ergebnis der Suchfunktion

    Hast du ansonsten mal gechecked was BringWindowToTop zurückgibt ?



  • AndreasW schrieb:

    ähm,
    Hast du ansonsten mal gechecked was BringWindowToTop zurückgibt ?

    TRUE, das Fenster belibt trotzdem unverändert. Ziemlich frustrierend vorallem weil ich die Beispiele zu dem Thema 1:1 übernommen habe.
    Was habe ich vergessen? Muss ich evtl. noch irgendwelche Eigenschaften setzen?



  • SetForegroundWindow ?



  • ????? schrieb:

    SetForegroundWindow ?

    SetForegroundWindow geht auch nicht. Hab sogar redraw versucht...



  • Okay, habs selbst herausgefunden (zwangsläufig)...
    Danke fürs "rege" Interesse ;))

    Hier die Lösung:

    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
            try
            {       // Name der Anwendung im TASK Manager und Titelleiste
                    AnsiString AppTitle = "MyApp v1";
    
                    // bereits aktive Instanz in den Vordergrund holen
                    HWND hWin = FindWindow("TApplication", AppTitle.c_str());
                    SetForegroundWindow(hWin);
    
                    // doppelte Programminstanzen verhindern/beenden
                    HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, "MYAPP");
    	        if(!hMutex)
    		{
                            hMutex = CreateMutex(0, 0, "MAAPP");
    		}
                    else
    		{
                            return 0;
    		}
    
                    // Programmstart
                    Application->Title = AppTitle;
                    Application->Initialize();
    
                    ReleaseMutex(hMutex);
            }
            catch (Exception &exception)
            {
                    Application->ShowException(&exception);
            }
            catch (...)
            {
                    try
                    {
                            throw Exception("");
                    }
                    catch (Exception &exception)
                    {
                            Application->ShowException(&exception);
                    }
            }
            return 0;
    

    Der Fehler lag darin, dass die Aufrufe

    HWND hWin = FindWindow("TApplication", AppTitle.c_str());
                    SetForegroundWindow(hWin);
    

    vor

    Application->Title = AppTitle;
                    Application ....  
                                ....
    

    stehen müssen. Weiss einer warum?


Anmelden zum Antworten