【问题标题】:Override mouse using Chromium embedded framework使用 Chromium 嵌入式框架覆盖鼠标
【发布时间】:2012-01-03 13:26:35
【问题描述】:
有没有可能在文件cefclient_win.cpp
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
鼠标消息被过滤掉,因为我只通过 WM_MOUSEMOVE 消息?
似乎在WndProc 获取它们之前处理了左键或右键单击。如何特别禁用鼠标右键?
【问题讨论】:
标签:
google-chrome
winapi
mouse
chromium-embedded
【解决方案1】:
我解决它的方法是在 CEF 为每个浏览器窗口创建的线程中添加一个鼠标钩子:
// Hook to disable right mouse clicks
LRESULT CALLBACK MyMouseHook(int nCode, WPARAM wp, LPARAM lp)
{
MOUSEHOOKSTRUCT *pmh = (MOUSEHOOKSTRUCT *) lp;
if (nCode >= 0) {
if( wp == WM_RBUTTONDOWN || wp == WM_RBUTTONUP ) {
return 1;
}
}
return CallNextHookEx(NULL, nCode, wp, lp);
}
void
CefBrowserApplication::OnCreate(
CefRefPtr<CefBrowserClientHandler> aBrowserClient)
{
// Hook the mouse
DWORD threadId = GetWindowThreadProcessId(aBrowserClient->GetBrowser()->GetWindowHandle(), NULL);
HHOOK hook = SetWindowsHookEx(WH_MOUSE, MyMouseHook, NULL, threadId);
}
请注意,我没有使用低级鼠标钩子,因为它们对整个桌面都是全局的。在全局低级挂钩中禁用鼠标右键单击将禁用所有正在运行的应用程序。
【解决方案2】:
问题是 CEF 创建了一个子窗口并且没有将鼠标事件传递给父窗口。我通过安装低级鼠标钩克服了它
/////////////////
// Low-level mouse hook:
//
LRESULT CALLBACK MyMouseHookLL(int nCode, WPARAM wp, LPARAM lp)
{
MSLLHOOKSTRUCT *pmh = (MSLLHOOKSTRUCT *) lp;
if (nCode==HC_ACTION) {
if( wp == WM_RBUTTONDOWN || wp == WM_RBUTTONUP ) {
//gooble it
return 1;
}
}
return CallNextHookEx(g_hHookMouseLL, nCode, wp, lp);
}
g_hHookMouseLL = SetWindowsHookEx(WH_MOUSE_LL, MyMouseHookLL, hInst, 0);