2012-09-03 82 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

相关问题