Devicehandle bei WM_MOUSEWHEEL



  • Wie finde ich das handle des Gerätes raus welches einen WM_MOUSEWHEEL auslöst?

    Ich habe bereits versucht anstatt der WM_MOUSEWHEEL Nachricht WM_INPUT abzufangen und dort in den ButtonFlags des RAWINPUTMOUSE structs nach 0x0400 (ich glaub RI_MOUSEWHEEL oder sowas) ausschau zu halten und den ButtonData Wert zu interpretieren.
    Ich verwende leider kein C++ will aber trotzdem einen fetzen code anhängen:

    RAWINPUT ri = new RAWINPUT();
    retval = WinApi.GetRawInputData( devicehandle, RawInputCommand.Input, out ri, ref pcbSize, Marshal.SizeOf( typeof( RAWINPUTHEADER ) ) );
    
    if ((ri.Mouse.ButtonFlags & RawMouseButtons.MouseWheel) > 0)
    {
      if ((short)ri.Mouse.ButtonData > 0)
      {
        data.Z += ri.Mouse.ButtonData;
      }
      if ((short)ri.Mouse.ButtonData < 0)
      {
        data.Z -= ri.Mouse.ButtonData;
      }
    }
    

    Leider hat der Ansatz nicht funktioniert. Die Werte die Z annahmen haben nur geringfügig mit dem scrollen des Scrollrad koreliert.
    Ich vermute das das Beispiel auf pinvoke.net, welches ich hierfür verwendet habe, nicht vollständig ist.
    Hat jemand eine Ahnung wie ich das am besten lösen kann?



  • Nur aus Interesse: Wofür brauchst du denn das Device-Handle?



  • Ich implementiere ein Eingabeframework, welches die Anwendung in die Lage versetzt (fast) alle möglichen Eingabegeräte zu verwenden.
    Unter anderem auch mehr als eine Maus.
    Daher muss ich wissen an welcher Maus das Mausrad bewegt wurde.



  • Nicht mal jemand ne Referenz auf Material was helfen könnte?
    MSDN, Pinvoke sowie ein paar opensource Multitouch-Frameworks waren bisher meine einzige Hilfe.


  • Mod

    HAst Du die Doku zu RegisterRawInputDevices und WM_INPUT gelesen?



  • Jap, hab ich gelesen und auch verwendet.
    Leider nicht auf dem Code Ausschnitt oben zu sehen.

    Also Mausbewegungen und -klicks bekomm ich einwandfrei, nur das Scrollrad liefert mir Müll.



  • Ich registriere die Mäuse mit:

    RAWINPUTDEVICE device = new RAWINPUTDEVICE();
    device.WindowHandle = new WindowInteropHelper( target ).Handle;
    device.UsagePage = 0x01;
    device.Usage = 0x02;
    device.Flags = RawInputDeviceFlags.InputSink;
    WinApi.RegisterRawInputDevice( device );
    
    m_HwndSourceHook = new HwndSourceHook( InputProc );
    m_HwndSource = HwndSource.FromHwnd( new WindowInteropHelper( target ).Handle );
    

    wobei target eine Instanz der Klasse Window (.Net 3.5) ist



  • bump

    keiner?
    Sehr schade. Jemand ne Idee in welchem Forum ich da noch posten könnte?


Anmelden zum Antworten