场景 :
CEF浏览器网页全屏时,点击ESC 按键,窗口没有获得ESC按键消息
解决:
CEF添加ESC按键通知
BrowserHandler 添加CefKeyboardHandler 按键处理基类
//按键按下事件
virtual bool OnPreKeyEvent(CefRefPtr<CefBrowser> browser,
const CefKeyEvent& event,
CefEventHandle os_event,
bool* is_keyboard_shortcut);
virtual bool OnKeyEvent(CefRefPtr<CefBrowser> browser,
const CefKeyEvent& event,
CefEventHandle os_event);
bool BrowserHandler::OnPreKeyEvent(CefRefPtr<CefBrowser> browser,
const CefKeyEvent& event,
CefEventHandle os_event,
bool* is_keyboard_shortcut)
{
if (event.type != KEYEVENT_CHAR)
{
if (event.windows_key_code == VK_F5)//F5刷新
{
browser->Reload();
//browser->ReloadIgnoreCache();//重新加载当前页面,忽略任何缓存的数据
}
else if (event.windows_key_code == VK_F12)
{
ShowDevTool(browser);
}
else if (event.windows_key_code == VK_ESCAPE)
{
if (handle_delegate_)
handle_delegate_->OnClickedEsc();
}
}
return false;
}
bool BrowserHandler::OnKeyEvent(CefRefPtr<CefBrowser> browser,
const CefKeyEvent& event,
CefEventHandle os_event)
{
return false;
}
通过代理类HandlerDelegate 把CEF消息传给duilib窗口控件
class HandlerDelegate :
{
virtual void OnClickedEsc() = 0; //浏览器中点击了ESC
}
class CefControlBase : public Control, public nim_cef::BrowserHandler::HandlerDelegate
{
//给控件添加一个ESC按下后的回调
void AttachClickedEscCallback(const OnClickedEscEvent& callback)
{
cb_ClickedEsc = callback;
}
}
//实现基类纯虚函数
void CefControlBase::OnClickedEsc()
{
if (cb_ClickedEsc)
cb_ClickedEsc();
}
这样点击ESC后,会把此信息通知给控件绑定的回调函数处理