cef 框架 获取窗口句柄返回null

调用 GetWindowHandle() 返回null, 且窗口已经创建完成

HWND hwnd = browser->GetHost()->GetWindowHandle(); // hwnd == null 

原因: 此方法在UI 线程中调正常的,在其他线程中会返回null

void test::printHWND(CefRefPtr<CefBrowser> browser){
	if (!CefCurrentlyOn(TID_UI)) {
		// Execute on the UI thread.
		CefPostTask(TID_UI, base::BindOnce(&test::printHWND, this, browser));
		return;
	}
	
	HWND hwnd = browser->GetHost()->GetWindowHandle(); // 正常
}




### DuiLib集成CEF获取窗口消息 在DuiLib中集成了CEF之后,为了能够处理来自CEF浏览器实例的消息,通常需要通过重载特定的消息映射函数并监听感兴趣的Windows消息。对于CEF来说,重要的一点是在创建浏览器之前确保已经正确设置了`CefWindowInfo`结构体中的父窗口句柄以及其它必要属性[^1]。 当涉及到具体实现时,在继承自`UIDialogWnd`或其他适当基类的对话框类里,可以通过覆盖`MessageMap`成员函数来注册额外的消息处理器: ```cpp // 定义新的消息映射表项 BEGIN_MSG_MAP_EX(CMyBrowserDlg) MSG_WM_CREATE(OnCreate) CHAIN_MSG_MAP(__super) END_MSG_MAP() LRESULT CMyBrowserDlg::OnCreate(LPCREATESTRUCT lpCreateStruct){ if (__super::OnCreate(lpCreateStruct) != 0) return -1; // 初始化CEF环境... // 创建CEFBrowser实例... return 0; } ``` 另外,还可以利用宏定义简化这一过程: ```cpp #define MESSAGE_RANGE_HANDLER(msgFirst,msgLast,messageHandler)\ {msgFirst,msgLast,(SUBCLASSPROC)::DefSubclassProc,this,&messageHandler}, void CMyBrowserDlg::InitCustomMsgHandlers(){ AddCustomMessageHandler(MESSAGE_RANGE_HANDLER(WM_USER, WM_APP, OnUserMessages)); } BOOL CMyBrowserDlg::PreTranslateMessage(MSG* pMsg){ // 调用CEF预翻译消息机制 CefDoMessageLoopWork(); return __super::PreTranslateMessage(pMsg); } ``` 上述代码片段展示了如何向现有的消息循环添加自定义处理逻辑,并且确保CEF有机会在其内部执行必要的操作(比如更新渲染状态)。特别是要注意的是`PreTranslateMessage`方法,它允许应用程序提前介入标准的消息分发流程,这对于及时响应键盘输入特别有用[^2]。 最后,针对某些特殊类型的事件(如导航完成、加载进度变化等),应该考虑订阅相应的通知回调接口,例如`CefLifeSpanHandler`或`CefLoadHandler`,以便更精确地控制用户体验[^3]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值