SetForegroundWindow funzt net korrekt.



  • Also hier ist der Code nochmal den ich von dir übernomen habe. CVllt. übersehe ich ja doch noch einen Fehler

    BOOL CMyView::ForceForegroundWindow(HWND hWnd)
    {
        if(!hWnd || !::IsWindow(hWnd))
            return FALSE;
    
        HWND hWndCurrentWindow = ::GetForegroundWindow();
        if(hWndCurrentWindow == NULL)
        {
            return ::SetForegroundWindow(hWnd);
        }
    
        DWORD dwCurProcId, dwCurThreadId = ::GetWindowThreadProcessId(hWndCurrentWindow, &dwCurProcId);
        DWORD dwHWndProcId;
        ::GetWindowThreadProcessId(hWnd, &dwHWndProcId);
    
        BOOL bReturn = FALSE;
    
        if(dwHWndProcId == dwCurProcId)
        {
            bReturn = ::SetForegroundWindow(hWnd);
        }
        else
        {
            DWORD dwMyThreadId = ::GetCurrentThreadId();
    
            if(::AttachThreadInput(dwMyThreadId, dwCurThreadId, TRUE))
            {
                bReturn = ::SetForegroundWindow(hWnd);
                ::AttachThreadInput(dwMyThreadId, dwCurThreadId, FALSE);
            }
            else
            {
                bReturn = ::SetForegroundWindow(hWnd);
            }
        }
    
        return bReturn;
    }
    

  • Mod

    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:(


  • Mod

    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 so

    Das 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.
    Mit

    SetForegroundWindow( 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


  • Mod

    Ist Dein Fenster in diesem Moment auch wirklich enabled?


Anmelden zum Antworten