Ws_popup

Thomasio

Erfahrenes Mitglied
Ich versuche krampfhaft ein Popup Fenster da auftauchen zu lassen, wo ich das gerne hätte, also entweder im Vordergrund, oder im Hintergrund, aber egal was ich mache, irgendwie funktioniert das nie so wie ich es gerne hätte.

Mal der Reihe nach:

1) Ich starte aus einer anderen Anwendung heraus das Popup

Code:
ShellExecute(0,"open","Popup.exe",0,0,SW_SHOW);

Popup.exe erzeugt ein simples Fenster

Code:
hwnd = CreateWindow(
                     mainclassname,
                     mainwindowname,
                     WS_POPUP,
                     0,0, 300, 200,
                     HWND_DESKTOP,
                     0,hinstance,0
                   );

So weit kein Problem, aber wenn ich jetzt versuche zu bestimmen, ob das Popup im Vordergrund auftauchen soll, oder nicht, dann bekomme ich fast immer das falsche Ergebnis und ich kann nicht mal sagen, WAS im System das unterschiedliche Verhalten beeinflusst.

Theoretisch dürfte SetForegroundWindow() seit WinXP überhaupt nicht mehr funktionieren, zumindest dann nicht, wenn die aufrufende Anwendung nicht selbst im Vordergrund ist.
Das kann man mit ein paar schmutzigen Tricks ala AttachThreadInput() noch umgehen, auch wenn das nicht die feine Art ist.

Mein Problem ist eher wenn ich ohne schmutzige Tricks das Fenster im Vordergrund will, solange die aufrufende Anwendug selber im Vordergrund ist und im Hintergrund, wenn die aufrufende Anwendung im Hintergrund ist, dann kann ich nicht im voraus sagen, ob es im Vordergrund auftaucht oder nicht, das liegt scheinbar am Betriebssystem, macht Unterschiede ob XP oder Vista, oder eins der beiden in einem VirtualPC.
Es scheint sogar Unterschiede zu machen, welche anderen Programme gerade auf dem PC laufen, MSN Messenger oder so, oft führt sogar ein Neustart des PC dazu, dass das Popup sich ohne ersichtlichen Grund plötzlich anders verhält.

Im Moment habe ich ALLE SetForegroundWindow() Befehle im Popup auskommentiert, trotzdem erscheint es (unter Vista Ultimate) IMMER im Vordergrund, selbst dann, wenn die aufrufende Anwendung minimiert ist und ich im Vordergrund irgendwas in Winword arbeite.
Das nervt, und soll so auch nicht sein, aber es gibt ausser der Tatsache, dass es ein WS_POPUP ist NICHTS im Programm, was das Fenster in den Vordergrund holen könnte, trotzdem drängelt es sich immer vor.

Kann mir jemand (für Doofe) erklären, woran das liegt, und wie ich dies zuverlässig regele?
 
Um das Fenster nach vorn zu bringen kann man unter Windows so weit ich weiß SetActiveWindow() benutzen, denke ich (MSDN-Link).
Um das Fenster im Hintergrund aufzurufen fällt mir gerade nur ein, dass man halt ein anderes Fenster nach vorne holen muss.

Sähe dann so aus (dein Beispiel erweitert):
Code:
hwnd = CreateWindow(
                     mainclassname,
                     mainwindowname,
                     WS_POPUP,
                     0,0, 300, 200,
                     HWND_DESKTOP,
                     0,hinstance,0
                   );
SetActiveWindow(hwnd);
 
Zuletzt bearbeitet:
Hallo,

kann man vielleicht erst GetForegroundWindow Aufrufen, das Fenster speichern, und dann nach dem erstellen des Popup's das gespeicherte Fenster wieder setzten mit SetActiveWindow ?

Habs noch nicht getestet aber müsste klappen.

Gruß
Anfänger
 
SetActiveWindow() funktioniert genausowenig wie SetForegroundWindow(), oder besser es dürfte eigentlich nicht funktionieren, solange der aufrufende Thread nicht selbst im Vordergrund ist, steht in den Anmerkungen bei MSDN.

GetForegroundWindow() speichern und wieder setzen funktioniert nur, solange der User nicht aktiv in einer anderen Anwendung arbeitet.
Das Popup würde immer noch im Vordergrund auftauchen, wenn auch nur kurz, und jeder Tastendruck vom User würde kurzzeitig vom Popup abgefangen.
Wenn einer halbwegs schnell 10 Finger tippt, in Winword oder so, verliert er dabei ein paar Zeichen, das ist noch schlimmer als wenn er den Focus ganz verliert, weil er möglicherweise nicht mal merkt, dass ihm ein paar Zeichen verloren gegangen sind.

Was mich bei der ganzen Sache richtig wundert ist, dass das Popup laut MSDN überhaupt nicht im Vordergrund auftauchen dürfte, und ich frage mich, warum es das trotzdem macht.
 
Mit etwas experimentieren bin ich selbst drauf gekommen.
Des Problems Lösung heisst:

SW_SHOWNORMAL

oder besser, eine kleine Abfrage, ob ich es im Vordergrund will oder nicht und dann ShellExecute() entweder mit SW_SHOW oder mit SW_SHOWNORMAL aufrufen.
 
Zurück