場景 :
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後,會把此信息通知給控件綁定的回調函數處理