Fenster im Vordergrund
-
Hallo, eine Frage:
Ich hab ein Windows Programm geschrieben, das wenn es eine bestimmte Windows Message erhält, ein anderes Fenster in der Vordergrund setzen soll (und sich gleichtzeitig dabei dahinter, was aber wahrscheinlich sowieso zwangsläufig geschieht). Hab dazu die Funktion SetForegroundWindow(meinfenster) benutzt, nur funktioniert das alles nicht ganz so wie ich will.
Erscheint diese bestimmte Windows Message auf die mein Programm reagieren soll, so aktiviert es zwar dieses Fenster, jedoch bleibt es in der Taskleiste zurück und blinkt nur Orange. Sobald ich dann meine Programm schließe, poppt es in den Vordergrund.Die Frage nun, wieso poppt es erst zum Schluss nach Schließen meines Programmes auf und nicht gleich beim ersten Aufruf von SetForegroundWindow() ?
Mfg Felsen
-
Ist das neue Fenster eine neue Anwendung oder nur ein weiteres Child-Fenster derselben Anwendung? Danach richtet sich, was zu machen ist.
-
Eine ganz andere Anwendung, hat nichts mit meinem Programm zu tun.
Ich hab noch ein Paar Informationen die beim Lösen des Problems vielleicht hilfreich sein könnten.
Bei der Message auf die mein Programm reagieren soll handelt es sich um eine WM_ACTIVATE Message, die wiederrum noch genauer nach dem Wert von wParam abgetastet wird, und nur dann reagiert, wenn der Wert WA_INACTIVE beträgt, d.h. jedesmal wenn mein Programm inaktiv geschaltet wird, weil ein anderes Fenster aktiv wird, soll es ein nochmals anderes Fenster in der Fordergrund schalten.Ich habe das Programm einmal ohne die Funktion SetForegroundWindow laufen lassen, und die an ihm einlaufenden Messages mittels Winspektor analysiert, dabei hab ich festgestellt, dass nur eine WN_ACTIVATE Message an mein Fenster geschickt wird.
Das andere mal hab ich die Funktion SetForegroudnWindow wieder miteingebaut und es ebenfalls unter der Analyse von Winspektor laufen lassen, dabei ist etwas seltsames passiert. Nachdem mein Programm die erste WM_ACTIVATE Message bekommen hat, hat es scheinbar sofort das Fenster in der Vordergrund gepoppt, und dadurch nochmal eine WM_ACTIVATE Meldung bekommen, und auf diese nochmals mit der SetForegroundWindow Funktion reagiert und das immer und immer wieder. Denn im Log von Winspektor finde ich erst etwa 20 WM_AKTIVATE Aufrufe, und erst danach !!!, die 20 Rückgabewerte, dieser Funktionen. (Normalerweise kommt ja die Rückgabe sofort nach der Abarbeitung der Message)Was ich aber nun nicht verstehe, bei der ersten WM_AKTIVATE Message müsste mein Program doch schon im Hintergrund sein, und daher gar nicht mehr auf weitere WM_ACTIVATE Messages reagieren. Wieso dann diese Endlosschleife?
-
Für die Kommunikation zwischen verschiedenen Anwendungen benötigt man in jedem Fall die Hauptfenster-Handles derselben. Dann schickt man geeignete Nachrichten herüber und reagiert darauf wie man gerade möchte.
-
Das Programm das in den Vordergrund geschalten wird und auf das reagiert werden soll, ist keines das ich geschrieben habe, ich kann in dessen Quellcode also nicht eingreifen und daher auch keine Message an mein Programm senden.
Die einzige Möglichkeit ob ein Fenster aufpoppt, ist daher festzustellen ob sich der Status meines Fenster ändert, und das mache ich mit WM_ACTIVATE.
Wenn meine obige Analyse stimmt, dann liegt das Problem ja eigentlich nur noch darin, warum mein Programm auch weiterhin WM_ACTIVATE Messages erhält, wenn es doch schon durch das aufpoppende Fenster in den Hintergrund verbannt wurde.
Mfg Felsen
-
So ganz verstehe ich Dein Problem immer noch nicht. Ein eigenes Programm sowie ein fremdes Programm kann man einfach mit ShowWindow(hwndProgramm,SW_SHOWMINIMIZE) und ShowWindow(hwndProgramm,SW_SHORNORMAL) in den Hintergrund schicken und daraus wieder hervorholen. Was du machst, kann ich nicht nachvollziehen. Voraussetzung ist natürlich, man hat beide Fenster-Handles. WM_ACTIVATE usw. braucht man da eigentlich nicht. Vielleicht hilft dir das weiter.
-
Guck' mal
http://msdn.microsoft.com/en-us/library/ms632668(VS.85).aspxAbschnitt "Remarks"