进程间窗体置顶
最近遇到一个跟Windows(不是指操作系统,而是一个::CreateWindow的结果)有关的问题。
情况是这样的,通常的应用程序内的事件传递一般场景都是类似在窗体A上点击按钮1,弹出一个窗体B。面对这样的场景只要::SetWindowActive(HWND wnd)即可,这里其实有个隐含的前提,就是wnd的父窗口是出于TOP的状态,也就是它的父窗口是置顶的,也就是我们能够在界面上看到它,否则你的其他置顶窗口将依旧置顶。
下面的代码示意了如何将窗口置顶,因为也没有对各个方法做深入分析,所以就不多发表言论了:
/*场景: 目标:将子窗口放到置顶(且是HWND_TOP)模式 说明:hMainWnd是主窗口,m_pMMessageWnd->m_hWnd是子窗口 */ /*1、将窗口从后台直接提到最前方,需要先将主窗口移上来。*/ HWND hMainWnd = CFramework::GetInstance()->GetMainWnd(); if( hMainWnd != NULL ) { SetForegroundWindow(hMainWnd); BringWindowToTop(hMainWnd); SetActiveWindow(hMainWnd); SetWindowPos( hMainWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW ); } /*2、将子窗口置顶*/ if( m_pMMessageWnd != NULL ) /* true */ { SetForegroundWindow(m_pMMessageWnd->m_hWnd); BringWindowToTop(m_pMMessageWnd->m_hWnd); SetActiveWindow(m_pMMessageWnd->m_hWnd); SetWindowPos( m_pMMessageWnd->m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW ); SetWindowPos( m_pMMessageWnd->m_hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW ); } /*3、放在后面的原因是避免子窗口还未弹出,点击窗体外的时候被放到后面去,所以等窗口出来后再取消置顶*/ if( hMainWnd != NULL ) { SetWindowPos( hMainWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW ); } /*4、避免被主窗口给压了*/ if( m_pMMessageWnd != NULL ) /* true */ { SetWindowPos( m_pMMessageWnd->m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW ); SetWindowPos( m_pMMessageWnd->m_hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW ); }