之前为了解决组合框控件弹出下拉列表窗口与快捷键触发的弹出模态框引起奔溃的问题,考虑到组合框控件的下拉列表窗口在失去焦点时会自动销毁,在弹出模态框前,将焦点设置到主窗口上,从而先使组合框控件的下拉列表窗口销毁,然后再弹出模态框。奔溃的问题是规避了,但是窗口的Z序也被打乱了,显然是不可取的。
后来找到了一个很好的规避方法:检测是否有组合框的下拉列表窗口(且焦点在该窗口上),根据窗口类名及窗口所属进程来判断,如果有,则在弹出模态框之前给该下拉列表窗口发个关闭消息,然后再弹出模态框,相关代码如下所示:
HWND hFocusWnd = ::GetFocus();
TCHAR achClassName[MAX_PATH] = { 0 };
::GetClassName( hFocusWnd, achClassName, sizeof(achClassName)/sizeof(TCHAR) );
if ( !_tcsicmp( achClassName, _T("ComboWnd") ) ) // 是组合框窗口
{
DWORD dwWndProcessId = 0;
::GetWindowThreadProcessId( hFocusWnd, &dwWndProcessId );
DWORD dwCurProcessId = ::GetCurrentProcessId();
if ( dwWndProcessId == dwCurProcessId ) // 是本进程的窗口
{
// 直接将组合框的弹出的下拉窗口关闭掉
::SendMessage( hFocusWnd, WM_CLOSE, 0, 0 );
}
}