2012-01-03 57 views
3

是否有可能在文件cefclient_win.cpp覆盖鼠标使用铬嵌入式框架

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 

鼠标消息被过滤掉,因为我只打通WM_MOUSEMOVE消息?

WndProc获得它们之前,似乎要处理左键或右键单击。如何禁用特定的鼠标右键单击?

回答

2

我解决的方式,它是通过将鼠标挂钩由CEF为每个浏览器窗口中创建线程战胜它不使用低级别的鼠标钩子,因为它们对于整个桌面都是全局的。在全局低级别钩子中禁用鼠标右键单击可以禁用所有正在运行的应用程序。

+0

你的方式是正确的 – Ulterior 2012-10-03 06:24:44

+0

任何机会,你可以在c#中解释这一点吗? – 2014-05-30 10:18:45

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); 
} 

请注意,我:我通过安装低级鼠标钩子

///////////////// 
// 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);