使用C ++

时间:2015-06-25 13:36:55

标签: c++ winapi events hid

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

我想要做的是将回车转换为鼠标点击事件,将拖动状态转换为游标移动,没有初始点击部分。

我找到了raw input替代品。但是,我不知道如何将其转换为鼠标点击和光标移动

以下是负责鼠标的代码':

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实例中播放。

3 个答案:

答案 0 :(得分:2)

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

点击很简单,鼠标移动尝试获取缩放的拖动坐标并将它们转换为当前的屏幕比例坐标,并使用SendInput方法。

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

当您使用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 一起注入左侧按钮的发布。

我不认为原始输入选择是个好主意。我认为这是最后的手段。