Programm läßt sich nicht minimieren
-
Hallo!
Um mehrere Instanzen eines Programmes zu verhindern, prüfe ich beim Start, ob bereits eine Instanz läuft. Wenn ja, schicke ich der 1. Instanz eine Nachricht. In der Ereignisbehandlungsroutine für diese Nachricht habe ich 2 Zeilen:
SetWindowPos(Application->MainForm->Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); SetWindowPos(Application->MainForm->Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);Damit erreiche ich, dass mein Programm sowohl aus dem Hintergrund als auch aus dem minimierten Status wieder im Vordergrund erscheint und den Fokus hat. Der Haken ist: Wenn ich meine 1. Instanz das 1. Mal aus dem minimierten Status aktiviert habe, kann ich sie danach nicht wieder minimieren. Sowohl der Menüeintrag im Systemmenü als auch der Minimieren-Button bleiben ohne Wirkung. Hat jemand eine Idee, warum das so ist?
Vielen Dank im Voraus.
Rob'
-
Und warum verwendest Du nicht einfach ShowWindow mit SW_RESTORE?
-
Das funktioniert leider nicht: Das Programm bleibt im Hintergrund bzw. minimiert, nicht mal der Button in der Taskleiste blinkt.
Rob'
-
1. SW_RESTORE behbt Dein Minimierungs Problem.
2. Das Prgramm in den Vordergrund zu bringen macht man mit SetForeGroundWindow
3. Und wenn man es ganz korrekt macht, muss man noch das aktive Popup Window berücksichtigen.// does it have any popups? hWnd = ::GetLastActivePopup(hWnd); // Bring the main window to the top if (::IsIconic(hWnd)) // If iconic, restore the main window ::ShowWindow(hWnd,SW_RESTORE); // bring it to top ::SetForegroundWindow(hWnd);
-
Hallo Martin,
Erst mal danke für deine Mühe.
Das Minimierungsproblem ist damit behoben. Doch im Vordergrund erscheint das Programm nicht, lediglich der Button in der Taskleiste blinkt.

Rob'
-
Lies die Doku zu SetForeGroundWindow und such hier im Forum und Du wirst Antworten finden...
-
Das mache ich doch immer als Erstes.

Es funktioniert ja auch schon fast.
Bin weiterhin dankbar für Tipps.Rob'
-
Ich habe Dir den Tipp gegeben. Such in diesem Forum nach SetForegroundWindow und Du findest einige Threads dazu... In der MSDN steht auch drin, warum es nicht geht...
Soll ich Dir alles vorkauen? Ein Mindestmaß an Eigeninitiative sehe ich als verpflichtend an.
-
Wow, jetzt hast du's mir aber gegeben!
Meine am Anfang gestellte Frage wird aber leider nicht beantwortet: Nach dem ersten Aktivieren der 1. Instanz aus dem minimierten Status läßt sich das Programm nicht noch einmal minimieren. Das gleiche Verhalten habe ich mit diesem Code (gefunden über die Suchfunktion ;)):
if (IsIconic(handle)) ShowWindow(handle, SW_RESTORE); else ShowWindow(handle, SW_SHOW); DWORD lpProcessBasehWnd = GetWindowThreadProcessId(handle, 0 ); DWORD lpProcessCurrhWnd = GetWindowThreadProcessId(GetForegroundWindow(), 0); if( lpProcessBasehWnd == lpProcessCurrhWnd ) { SetForegroundWindow(handle); } else { // attach input to other process AttachThreadInput( lpProcessCurrhWnd, lpProcessBasehWnd, true ); SetForegroundWindow(handle); AttachThreadInput( lpProcessCurrhWnd, lpProcessBasehWnd, false ); }Deshalb noch einmal meine Frage: was verhindert das erneute Minimieren? Und bitte keine Hinweise auf die Suchfunktion!

Rob'