2015-06-25 4 views
8

Ich habe ein USB-HID-Touchpad, das Eingang sammelt. Standardmäßig, wenn ich auf das Touchpad drücke erzeugt es Wagenrücklauf (Enter) und wenn ich versuche, es als eine Maus zu verwenden, gibt es tatsächlich einen schleppenden Zustand.Konvertieren von Ereignissen von einem USB-Human-Interface-Gerät mit C++

Was ich tun möchte, ist den Wagenrücklauf in eine Mausklick Ereignisses und den ziehen Zustand in einen Cursor bewegen ohne den ersten Klick Teil zu konvertieren.

Ich fand die raw input Alternative. Ich weiß jedoch nicht, wie man es in Maus umwandelt, klicken Sie und Cursor verschieben Sie. Hier

ist der Code, verantwortlich mit der Maus 'Lesen':

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

dann die Tastatur Teil:

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

dann die Protokollierung Teil:

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

Hinweis: I Ich weiß nicht, ob das relevant ist, aber ich möchte mit dem HID in einer Chromium-Instanz auf einem Windows-System spielen.

+1

Wie würde Ihr transparentes Fenster wissen, ob es ein 'WM_MOUSEMOVE' oder ein' WM_NCMOUSEMOVE' in das darunter liegende Fenster senden soll? – IInspectable

+1

Ich nahm an, das transparente Fenster sollte wissen, senden Sie ein 'WM_NCMOUSEMOVE' (um eine bessere Kontrolle über die 'Ausgabe'), aber ich hielt dies nicht für sehr wichtig. Sollte ich mir Sorgen machen? –

+1

Ein Fenster erhält entweder alle Eingaben oder keine. Wenn Sie die Eingabe filtern möchten, müssen Sie einen Teil dieser Eingabe an die darunter liegenden Fenster weitergeben. 'WM_MOUSEMOVE' ist eine der Nachrichten, die Sie weitergeben möchten, und Sie müssen entscheiden, ob es' WM_MOUSEMOVE' oder 'WM_NCMOUSEMOVE' sein soll. 'WM_MOUSELEAVE' ist eine andere Nachricht, die wahrscheinlich nicht richtig zu bekommen ist, da die vorgeschlagene Konfiguration ein transparentes Fenster enthält. – IInspectable

Antwort

2

Wenn Sie den Haken mit WH_MOUSE_LL, die möglichen Werte von wparam registrieren sind: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_MOUSEHWHEEL, WM_RBUTTONDOWN oder WM_RBUTTONUP.

erwarte ich, dass, sobald die WM_LBUTTONDOWN ausgegeben wird, ein entsprechenden WM_LBUTTONUP hat ausgegeben werden, um den Cursor von Eingabe Ziehen Zustand zu verhindern.

Ich habe nicht das Gerät, um dies zu testen, aber ich würde versuchen, den Anruf unten zu verhindern Drag-State zu betreten.

CallNextHookEx(hMouseHook, nCode, WM_LBUTTONUP, lParam); 

oder verwenden mouse_event mit MOUSEEVENTF_LEFTUP die Freigabe der linken Taste zu injizieren.

Ich denke nicht, dass die rohe Eingabealternative eine gute Idee ist. Ich sehe es als letztes Mittel.

2

Für Mausklick und Mausbewegung - wenn Sie die Eingabe vom HID verarbeiten, verwenden Sie die Methode SendInput.

Der Klick ist einfach, für die Mausbewegung versuchen Sie, die skalierten Schleppkoordinaten zu erhalten und sie in die aktuellen Bildschirmskalakoordinaten zu konvertieren und verwenden Sie auch die SendInput Methode.

Auch können Sie die Verschiebung in x, y verfolgen und entsprechende Kalibrierung machen sie x Bildschirm zu übersetzen, y

2

Das Touchpad nur eine Maus wie jeder andere ist. Es generiert Standard-Mausereignisse. Verwenden Sie einen globalen WH_MOUSE -Hook über SetWindowsHookEx(), um Mausereignisse global zu erfassen. Um sie wiederzugeben, verwenden Sie mouse_event(). Verwenden Sie alternativ alternativ WH_JOURNALRECORD und WH_JOURNALPLAYBACK Hooks für Aufnahme und Wiedergabe.