在 Windows 10 中重新映射鼠标事件的最佳方法是什么?

What is the best way to remap mouse events in Windows 10?

我需要捕获并取消任何拖放事件,而是在初始坐标上触发正常点击单击鼠标。

这是为了帮助失去运动功能的残疾人。每当她点击某个东西时,她都会按住按钮并移动,注册一个拖放事件而不是点击。

我已经尝试过软件解决方案(SteadyMouse、X-Mouse Button Control)但无济于事。由于她的痴呆症,行为改变不再是一种选择。

我是一名网络开发人员,所以对 Windows 编程不是很熟悉,但如果对她有帮助,我愿意学习。感谢您的任何想法。

建议可以在用户按下鼠标左键时立即return释放消息事件

使用SendInput和鼠标挂钩,

C++ 代码示例,

#include <Windows.h>
#include <iostream>
#include <thread>

using namespace std;

HHOOK MouseHook;

BOOL WINAPI HandlerRoutine(_In_ DWORD dwCtrlType) 
{
    if (dwCtrlType == CTRL_CLOSE_EVENT)
    {
        UnhookWindowsHookEx(MouseHook);
    }
    return 1;
}

LRESULT __stdcall MouseHookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
    INPUT input{};
    input.type = INPUT_MOUSE;
    input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
    if (nCode >= 0)
    {
        switch (wParam)
        {
        case WM_LBUTTONDOWN:
        {
            SendInput(1, &input, sizeof(INPUT));
            break;
        }
        }
    }
    return CallNextHookEx(MouseHook, nCode, wParam, lParam);
}

void SetHook()
{
    if (!(MouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookCallback, NULL, 0)))
    {
        cout << "Failed to install MouseHook hook!" << endl;
    }
}

int main()
{
    SetConsoleCtrlHandler(HandlerRoutine, 1);
    
    SetHook();
    MSG msg;
    
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    return msg.wParam;
}

更新:

这是快速 gif 演示,我已经更新了部分代码。

新增代码:

BOOL WINAPI HandlerRoutine(_In_ DWORD dwCtrlType) 
{
    if (dwCtrlType == CTRL_CLOSE_EVENT)
    {
        UnhookWindowsHookEx(MouseHook);
    }
    return 1;
}

当您关闭控制台时将调用此回调函数window,该函数包含取消挂钩代码。

注意:安装钩子后,如果不需要钩子需要卸载。如果不及时卸载钩子,会导致鼠标卡住。

使用此应用,拖动事件将被阻止,因为鼠标在按下后会立即收到释放事件。