duilib 组合框弹出列表窗口与弹出模态框冲突引起的奔溃问题

针对DUI中组合框弹出列表与模态框导致的程序奔溃问题,提出了两种解决方案:一是通过转移焦点使列表窗口自动销毁,但会引起窗口Z序混乱;二是检测并关闭组合框的下拉列表窗口,以防止冲突,具体实现代码文中提及。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        之前为了解决组合框控件弹出下拉列表窗口与快捷键触发的弹出模态框引起奔溃的问题,考虑到组合框控件的下拉列表窗口在失去焦点时会自动销毁,在弹出模态框前,将焦点设置到主窗口上,从而先使组合框控件的下拉列表窗口销毁,然后再弹出模态框。奔溃的问题是规避了,但是窗口的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 );
		}
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dvlinker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值