使用C++转换USB人机接口设备中的事件

Convert events from a USB human interface device using C++

本文关键字:事件 人机接口 C++ 转换 USB 使用      更新时间:2023-10-16

我有一个USB HID触摸板,可以收集输入。默认情况下,当我按下触摸板时,它会生成回车(Enter),当我尝试将其用作鼠标时,它实际上会进入拖动状态。

我想做的是将回车转换为鼠标点击事件,并将拖动状态转换为光标移动,而不需要初始点击部分。

我找到了原始输入的替代方案。但是,我不知道如何将其转换为鼠标单击和光标移动

以下是负责鼠标"读取"的代码:

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 = %dn", 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实例中播放。

当您用WH_MOUSE_LL注册钩子时,wparam的可能值为:WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE、WM_MOUSEWHEEL、WM_MUSEWHEEL、WM_RBUTTONOWN或WM_RBUTTONUP。

我预计,一旦发出WM_LBUTTONDOWN,就必须发出相应的WM_LBUTTUNUP以防止光标进入拖动状态。

我没有设备来测试这个,但我会尝试下面的调用,以防止进入拖动状态。

CallNextHookEx(hMouseHook, nCode, WM_LBUTTONUP, lParam);

或者将mouse_eventMOUSEEVENTF_LEFTUP一起使用来注入左按钮的释放。

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

触摸板就像其他鼠标一样。它生成标准的鼠标事件。通过SetWindowsHookEx()使用全局WH_MOUSE挂钩全局捕获鼠标事件。要重播它们,请使用mouse_event()。或者,分别使用WH_JOURNALRECORDWH_JOURNALPLAYBACK挂钩进行捕获和播放。

对于鼠标点击和鼠标移动-当您处理来自HID的输入时,请使用SendInput方法。

点击很容易,对于鼠标移动,尝试获得缩放后的拖动坐标,并将其转换为当前屏幕缩放坐标,还可以使用SendInput方法。

您还可以跟踪x,y中的位移,并进行适当的校准,将其转换为屏幕x,y