使用 C++ 从 USB 人机接口设备转换事件
Convert events from a USB human interface device using C++
我有一个收集输入的 USB HID 触摸板。默认情况下,当我按下触摸板时,它会生成 carriage return (Enter),当我尝试将其用作鼠标时,它实际上会进入 dragging 状态。
我想要做的是将 carriage return 转换为 mouse click 事件和 拖动状态进入光标移动,没有初始点击部分。
我找到了 raw input 替代方案。但是,我不知道如何将其转换为鼠标 click 和光标 move.
这是与鼠标相关的代码'reading':
LRESULT CALLBACK mouseProc (int nCode, WPARAM wParam, LPARAM lParam)
{
MOUSEHOOKSTRUCT * pMouseStruct = (MOUSEHOOKSTRUCT *)lParam;
if (pMouseStruct != NULL)
{
if(wParam == WM_LBUTTONDOWN)
{
cout<<"clicked"<<endl;
}
printf("Mouse position X = %d Mouse Position Y = %d\n", pMouseStruct->pt.x,pMouseStruct->pt.y);
stringstream sx, sy;
sx << (int) pMouseStruct->pt.x << endl;
sy << (int) pMouseStruct->pt.y << endl;
}
return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
}
然后是键盘部分:
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0)
return CallNextHookEx(NULL, nCode, wParam, lParam);
tagKBDLLHOOKSTRUCT *str = (tagKBDLLHOOKSTRUCT *)lParam;
cout<<str->vkCode<<endl;
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
然后是日志部分:
DWORD WINAPI MyLogger(LPVOID lpParm)
{
HINSTANCE hInstance = GetModuleHandle(NULL);
hMouseHook = SetWindowsHookEx( WH_MOUSE_LL, mouseProc, hInstance, NULL );
hKeyHook = SetWindowsHookEx( WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, NULL );
MSG message;
while (GetMessage(&message,NULL,0,0))
{
TranslateMessage( &message );
DispatchMessage( &message );
}
UnhookWindowsHookEx(hMouseHook);
return 0;
}
注意:我不知道这是否相关,但我想使用 HID 在 windows 系统上的 Chromium 实例中播放。
对于鼠标单击和鼠标移动 - 当您处理来自 HID 的输入时,请使用 SendInput 方法。
点击很简单,鼠标移动尽量获取缩放后的拖动坐标转换为当前屏幕缩放坐标,同样使用SendInput
方法
您还可以跟踪 x、y 方向的位移并进行适当的校准以将它们转换到屏幕 x、y
触摸板就像其他鼠标一样。它生成标准鼠标事件。通过 SetWindowsHookEx()
使用全局 WH_MOUSE
挂钩来全局捕获鼠标事件。要重播它们,请使用 mouse_event()
。或者,分别使用 WH_JOURNALRECORD
和 WH_JOURNALPLAYBACK
挂钩进行捕获和回放。
当你用WH_MOUSE_LL注册钩子时,wparam的可能值为:WM_LBUTTONDOWN, WM_LBUTTONUP、WM_MOUSEMOVE、WM_MOUSEWHEEL、WM_MOUSEHWHEEL、WM_RBUTTONDOWN 或 WM_RBUTTONUP.
我期待一旦WM_LBUTTONDOWN发出,一个相应的WM_LBUTTONUP 必须发出 以防止光标进入拖动状态。
我没有测试这个的设备,但我会尝试下面的调用来防止进入拖动状态。
CallNextHookEx(hMouseHook, nCode, WM_LBUTTONUP, lParam);
或者使用mouse_event
配合MOUSEEVENTF_LEFTUP注入左键释放
我不认为原始输入替代方案是个好主意。我认为这是不得已的措施。
我有一个收集输入的 USB HID 触摸板。默认情况下,当我按下触摸板时,它会生成 carriage return (Enter),当我尝试将其用作鼠标时,它实际上会进入 dragging 状态。
我想要做的是将 carriage return 转换为 mouse click 事件和 拖动状态进入光标移动,没有初始点击部分。
我找到了 raw input 替代方案。但是,我不知道如何将其转换为鼠标 click 和光标 move.
这是与鼠标相关的代码'reading':
LRESULT CALLBACK mouseProc (int nCode, WPARAM wParam, LPARAM lParam)
{
MOUSEHOOKSTRUCT * pMouseStruct = (MOUSEHOOKSTRUCT *)lParam;
if (pMouseStruct != NULL)
{
if(wParam == WM_LBUTTONDOWN)
{
cout<<"clicked"<<endl;
}
printf("Mouse position X = %d Mouse Position Y = %d\n", pMouseStruct->pt.x,pMouseStruct->pt.y);
stringstream sx, sy;
sx << (int) pMouseStruct->pt.x << endl;
sy << (int) pMouseStruct->pt.y << endl;
}
return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
}
然后是键盘部分:
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0)
return CallNextHookEx(NULL, nCode, wParam, lParam);
tagKBDLLHOOKSTRUCT *str = (tagKBDLLHOOKSTRUCT *)lParam;
cout<<str->vkCode<<endl;
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
然后是日志部分:
DWORD WINAPI MyLogger(LPVOID lpParm)
{
HINSTANCE hInstance = GetModuleHandle(NULL);
hMouseHook = SetWindowsHookEx( WH_MOUSE_LL, mouseProc, hInstance, NULL );
hKeyHook = SetWindowsHookEx( WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, NULL );
MSG message;
while (GetMessage(&message,NULL,0,0))
{
TranslateMessage( &message );
DispatchMessage( &message );
}
UnhookWindowsHookEx(hMouseHook);
return 0;
}
注意:我不知道这是否相关,但我想使用 HID 在 windows 系统上的 Chromium 实例中播放。
对于鼠标单击和鼠标移动 - 当您处理来自 HID 的输入时,请使用 SendInput 方法。
点击很简单,鼠标移动尽量获取缩放后的拖动坐标转换为当前屏幕缩放坐标,同样使用SendInput
方法
您还可以跟踪 x、y 方向的位移并进行适当的校准以将它们转换到屏幕 x、y
触摸板就像其他鼠标一样。它生成标准鼠标事件。通过 SetWindowsHookEx()
使用全局 WH_MOUSE
挂钩来全局捕获鼠标事件。要重播它们,请使用 mouse_event()
。或者,分别使用 WH_JOURNALRECORD
和 WH_JOURNALPLAYBACK
挂钩进行捕获和回放。
当你用WH_MOUSE_LL注册钩子时,wparam的可能值为:WM_LBUTTONDOWN, WM_LBUTTONUP、WM_MOUSEMOVE、WM_MOUSEWHEEL、WM_MOUSEHWHEEL、WM_RBUTTONDOWN 或 WM_RBUTTONUP.
我期待一旦WM_LBUTTONDOWN发出,一个相应的WM_LBUTTONUP 必须发出 以防止光标进入拖动状态。
我没有测试这个的设备,但我会尝试下面的调用来防止进入拖动状态。
CallNextHookEx(hMouseHook, nCode, WM_LBUTTONUP, lParam);
或者使用mouse_event
配合MOUSEEVENTF_LEFTUP注入左键释放
我不认为原始输入替代方案是个好主意。我认为这是不得已的措施。