【问题标题】:What is the best way to remap mouse events in Windows 10?在 Windows 10 中重新映射鼠标事件的最佳方法是什么?
【发布时间】:2020-12-14 03:51:57
【问题描述】:

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

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

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

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

【问题讨论】:

  • 这与我之前评论过的您之前的问题有何不同?我现在找不到了,你是不是把它删了,然后重新问同样的问题?
  • 抱歉,Remy:最初,我的问题是在哪里聘请开发人员,因此模组将其删除并将其标记为已关闭。我编辑了问题以询问如何做(你评论过),但它仍然被标记为已关闭。我不确定它是否再次可见:这就是我从头开始的原因。你能重新发表你的评论吗?很抱歉给您带来不便。
  • she keeps the button pressed and moves, 鼠标会一直处于未释放状态吗?如果是这样,则很难确定用户下次单击鼠标的时间。例如,用户希望在拖动时继续点击另一个目标。
  • 谢谢,奋斗太阳。她确实在一两秒后松开鼠标,但到那时,指针已经远离初始目标了。
  • 用户按下鼠标左键后,SendInput用来模拟鼠标的释放,这样就无需等待用户手动释放左键。

标签: windows winapi mouse


【解决方案1】:

我建议您可以在用户按下鼠标左键时立即返回释放消息事件。

使用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;
}

这个回调函数会在你关闭控制台窗口时被调用,并且该函数包含了解钩代码。

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

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

【讨论】:

  • 哇;非常感谢您的代码!从我对桌面编程的了解很少,我应该将该代码粘贴到某种编译器中,以生成我可以运行的 EXE?网上有吗?对不起,我是个笨蛋。
  • @Kerans 您可以使用VS2019 来生成exe。由于 exe 的生成依赖于各种库,因此没有合适的在线工具供您使用。对于VS2019中C++代码的使用,this article可以帮助你快速上手。
  • @Kerans 我不确定你擅长哪种编程语言和编译工具。但我可以确定winapi中的SendInputSetWindowsHookEx是你需要的。
  • @Kerans 查看我的更新。您可以使用控制台应用程序或空项目。
  • @strive-sun-msft OMG,这太棒了!我能够编译该程序,它的工作方式完全符合我的需要!我将尽快将它安装在我妈妈的电脑上(连同 TaskbarHide,所以她看不到它),她将能够再次使用电脑!如果有什么方法可以切实地表达我的感激之情,请告诉我!你是如此的慷慨和耐心。一百万谢谢!
猜你喜欢
  • 2010-10-21
  • 2010-11-19
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多