可以用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秒均是闪烁.
但个人感觉这个函数太霸道, 窗体一旦最前,系统如果有MessageBox也给挡住.
所以想用 ShowWindow(SW_SHOWNORMAL);
SetForegroundWindow();
但问题是,这两个函数只能好用一次,后续只能使Frame闪烁,并不能显示窗体内容;拿鼠标点一下才可以.有什么方法可以做到将窗体调整到最前,并且正常显示呢?测试的工程如下:
1.新建一个SDI工程,在MainFrame的OnCreate中加SetTimer(1,3000,NULL);
2.加OnTimer,加入 ShowWindow(SW_SHOWNORMAL);SetForegroundWindow();
测试结果发现: 运行程序,只第一个3秒可以将窗体调到了前台,后面的3秒均是闪烁.
“为了制止这种现象,微软对SetForegroundWindow函数增加了更多的智能。特别规定,仅当调用一个子函数的线程已经连接到RIT或者当前与RIT相连接的线程在一定的时间内(这个时间量由SystemParamtersInfo函数和SPI_SETFOREGROUND_LOCKTIMEOUT值来控制)没有仍然输入,这个函数才有效。另外,如果有一个菜单是活动的,这个函数就失效。”
AllowSetForegroundWindow(ASFW_ANY);
SetForegroundWIndow(m_hWnd);
之前最好将将原来的值保存,窗口到前台后再还原,以免影响系统中其它程序的行为。
2. SetWindowPos(&m_pMainWnd->wndNoTopMost, 0, 0, 0, 0, SWP_NOSIZE)
顶一下。
楼主的问题不知道用折中的设置可不可以?
用BringWindowToTop ,或在setwindowpos的时候用HWND_TOP.
以后 再调用
SetWindowPos(&m_pMainWnd->wndNoTopMost, 0, 0, 0, 0, SWP_NOSIZE)
这样就可以了!