如何在Windows中忽略鼠标单击? (C ++)

时间:2016-04-22 10:31:49

标签: c++ windows visual-studio-2015 mouse

我正在尝试制作一个位于后台的程序,可以忽略鼠标点击 - 在程序之外。

如何通过c ++告诉Windows? 我已经让程序识别出鼠标点击。不是如何忽视它。

我需要这样做的原因是因为我的鼠标有一个缺陷,当我只点击一次时它意外地双击(或更多)。

所以基本上,当我用鼠标点击程序注册时,它会让第一次点击,但然后禁用该按钮(忽略每一次跟随)约200毫秒。

如果可能,我想避免使用任何外部库。只有Visual Studio附带的标准版本。

非常感谢您的阅读!

1 个答案:

答案 0 :(得分:3)

您可以使用low-level mouse hook

// Variable to store the hook handle
HHOOK miHook;

// This is the hook procedure
LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) {
    if(nCode == HC_ACTION) {
        MSLLHOOKSTRUCT &msll = *(reinterpret_cast<MSLLHOOKSTRUCT*>(lParam)); // In there is more context if you need it

        if(wParam == WM_LBUTTONDOWN) {
            // Do your logic here
            if(letsIgnoreThisClick) {
                return -1; // This will make the click be ignored
            }
        }
    }

    return CallNextHookEx(miHook, nCode, wParam, lParam); // Important! Otherwise other mouse hooks may misbehave
}

// This is how you install the hook
SetWindowsHookEx(WH_MOUSE_LL, reinterpret_cast<HOOKPROC>(&LowLevelMouseProc), hInstance, 0);

// And this is how you would remove the hook again
UnhookWindowsHookEx(miHook);

此代码示例当然不能按原样使用,但必须根据您的需要进行调整,并且必须将各个部分放在代码中的正确位置。

另请阅读SetWindowsHookEx的备注部分。您可能需要创建一个函数所在的DLL(您可以从主代码中加载它)。我的示例中的hInstance必须是包含钩子过程的模块的实例句柄。此外,您需要提取消息以使您的挂钩正常工作!