SetForegroundWindow

lindin

Erfahrenes Mitglied
Hallo, ich habe eine Frage zu der Funktion SetForeGroundWindow!

Ich wollte diese Funktion benutzen um folgendes Problem zu lösen:

Wenn mein Programm gestartet wird, und es läuft schon, dann soll das Fnester der schon laufenden Instanz in den Vordergrund geholt werden!

Ich suche das FEnster mit FindWindow heraus, und setze es dann mit SetForegroundWindow in den Vordergrund, kein Problem!

Das Problem entsteht, wenn das Fenster vorher minimiert wurde,
Dann möchte ich es erstmal anzeigen!
Habe also vor SetForegroundWindow ein
ShowWindow() mit Option SW_SHOWNORMAL gesetzt!

Nun passiert folgendes:
Wenn ich nun das Programm ein zweites mal starte, und das Fenster minimiert war, dann kommt irgednwie ein zweites Fenster, welches komisch abgeschnitten ist, man sieht also nur den oberen Rand des Fensters mit dem Fensternamen!
Mit dem Ding jkann man nichts machen, höchstens mit der Maus verschieben!
Es geht erst wieder weg, wenn man das "richtige" Fenster von der ersten Instanz des Programms zumacht! Also das ganze Programm beendet!

Wenn aber das fenster vorher nicht minimiert war, sondern nur im Hintergrund, dann geht alles so, wie ich es will!

Ich habe das ganze Problem mal folgendermaßen gelöst:


Code:
ShowWindow(hwnd,SW_SHOWMINIMIZED);
ShowWindow(hwnd,SW_SHOWNORMAL);

Also ohne SetForegroundWindow!
Das funktioniert genauso wie die Version mit Setforegroundwindow, also mit dem Fehler!
Und das vesrtehe ich nicht, wenn ich erst das Fenster minimiere, ist es doch in dem gleichen Zustand, als wenn ich es "per Hand" minimiere, oder?
 
Aus irgendeinem nicht näher bekannten Grund gibt es SW_RESTORE und SW_SHOWNORMAL.

Laut Beschreibung sollte man meinen, dass beide dasselbe tun. Versuch statt SW_SHOWNORMAL doch mal SW_RESTORE.

Ich hab's nicht getestet, also keine Garantie drauf.
 
Hab ich schon getestet, funktioniert auch nicht, habe schon so gut wie alle Möglichkeiten durch, wenn nicht alle!
 
Dieses komische kleine Fenster ist nicht zufällig einfach ein minimiertes Fenster (sieht aus wie nur die Caption mit Text und Buttons drauf)?

Bewegst du das Fenster eventuell auch?

Versuch mal, das ShowWindow( SW_MINIMIZED ) nur zu senden, wenn IsIconic FALSE zurück gibt..

Evtl. statt SetForegroundWindow mal BringWindowToTop benutzen (Die Namen).
 
Also BringWindowToTop bringt gar nichts! Und IsIconic kann ich nicht verwenden, da ich nicht MFC verwende!

Also das Fenster ist kein minimiertes Fenster. Ich kann damit gar nichts machen, außer es auf dem Bildschirm hin und her zu schieben!
Ich kann es noch nicht mal mit der rechten Maustaste schließen, da kommt kein Menü, obwohl das Fenster in der Statusleiste erscheint.
Das Fenster erscheint aber nicht, wenn ich nur SetForegrond ohne ShowWindow benutze!

Wie kann ich denn mit einer anderen Funktion abfragen, ob das Fenster minimiert ist?

Und ist der Status des Fensters, wenn ich es 'per Hand' minimiere anders, als wenn ich es per ShowWindow minimiere?
Müßte ja eigentlich!
 
IsIconic ist nicht MFC. Damit prüft man in der Win32 API, ob ein Fenster minimiert ist.

>Und ist der Status des Fensters, wenn ich es 'per Hand' minimiere anders, als >wenn ich es per ShowWindow minimiere

Kann ja eigentlich nicht. Per Hand minimieren tut intern vermutlich genau dasselbe.
 
Das dachte ich nur, weil das ja in der Form

Code:
ShowWindow(hwnd,SW_MINIMIZED);
ShowWindow(hwnd,SW_SHOWNORMAL);
funktioniert, wenn das Fenster nicht minimiert ist!
Wenn ich aber das FEnster per hand minimiere, und dann
ShowWindow(hwnd,SW_SHOWNORMAL)
aufrufe, dann passiert der besagte Fehler!

Also muß es irgendwie anders sein!
 
Was mir noch dazu einfällt:

Wird das Fenster denn intern direkt minimiert erstellt oder erst nachträglich minimiert?

Das könnte noch einen Unterschied machen. Windows merkt sich ja beim Minimieren die letzte Grösse und Position des Fensters, nur wenn es minimiert erstellt wird, dann hat's da vielleicht Probleme?
 
Nein, es wird nicht direkt minimiert!
Beim Programmaufruf wird es ganz normal mit ShowWindow(hwnd,SW_SHOW) angezeigt.
Deswegen ist mir der Fehler ja auch jetzt erst aufgefallen, hatte das noch gar nicht getestet, wie das ist, wenn ich das Fenster minimiere, und dann das PRogramm nochmal starte...
 
Ich hab jetzt mal spasshalber eine MFC-Dialog-Anwendung gebastelt, die genau das macht. Ich konnte den Fehler allerdings nicht nachvollziehen?

Ich benutze nach FindWindow ShowWindow und SetForegroundWindow. (BringWindowToTop hat nicht so dolle funktioniert).
Es klappt in beiden Fällen mit "normal" nicht aktivem ersten Fenster und auch mit minimierten erstem Fenster.

Vergleiche doch mal, ob da noch irgendwo Unterschiede sind, das muss doch rauszukriegen sein?
 

Anhänge

  • !dlgtest.zip
    19,8 KB · Aufrufe: 17

Neue Beiträge

Zurück