如何忽略 Windows 中的鼠标点击? (C++)

How to ignore a mouse click in Windows? (C++)

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

如何通过 C++ 告诉 Windows 这个? 我已经让程序识别鼠标点击。只是不知道如何忽略它。

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

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

如果可能,我想避免使用任何外部库。只有 Visual Studio.

附带的标准

非常感谢您的阅读!

您可以使用 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
miHook = 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 必须是包含挂钩过程的模块的实例句柄。此外,您需要发送消息 才能让您的挂钩正常工作!