RAWMOUSE-Struktur (winuser.h)

Enthält Informationen zum Zustand der Maus.

Syntax

typedef struct tagRAWMOUSE {
  USHORT usFlags;
  union {
    ULONG ulButtons;
    struct {
      USHORT usButtonFlags;
      USHORT usButtonData;
    } DUMMYSTRUCTNAME;
  } DUMMYUNIONNAME;
  ULONG  ulRawButtons;
  LONG   lLastX;
  LONG   lLastY;
  ULONG  ulExtraInformation;
} RAWMOUSE, *PRAWMOUSE, *LPRAWMOUSE;

Member

usFlags

Typ: USHORT

Der Mauszustand. Bei diesem Member kann es sich um eine beliebige sinnvolle Kombination der folgenden Elemente handelt.

Wert Bedeutung

MOUSE_MOVE_RELATIVE0x00
Mausbewegungsdaten sind relativ zur letzten Mausposition. Weitere Informationen zur Mausbewegung finden Sie im folgenden Abschnitt hinweise.

MOUSE_MOVE_ABSOLUTE0x01
Mausbewegungsdaten basieren auf der absoluten Position. Weitere Informationen zur Mausbewegung finden Sie im folgenden Abschnitt hinweise.

MOUSE_VIRTUAL_DESKTOP0x02
Mauskoordinaten werden dem virtuellen Desktop zugeordnet (für ein System mit mehreren Monitoren). Weitere Informationen zur Mausbewegung finden Sie im folgenden Abschnitt hinweise.

MOUSE_ATTRIBUTES_CHANGED0x04
Mausattribute geändert; die -Anwendung muss die Mausattribute abfragen.

MOUSE_MOVE_NOCOALESCE0x08
Dieses Mausbewegungsereignis wurde nicht vereint. Mausbewegungsereignisse können standardmäßig zusammengezeigt werden.
Windows XP/2000: Dieser Wert wird nicht unterstützt.

DUMMYUNIONNAME

DUMMYUNIONNAME.ulButtons

Typ: ULONG

Reserviert.

DUMMYUNIONNAME.DUMMYSTRUCTNAME

DUMMYUNIONNAME.DUMMYSTRUCTNAME.usButtonFlags

Typ: USHORT

Der Übergangszustand der Maustasten. Bei diesem Member kann es sich um einen oder mehrere der folgenden Werte handeln.

Wert Bedeutung

RI_MOUSE_BUTTON_1_DOWN
RI_MOUSE_LEFT_BUTTON_DOWN0x0001
Die linke Schaltfläche wurde in nach unten geändert.

RI_MOUSE_BUTTON_1_UP
RI_MOUSE_LEFT_BUTTON_UP0x0002
Die linke Schaltfläche wurde in "Up" geändert.

RI_MOUSE_BUTTON_2_DOWN
RI_MOUSE_RIGHT_BUTTON_DOWN0x0004
Die rechte Schaltfläche wurde in nach unten geändert.

RI_MOUSE_BUTTON_2_UP
RI_MOUSE_RIGHT_BUTTON_UP0x0008
Die rechte Schaltfläche wurde in "Up" geändert.

RI_MOUSE_BUTTON_3_DOWN
RI_MOUSE_MIDDLE_BUTTON_DOWN0x0010
Die mittlere Schaltfläche wurde in "down" geändert.

RI_MOUSE_BUTTON_3_UP
RI_MOUSE_MIDDLE_BUTTON_UP0x0020
Die mittlere Schaltfläche wurde in "Up" geändert.

RI_MOUSE_BUTTON_4_DOWN0x0040
XBUTTON1 in down geändert.

RI_MOUSE_BUTTON_4_UP0x0080
XBUTTON1 in up geändert.

RI_MOUSE_BUTTON_5_DOWN0x0100
XBUTTON2 in down geändert.

RI_MOUSE_BUTTON_5_UP0x0200
XBUTTON2 in up geändert.

RI_MOUSE_WHEEL0x0400
Unformatierte Eingaben stammen von einem Mausrad. Das Raddelta wird in usButtonData gespeichert.
Ein positiver Wert bedeutet, dass das Rad von dem*der Benutzer*in weg vorwärts gedreht wurde, ein negativer Wert bedeutet, dass das Rad zu dem*der Benutzer*in hin rückwärts gedreht wurde. Weitere Informationen finden Sie im abschnitt "Hinweise".

RI_MOUSE_HWHEEL0x0800
Unformatierte Eingaben stammen von einem horizontalen Mausrad. Das Raddelta wird in usButtonData gespeichert.
Ein positiver Wert gibt an, dass das Rad nach rechts gedreht wurde. Ein negativer Wert gibt an, dass das Rad nach links gedreht wurde. Weitere Informationen finden Sie im abschnitt "Hinweise".
Windows XP/2000: Dieser Wert wird nicht unterstützt.

DUMMYUNIONNAME.DUMMYSTRUCTNAME.usButtonData

Typ: USHORT

Wenn usButtonFlagsüber RI_MOUSE_WHEEL oder RI_MOUSE_HWHEEL verfügt, gibt dieser Member die Entfernung an, die das Rad gedreht wird. Weitere Informationen finden Sie im abschnitt "Hinweise".

ulRawButtons

Typ: ULONG

Der rohe Zustand der Maustasten. Das Win32-Subsystem verwendet diesen Member nicht.

lLastX

Typ: LONG

Die Bewegung in X-Richtung. Dies ist eine signierte relative Bewegung oder absolute Bewegung, abhängig vom Wert von usFlags.

lLastY

Typ: LONG

Die Bewegung in Y-Richtung. Dies ist eine signierte relative Bewegung oder absolute Bewegung, abhängig vom Wert von usFlags.

ulExtraInformation

Typ: ULONG

Die gerätespezifischen zusätzlichen Informationen für das Ereignis.

Hinweise

Wenn sich die Maus bewegt hat, die durch MOUSE_MOVE_RELATIVE oder MOUSE_MOVE_ABSOLUTE angegeben wird, geben lLastX und lLastY Informationen zu dieser Bewegung an. Die Informationen werden als relative oder absolute ganzzahlige Werte angegeben.

Wenn MOUSE_MOVE_RELATIVE Wert angegeben ist, geben lLastX und lLastY die Bewegung relativ zum vorherigen Mausereignis (die letzte gemeldete Position) an. Positive Werte bedeuten, dass die Maus nach rechts (oder nach unten) bewegt wird; negative Werte bedeuten, dass die Maus nach links (oder nach oben) bewegt wird.

Wenn MOUSE_MOVE_ABSOLUTE Wert angegeben wird, enthalten lLastX und lLastY normalisierte absolute Koordinaten zwischen 0 und 65.535. Koordinatenkarten (0,0) in der linken oberen Ecke der Anzeigeoberfläche; Koordinaten (65535,65535) karten auf der unteren rechten Ecke. In einem Multimonitorsystem werden die Koordinaten dem primären Monitor zugeordnet.

Wenn MOUSE_VIRTUAL_DESKTOP zusätzlich zu MOUSE_MOVE_ABSOLUTE angegeben wird, werden die Koordinaten dem gesamten virtuellen Desktop zugeordnet.

case WM_INPUT: 
{
    UINT dwSize = sizeof(RAWINPUT);
    static BYTE lpb[sizeof(RAWINPUT)];

    GetRawInputData((HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER));

    RAWINPUT* raw = (RAWINPUT*)lpb;

    if (raw->header.dwType == RIM_TYPEMOUSE) 
    {
        if (raw->mouse.usFlags & MOUSE_MOVE_ABSOLUTE)
        {
            RECT rect;
            if (raw->mouse.usFlags & MOUSE_VIRTUAL_DESKTOP)
            {
                rect.left = GetSystemMetrics(SM_XVIRTUALSCREEN);
                rect.top = GetSystemMetrics(SM_YVIRTUALSCREEN);
                rect.right = GetSystemMetrics(SM_CXVIRTUALSCREEN);
                rect.bottom = GetSystemMetrics(SM_CYVIRTUALSCREEN);
            }
            else
            {
                rect.left = 0;
                rect.top = 0;
                rect.right = GetSystemMetrics(SM_CXSCREEN);
                rect.bottom = GetSystemMetrics(SM_CYSCREEN);
            }

            int absoluteX = MulDiv(raw->mouse.lLastX, rect.right, 65535) + rect.left;
            int absoluteY = MulDiv(raw->mouse.lLastY, rect.bottom, 65535) + rect.top;
            ...
        }
        else if (raw->mouse.lLastX != 0 || raw->mouse.lLastY != 0)
        {
            int relativeX = raw->mouse.lLastX;
            int relativeY = raw->mouse.lLastY;
            ...
        }
        ...
    }
}

Im Gegensatz zu älteren WM_MOUSEMOVE Meldungen von Raw Input-Mausereignissen nicht den Auswirkungen der Mausgeschwindigkeit, die im Blatt "Mauseigenschaften" des Systemsteuerung festgelegt ist. Weitere Informationen finden Sie unter Übersicht über Mauseingaben .

Wenn das Mausrad bewegt wird, angegeben durch RI_MOUSE_WHEEL oder RI_MOUSE_HWHEEL in usButtonFlags, enthält usButtonData einen kurzen Vorzeichenwert, der die Entfernung angibt, die das Rad gedreht wird.

Die Radumdrehung ist ein Vielfaches von WHEEL_DELTA, das auf 120 eingestellt ist. Dies ist der Schwellenwert für die auszuführende Aktion, und für jedes Delta sollte eine solche Aktion (z. B. das Scrollen um ein Inkrement) erfolgen.

Das Delta wurde auf 120 festgelegt, damit Microsoft oder andere Anbieter genauere Mausräder (ein frei drehendes Mausrad ohne Kerben) bauen können, um mehr Meldungen pro Umdrehung, aber mit einem kleineren Wert in jeder Meldung zu senden. Um diese Funktion zu nutzen, können Sie entweder die eingehenden Delta-Werte addieren, bis WHEEL_DELTA erreicht ist (so dass Sie bei einer Delta-Drehung die gleiche Antwort erhalten), oder Teilzeilen als Antwort auf die häufigeren Meldungen scrollen. Sie können auch Ihre Scrollgranularität auswählen und Deltas akkumulieren, bis diese erreicht ist.

Die Anwendung kann auch die aktuelle Benutzereinstellung zeilen-to-scroll und characters-to-scroll mithilfe der SystemParametersInfo-API mit SPI_GETWHEELSCROLLLINES oder SPI_GETWHEELSCROLLCHARS Parameter abrufen.

Hier ist ein Beispiel für einen solchen Radbehandlungscode:

if ((rawMouse.usButtonFlags & RI_MOUSE_WHEEL) == RI_MOUSE_WHEEL ||
    (rawMouse.usButtonFlags & RI_MOUSE_HWHEEL) == RI_MOUSE_HWHEEL)
{
    static const unsigned long defaultScrollLinesPerWheelDelta = 3;
    static const unsigned long defaultScrollCharsPerWheelDelta = 1;

    float wheelDelta = (float)(short)rawMouse.usButtonData;
    float numTicks = wheelDelta / WHEEL_DELTA;

    bool isHorizontalScroll = (rawMouse.usButtonFlags & RI_MOUSE_HWHEEL) == RI_MOUSE_HWHEEL;
    bool isScrollByPage = false;
    float scrollDelta = numTicks;

    if (isHorizontalScroll)
    {
        unsigned long scrollChars = defaultScrollCharsPerWheelDelta;
        SystemParametersInfo(SPI_GETWHEELSCROLLCHARS, 0, &scrollChars, 0);
        scrollDelta *= scrollChars;
    }
    else
    {
        unsigned long scrollLines = defaultScrollLinesPerWheelDelta;
        SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &scrollLines, 0);
        if (scrollLines == WHEEL_PAGESCROLL)
            isScrollByPage = true;
        else
            scrollDelta *= scrollLines;
    }
}

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows XP [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows Server 2003 [nur Desktop-Apps]
Kopfzeile winuser.h (einschließlich Windows.h)

Siehe auch

Konzept

GetRawInputDeviceInfo

RAWINPUT

Unformatierte Eingabe

Referenz

MOUSEINPUT-Struktur

SendInput-Funktion

MOUSE_INPUT_DATA Struktur

Übersicht über Mauseingaben (Legacy)

Mauseingabebenachrichtigungen (Legacy)

SystemParametersInfo