窗口被遮住,但是用SetWindowPos(myHWND , HWND_TOP , 0 , 0 , 0 , 0 ,SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE) 不能把它显示到前面。我的程序要求把窗口显示到前面,又不能触发WM_WINDOWPOSCHANGING、WM_ACTIVATE、WM_NCCALCSIZE这几个消息,请高手指教。

解决方案 »

  1.   

    使用 SetForegroundWindow 或 BringWindowToTop 可以吗?
      

  2.   

    BringToTop
    SetForegroundWindow
    SetWindowPos(myHWND , HWND_TOPMOST , 0 , 0 , 0 , 0 , SWP_NOSIZE | SWP_NOMOVE) 
    总能折腾出来吧
      

  3.   

    void BringWindowToTop(HWND hWnd)
    {
    if (::IsWindow(hWnd))
    {
    ::SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);
    ::SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);
    }
    }
      

  4.   

    先把窗体风格改成HWND_TOPMOST,然后再设回来,这样既达到了窗口显示到前面效果,又能保证窗体的属性不变
      

  5.   

    SWP_NOSIZE | SWP_NOMOVE | SWP_NOSENDCHANGING
    当前进程必须是前台进程。
      

  6.   

    SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE); 
      

  7.   

    ::SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);
    ::SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE); 
    这种形式将窗口置顶以后,如果点击了标题栏,再点其它窗口,被设置的窗口会继续挺在顶层,如果不点标题栏倒是没事SetForegroundWindow、BringWindowToTop都会触发WM_ACTIVATE消息SWP_NOSIZE | SWP_NOMOVE | SWP_NOSENDCHANGING组合也不行,我是要将word、excel前置,这两个东东是前台进程吧?
      

  8.   

    用了::SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);
    ::SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE); 可能还导致一个问题,点击“显示桌面”按钮,有时候会导致任务栏消失,按“开始”按钮又能显示出来,相当郁闷
      

  9.   

    SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
    ::SetWindowPos(this->GetSafeHwnd(),HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
    只能在窗口运行过程中保持是最前面的,除非修改属性TopMost为true
      

  10.   

    hWnd为窗口的句柄
    ::SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE) ; 
    这样可以设置窗口为最前面窗口,在ON_WM_NCACTIVATE()事件中,BOOL CIdeDlg::OnNcActivate(BOOL bActive) 
    {
    // TODO: Add your message handler code here and/or call default SetWindowPos(&wndNoTopMost,0,0,0,0,SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE);
    return CDialog::OnNcActivate(bActive);
    }
    即可显示后面。