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?
-
-
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?