簡體   English   中英

使用C ++從USB人機接口設備轉換事件

[英]Convert events from a USB human interface device using C++

我有一個USB HID觸摸板,可以收集輸入。 默認情況下,當我按下觸摸板時,它會生成回車符 (回車),當我嘗試將其用作鼠標時,它實際上會進入拖動狀態。

我想要做的是將回車轉換為鼠標單擊事件,並將拖動狀態轉換為光標移動而不使用初始單擊部件。

我找到了原始輸入替代品。 但是,我不知道如何將其轉換為鼠標單擊和光標移動

以下是負責鼠標“閱讀”的代碼:

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);

或者使用帶有MOUSEEVENTF_LEFTUP的 mouse_event來注入左鍵的釋放。

我認為原始輸入選擇不是一個好主意。 我認為這是最后的手段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM