CEF 中的那些坑
CEF (Chromium Embedded Framework) 的大名也听说很久了,最近因为客户的需求,简单地研究了一下。结果遇到了一个接一个的坑,且慢慢道来。比之前用QtWebkit的坑还要多和深。
其实,这次的程序很简单,主要是构建一个最前端显示的无边框的浏览器窗口,先从远端获取窗口大小和key,然后播放链接中的视频。从CEF1代码包里自带的cefclient下手,在win32下就进行修改。
1. Win32相关的窗口参数和位置设置
2. 去除浏览器窗口的右键菜单
这个问题很无奈,经搜索说是可以通过OnBeforeMenu中阻止菜单弹出。先试试吧。
// ClientHandler implementation. class ClientHandler : public CefClient, public CefLifeSpanHandler, public CefLoadHandler, public CefRequestHandler, public CefDisplayHandler, public CefFocusHandler, public CefKeyboardHandler, public CefPrintHandler, public CefV8ContextHandler, public CefDragHandler, public CefPermissionHandler, public CefGeolocationHandler, public DownloadListener, public CefMenuHandler { // ...
添加了CefMenuHandler,重写 OnBeforeMenu 函数。
// virtual bool OnBeforeMenu(CefRefPtr<CefBrowser> browser, const CefMenuInfo& menuInfo) { return true; }
结果完全无效。
暂时使用直接运行JS命令来绕过这个坑:
document.oncontextmenu = function() {return false;};
3. 去除浏览器窗口的滚动条程序要求不能显示滚动条,但是页面超出了设定的窗口大小,始终无法去除滚动条。尝试各种Windows API 方法。
CefWindowHandle hWnd = browser->GetWindowHandle(); DWORD dwOldStyle = ::GetWindowLongPtr(hWnd, GWL_STYLE); DWORD dwNewStyle = dwOldStyle & (~(WS_HSCROLL|WS_VSCROLL)) ; SetWindowLongPtr(hWnd, GWL_STYLE, dwNewStyle); ShowScrollBar(m_BrowserHwnd, SB_BOTH, FALSE);