我要实现一个对话框,让这个对话框永远覆盖另一个窗口(m_wndInfo.m_hWnd),所以我起了一个定时器,定时检测m_wndInfo.m_hWnd是否是最前窗口,如果是,则把我这个对话框置顶,如果不是,取消我这个对话框的置顶。但是当m_wndInfo.m_hWnd是最前面的窗口时,我这个窗口立刻置顶,能覆盖住m_wndInfo.m_hWnd。
但是我从任务栏激活了别的窗口时,也就是说别的窗口激活了,m_wndInfo.m_hWnd不再是最前面的窗口,这时我把自己这个窗口取消置顶,此时发现这个还是在最前面,并没有被刷新掉,只能把最后激活的那个窗口拖动一下才可以。
我不知道在::SetWindowPos(GetSafeHwnd(), HWND_NOTOPMOST, 0,0,0,0,SWP_NOACTIVATE|SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE);
在加什么命令?void CMyDialog::OnTimer(UINT_PTR nIDEvent)
{
WINDOWINFO wi;
GetWindowInfo(&wi); if(::GetForegroundWindow() == m_wndInfo.m_hWnd)
{
if(!((wi.dwExStyle & WS_EX_TOPMOST) == WS_EX_TOPMOST))
{
::SetWindowPos(GetSafeHwnd(), HWND_TOPMOST, 0,0,0,0,SWP_NOACTIVATE|SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE);
TRACE("set topmost\r\n");
}
}
else
{
if((wi.dwExStyle & WS_EX_TOPMOST) == WS_EX_TOPMOST)
{
::SetWindowPos(GetSafeHwnd(), HWND_NOTOPMOST, 0,0,0,0,SWP_NOACTIVATE|SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE);
TRACE("set no topmost\r\n");
}
}
}

解决方案 »

  1.   

    SetWindowPos(&wndTopMost , 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE); 
    用这个试试
      

  2.   

    取消确实不意味着这个原先置顶的窗口被别的窗口覆盖啊
    你可以这样
    要么把被激活的其他窗口再次掉到前台
    也就是调用SetForegroundWindow
    或者SetWindowPos设置一下窗口z序
    也就是制定调整到某个窗口的后面
      

  3.   

    谢谢各位。我这样解决了
    ::SetWindowPos(GetSafeHwnd(), HWND_NOTOPMOST, 0,0,0,0,SWP_NOACTIVATE|SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE);::SetWindowPos(GetSafeHwnd(), ::GetetForegroundWindow()
    , 0,0,0,0,SWP_NOACTIVATE|SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE);