【问题标题】:Use WH_MOUSE globally without DLL在没有 DLL 的情况下全局使用 WH_MOUSE
【发布时间】:2012-08-28 12:41:31
【问题描述】:

我有一个代码可以在鼠标移动时显示屏幕的一部分。但是 WH_MOUSE 不起作用。我需要将GetModuleHandle(0), 0 更改为hInst, GetCurrentThreadId()

但只有当鼠标悬停在应用程序本身上时,该应用程序才会工作。

我希望它是全局的,我尝试了 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);
}

【问题讨论】:

    标签: c winapi hook mouseevent mousemove


    【解决方案1】:

    是否可以在没有 DLL 的情况下全局使用 WH_MOUSE?

    不,挂钩过程需要在 DLL 中,以便可以注入到其他进程中。

    我试过WH_MOUSE_LL,比WH_MOUSE慢。

    这可能意味着你的钩子程序很慢。

    【讨论】:

    • 是的,因为每次移动鼠标时它都会通过 GetDIBits 捕获屏幕并将其打印到我的窗口中。您知道另一种有效完成此类任务的方法吗?
    • @user565739:你不应该直接在你的钩子过程中这样做。您可以在挂钩过程中设置一个标志,然后在您的窗口中有一个计时器来检查标志并捕获屏幕。事实上,如果你使用定时器,你甚至可能不需要一个钩子——你可以简单地检查鼠标是否已经从之前的位置移动了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多