Problem mit SetForegroundWindow

MPVision

Grünschnabel
Hallo,

ich habe eine MFC-Dialogfeld Anwendung in VC++ 6.0 und möchte diese mittels
Code:
::SetForegroundWindow(hWnd);
immer wieder in den Vordergrund holen.

Das Problem ist nun:
Nur beim ersten Aufruf wird das Fenster korrekt aktiviert.
Bei allen weiteren Aufrufen wird nur die Schaltfläche in der Task-Leiste aktiviert.

Hatte evtl. schonmal jemand dieses Problem und kennt Abhilfe?
 
Die Funktion von SetForegroundWindow() wird lt. MSDN wohl noch von einigen Bedingungen beeinflußt; ich habe mir das jetzt nicht genauer angeschaut. Probiere doch mal BringWindowToTop(), evt. auch in Kombination mit SetForegroundWindow().

Gruß
MCoder
 
Hallo,

BringWindowToTop(), SetActiveWindow() und SetFocus hatten leider alle ähnliche Resultate.
Doch wie ich rausgefunden habe handelt es sich hierbei mal wieder nicht um fehlerhafte Funktionen, sondern um ein neues Windows-Feature.

Die neueren Windows-Versionen bringen ein Fenster nicht mehr in den Vordergrund des Desktops. Sie lassen stattdessen die Titelzeile des betroffenen Fensters (inklusive des entsprechenden Eintrags in der Taskleiste, sofern der aufrufende Thread der Vordergrund-Thread ist) blinken, um den Benutzer auf sich aufmerksam zu machen.

Um dieses Verhalten zu umgehen wird die AttachThreadInput() Funktion empfohlen.
Damit muß ich mich aber noch mal in Ruhe auseinandersetzen.

Als schnelles Workaround bietet sich an, vor Aufruf von ::SetForegroundWindow()
einfach eine Benutzereingabe zu simulieren (Tastendruck oder Mausklick).

z.B.:
Code:
	//Benutzereingabe simulieren, Funktionstaste F12
	keybd_event(VK_F12, 0, 0, 0);
	keybd_event(VK_F12, 0, KEYEVENTF_KEYUP, 0);

	//Dialogfenster wieder in den Vordergrund holen
	::SetForegroundWindow(m_hWnd);
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück