可以用SetWindowPos(&m_pMainWnd->wndTopMost, 0, 0, 0, 0, SWP_NOSIZE)让窗体最前,
但个人感觉这个函数太霸道, 窗体一旦最前,系统如果有MessageBox也给挡住.
所以想用 ShowWindow(SW_SHOWNORMAL);
SetForegroundWindow();
但问题是,这两个函数只能好用一次,后续只能使Frame闪烁,并不能显示窗体内容;拿鼠标点一下才可以.有什么方法可以做到将窗体调整到最前,并且正常显示呢?测试的工程如下:
1.新建一个SDI工程,在MainFrame的OnCreate中加SetTimer(1,3000,NULL);
2.加OnTimer,加入 ShowWindow(SW_SHOWNORMAL);SetForegroundWindow();
测试结果发现: 运行程序,只第一个3秒可以将窗体调到了前台,后面的3秒均是闪烁.

解决方案 »

  1.   

    请楼主阅读一下<Windows核心编程>p649
    “为了制止这种现象,微软对SetForegroundWindow函数增加了更多的智能。特别规定,仅当调用一个子函数的线程已经连接到RIT或者当前与RIT相连接的线程在一定的时间内(这个时间量由SystemParamtersInfo函数和SPI_SETFOREGROUND_LOCKTIMEOUT值来控制)没有仍然输入,这个函数才有效。另外,如果有一个菜单是活动的,这个函数就失效。”
      

  2.   

    SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT,0,0,0);
    AllowSetForegroundWindow(ASFW_ANY);
    SetForegroundWIndow(m_hWnd);
      

  3.   

    SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT,0,0,0);
    之前最好将将原来的值保存,窗口到前台后再还原,以免影响系统中其它程序的行为。
      

  4.   

    1. SetWindowPos(&m_pMainWnd->wndTopMost, 0, 0, 0, 0, SWP_NOSIZE)
    2. SetWindowPos(&m_pMainWnd->wndNoTopMost, 0, 0, 0, 0, SWP_NOSIZE)
      

  5.   

    我也有类似的问题,不过只在背后一个窗口是fullscreen的时候才有。
    顶一下。
    楼主的问题不知道用折中的设置可不可以?
    用BringWindowToTop ,或在setwindowpos的时候用HWND_TOP.
      

  6.   

    SetWindowPos(&m_pMainWnd->wndTopMost, 0, 0, 0, 0, SWP_NOSIZE)
    以后 再调用
    SetWindowPos(&m_pMainWnd->wndNoTopMost, 0, 0, 0, 0, SWP_NOSIZE)
    这样就可以了!