在 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,该函数包含取消挂钩代码。
注意:安装钩子后,如果不需要钩子需要卸载。如果不及时卸载钩子,会导致鼠标卡住。
使用此应用,拖动事件将被阻止,因为鼠标在按下后会立即收到释放事件。
我需要捕获并取消任何拖放事件,而是在初始坐标上触发正常点击单击鼠标。
这是为了帮助失去运动功能的残疾人。每当她点击某个东西时,她都会按住按钮并移动,注册一个拖放事件而不是点击。
我已经尝试过软件解决方案(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,该函数包含取消挂钩代码。
注意:安装钩子后,如果不需要钩子需要卸载。如果不及时卸载钩子,会导致鼠标卡住。
使用此应用,拖动事件将被阻止,因为鼠标在按下后会立即收到释放事件。