2012-01-03 62 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);