SetForegroundWindow funzt net korrekt.
-
Der Code ist korrekt.
Debúgge doch mal rein, was passiert.
Läuft er wirklich in den AttachThreadInput rein...
-
Das ist ja das seltsame, beim Debuggen klappt es.
Aber kaum mach ich den Release ist es nicht mehr so
-
So ich habe jetzt echt alles durchprobiert aber nichts hilft.
Ich denek es liegt wirklich daran, dass ich dei Option während der Laufzeit ausschalten und wieder einschalten kann.
Laut MSDN soll SetForegroundWindow auch nur funktionieren wenn die Applikation im Vordergrund gestartet wurde.Aber ich kann mir nicht vorstellen, dass es gar keine Möglichkeit gibt dieses zu umgehen. Unter Vista läuft es ja auch perfekt.

-
So habe es endlich gelöst.
So läuft es unter allen 3 Betriebssystemvarianten.
View->SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); View->ShowWindow(SW_SHOW); View->SetForegroundWindow();
-
Uppps da war ich etwas vorschnell,
so läuft es unter XP und Vista aber nicht unter Windows 2003:(
-
Entweder ShowWindow zuerst, aber Du kannst es Dir sparen wenn Du in SetWindowPos SWP_SHOWWINDOW verwendest.
-
Das hilft leider alles nichts.
Jetzt hatte ich die Idee, alle geöffneten Fenster iterieren und schließen bis
mein Fenster gefunden ist. So wie ich es momentan mache, funktioniert es wenn ein Fenster im Vordergrund steht//hWnd = Handle auf mein Fenster, hole ich mir über myView->GetSafeHwnd() dwMyThreadId = ::getWindowThreadProcessId(hWnd, &dwMyProcId); hWndCurWindow = ::GetForegroundWindow(); hWndCurWindow = ::GetWindow(hWndCurWindow, GW_HWNDFIRST); dwCurThreadId = ::GetWindowThreadProcessId(hWndCurWindow, &dwCurProcId); while(hWndCurWindow) { if(hWnd != hWndCurWindow) { hWndCurWindow = ::GetWindow(hWndCurWindow, GW_HWNDNEXT); dwCurThreadId = ::GetWindowThreadProcessId(hWndCurWindow, &dwCurProcId); } }Wenn ich das ganze nun allerdings iteriere und mehrere Fenster in den Hintergrund lege, findet die Methode aber mein Fenster nicht. Sprich ich kann über die Fenster iterieren, s findet sich nur kein gleiches HWND und auch keine gleiche ProcessID oder ThreadID.
Was mach ich hier falsch?
Wahrscheinlich ist der ganze Ansatz falsch...
-
Das ist ja das seltsame, beim Debuggen klappt es.
Aber kaum mach ich den Release ist es nicht mehr soDas ist ein Effekt, den ich mit VC schon oft hatte. Hast Du in der Release schon einmal versucht, die Optimierung auszuschalten?
Ansonsten habe ich in einer Applikation von mir einen Thread, der den Handle auf den Mainframe kennt.
MitSetForegroundWindow( hMainFrm ); ShowWindow( hMainFrm, SW_SHOW );wird meine Applikation in den Vordergrund gesetzt (benutze ich dafür, um einen Mehrfachstart meines Programmes zu verhindern).
Gruss, Gio
-
Wie komme ich denn über meine ViewKlasse auf den Handle des MainFrm?
-
Fange doch einfach die Nachricht zum Aktivieren anstatt in deiner Viewerklasse im Mainframe ab. Der hat ja seinen Handle "m_hWnd".
Gruß, Gio
-
Ist Dein Fenster in diesem Moment auch wirklich enabled?