首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用C++从USB人机界面设备转换事件

使用C++从USB人机界面设备转换事件
EN

Stack Overflow用户
提问于 2015-06-25 13:36:54
回答 3查看 1.4K关注 0票数 8

我有一个USB触摸屏,收集输入。默认情况下,当我按下触摸屏时,它会生成回车返回 (Enter),当我尝试将它作为鼠标使用时,它实际上进入了拖放状态。

我想要做的是将回车返回转换为鼠标单击事件,并将拖动状态为游标移动,而不使用初始单击部分。

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

下面是鼠标“读取”的代码:

代码语言:javascript
复制
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);
}

然后键盘部分:

代码语言:javascript
复制
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);
}

然后是日志记录部分:

代码语言:javascript
复制
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实例中播放。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-07 11:27:30

当您向WH_MOUSE_LL注册钩子时,wparam的可能值是:WM_LBUTTONDOWN、WM_LBUTTONUP__、WM_MOUSEMOVE、WM_MOUSEWHEEL、WM_MOUSEHWHEEL、WM_RBUTTONDOWN或WM_RBUTTONUP。

我期望一旦发出WM_LBUTTONDOWN,就必须向发出相应的 WM_LBUTTONUP ,以防止游标进入拖放状态。

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

代码语言:javascript
复制
CallNextHookEx(hMouseHook, nCode, WM_LBUTTONUP, lParam);

或者使用mouse_event和MOUSEEVENTF_LEFTUP注入左侧按钮的发布。

我不认为原始输入替代方案是个好主意。我认为这是最后的手段。

票数 2
EN

Stack Overflow用户

发布于 2015-06-25 14:00:34

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

单击很容易,因为鼠标移动,尝试获取缩放的拖动坐标,并将其转换为当前屏幕缩放坐标,并使用SendInput方法。

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

票数 2
EN

Stack Overflow用户

发布于 2015-07-06 20:08:34

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31051979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档