2012-09-03 64 views
-1

我有一個代碼來顯示鼠標移動時的一部分屏幕。但WH_MOUSE不起作用。我需要將GetModuleHandle(0), 0更改爲hInst, GetCurrentThreadId()在沒有DLL的情況下全局使用WH_MOUSE

但是,只有當鼠標懸停在應用程序本身上時,應用程序才能工作。

我希望它是全球性的,我試過WH_MOUSE_LL,它比WH_MOUSE慢。

是否有可能在沒有DLL的情況下全局使用WH_MOUSE?

void SetHook() 
{ 
    gMouseHook = SetWindowsHookEx(WH_MOUSE, MouseProc, GetModuleHandle(0), 0); 
} 

//================================================================================ 
// Mouse Hook 

static LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if (nCode < 0) { 
    return CallNextHookEx(gMouseHook, nCode, wParam, lParam); 
    } 

    if (wParam == WM_MOUSEMOVE) { 

    MOUSEHOOKSTRUCT *mouseInfo = (MOUSEHOOKSTRUCT*)lParam; 

    int x = mouseInfo->pt.x; 
    int y = mouseInfo->pt.y; 

    PrintScreen(x, y); 
    } 

    return CallNextHookEx(gMouseHook, nCode, wParam, lParam); 
} 

回答

2

這有可能在全球範圍內使用WH_MOUSE無DLL?

不,鉤子程序需要在一個DLL中,以便它可以被注入到其他進程中。

我試過WH_MOUSE_LL,它比WH_MOUSE慢。

這可能意味着你的鉤子程序很慢。

+0

是的,因爲GetDIBits每次移動鼠標時都會捕獲屏幕並將其打印到我的窗口中。你知道另一種方法來有效地完成這樣的任務嗎? – user565739

+5

@ user565739:你不應該直接在你的鉤子程序中這樣做。您可以在掛鉤程序中設置一個標誌,然後在窗口中有一個計時器來檢查標誌並捕獲屏幕。事實上,如果你使用計時器,你甚至可能不需要掛鉤 - 你可以簡單地檢查鼠標是否從前一個位置移開。 – casablanca

相關問題