使用 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_JOURNALRECORDWH_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注入左键释放

我不认为原始输入替代方案是个好主意。我认为这是不得已的措施。