Freigeben über


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;

Angehörige

usFlags

Typ: USHORT-

Der Mauszustand. Dieses Mitglied kann eine beliebige vernünftige Kombination der folgenden Sein.

Wert Bedeutung
MOUSE_MOVE_RELATIVE
0x00
Mausbewegungsdaten sind relativ zur letzten Mausposition. Weitere Informationen zur Mausbewegung finden Sie im folgenden Abschnitt "Hinweise".
MOUSE_MOVE_ABSOLUTE
0x01
Mausbewegungsdaten basieren auf absoluter Position. Weitere Informationen zur Mausbewegung finden Sie im folgenden Abschnitt "Hinweise".
MOUSE_VIRTUAL_DESKTOP
0x02
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_CHANGED
0x04
Mausattribute geändert; die Anwendung muss die Mausattribute abfragen.
MOUSE_MOVE_NOCOALESCE
0x08
Dieses Mausbewegungsereignis wurde nicht zusammengeklammert. Mausbewegungsereignisse können standardmäßig zusammengeklammert 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 Element kann es sich um einen oder mehrere der folgenden Werte handeln.

Wert Bedeutung
RI_MOUSE_BUTTON_1_DOWN
RI_MOUSE_LEFT_BUTTON_DOWN
0x0001
Die linke Schaltfläche wurde nach unten geändert.
RI_MOUSE_BUTTON_1_UP
RI_MOUSE_LEFT_BUTTON_UP
0x0002
Die linke Schaltfläche wurde in "Oben" geändert.
RI_MOUSE_BUTTON_2_DOWN
RI_MOUSE_RIGHT_BUTTON_DOWN
0x0004
Die rechte Schaltfläche wurde nach unten geändert.
RI_MOUSE_BUTTON_2_UP
RI_MOUSE_RIGHT_BUTTON_UP
0x0008
Die rechte Schaltfläche wurde in "Oben" geändert.
RI_MOUSE_BUTTON_3_DOWN
RI_MOUSE_MIDDLE_BUTTON_DOWN
0x0010
Die mittlere Schaltfläche wurde nach unten geändert.
RI_MOUSE_BUTTON_3_UP
RI_MOUSE_MIDDLE_BUTTON_UP
0x0020
Die mittlere Schaltfläche wurde in "Oben" geändert.
RI_MOUSE_BUTTON_4_DOWN
0x0040
XBUTTON1 in "Nach unten" geändert.
RI_MOUSE_BUTTON_4_UP
0x0080
XBUTTON1 in "Up" geändert.
RI_MOUSE_BUTTON_5_DOWN
0x0100
XBUTTON2 in "Nach unten" geändert.
RI_MOUSE_BUTTON_5_UP
0x0200
XBUTTON2 in "Up" geändert.
RI_MOUSE_WHEEL
0x0400
Unformatierte Eingaben stammen aus einem Mausrad. Das Raddelta wird in usButtonDatagespeichert.
Ein positiver Wert gibt an, dass das Rad vorwärts gedreht wurde, weg vom Benutzer; Ein negativer Wert gibt an, dass das Rad rückwärts in Richtung des Benutzers gedreht wurde. Weitere Informationen finden Sie im folgenden Abschnitt "Hinweise".
RI_MOUSE_HWHEEL
0x0800
Unformatierte Eingaben stammen aus einem horizontalen Mausrad. Das Raddelta wird in usButtonDatagespeichert.
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 folgenden Abschnitt "Hinweise".
Windows XP/2000: Dieser Wert wird nicht unterstützt.

DUMMYUNIONNAME.DUMMYSTRUCTNAME.usButtonData

Typ: USHORT-

Wenn usButtonFlagsRI_MOUSE_WHEEL oder RI_MOUSE_HWHEELhat, gibt dieses Element den Abstand an, in dem das Rad gedreht wird. Weitere Informationen finden Sie im folgenden Abschnitt "Hinweise".

ulRawButtons

Typ: ULONG-

Der unformatierte Zustand der Maustasten. Das Win32-Subsystem verwendet dieses Element nicht.

lLastX

Typ: LONG

Die Bewegung in der X-Richtung. Dies ist abhängig vom Wert von usFlagssignierte relative Bewegung oder absolute Bewegung.

lLastY

Typ: LONG

Die Bewegung in Y-Richtung. Dies ist abhängig vom Wert von usFlagssignierte relative Bewegung oder absolute Bewegung.

ulExtraInformation

Typ: ULONG-

Zusätzliche gerätespezifische Informationen für das Ereignis. Weitere Informationen finden Sie unter Unterscheidung der Stifteingabe von Maus- und Toucheingabe-.

Bemerkungen

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

Wenn MOUSE_MOVE_RELATIVE Wert angegeben ist, lLastX und lLastY Die Bewegung relativ zum vorherigen Mausereignis (die zuletzt gemeldete Position) angeben. Positive Werte bedeuten, dass die Maus nach rechts (oder nach unten) verschoben wird. negative Werte bedeuten, dass die Maus nach links verschoben (oder nach oben) verschoben wird.

Wenn MOUSE_MOVE_ABSOLUTE Wert angegeben ist, enthalten lLastX- und lLastY normalisierte absolute Koordinaten zwischen 0 und 65.535. Die Koordinate (0,0) wird der oberen linken Ecke der Anzeigeoberfläche zugeordnet. die Koordinate (65535.65535) der unteren rechten Ecke zugeordnet ist. In einem Multimonitorsystem werden die Koordinaten dem primären Monitor zugeordnet.

Wenn MOUSE_VIRTUAL_DESKTOP zusätzlich zu MOUSE_MOVE_ABSOLUTEangegeben 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)
    {
        RAWMOUSE& mouse = raw->data.mouse;

        if (mouse.usFlags & MOUSE_MOVE_ABSOLUTE)
        {
            RECT rect;
            if (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(mouse.lLastX, rect.right, USHRT_MAX) + rect.left;
            int absoluteY = MulDiv(mouse.lLastY, rect.bottom, USHRT_MAX) + rect.top;
            ...
        }
        else if (mouse.lLastX != 0 || mouse.lLastY != 0)
        {
            int relativeX = mouse.lLastX;
            int relativeY = mouse.lLastY;
            ...
        }
        ...
    }

    return 0;
}

Im Gegensatz zu älteren WM_MOUSEMOVE Fenstermeldungen, die unformatierte Eingabe-Mausereignisse aufweisen, unterliegen nicht den Auswirkungen der mausgeschwindigkeit, die im Mauseigenschaften- Blatt der Systemsteuerung festgelegt ist. Ausführliche Informationen finden Sie unter Übersicht über mauseingaben.

Wenn mausrad verschoben wird, durch RI_MOUSE_WHEEL oder RI_MOUSE_HWHEEL in usButtonFlagsangegeben, enthält usButtonData einen signierten kurzen Wert, der den Abstand angibt, der das Rad gedreht wird.

Die Raddrehung ist ein Vielfaches von WHEEL_DELTA, das auf 120 festgelegt ist. Dies ist der Schwellenwert für die auszuführende Aktion, und eine solche Aktion (z. B. das Scrollen eines Inkrements) sollte für jedes Delta auftreten.

Das Delta wurde auf 120 festgelegt, damit Microsoft oder andere Anbieter feiner auflösende Räder (ein frei drehendes Rad ohne Noten) erstellen können, um mehr Nachrichten pro Drehung zu senden, aber mit einem kleineren Wert in jeder Nachricht. Um dieses Feature zu verwenden, können Sie entweder die eingehenden Delta-Werte hinzufügen, bis WHEEL_DELTA erreicht ist (also für eine Delta-Drehung, die Sie dieselbe Antwort erhalten), oder Teilzeilen als Reaktion auf die häufigeren Nachrichten scrollen. Sie können auch die Granularität des Bildlaufs auswählen und Deltas ansammeln, bis sie erreicht ist.

Die Anwendung kann auch die aktuellen Zeilen-zu-Bildlauf- und Zeichen-zum-Bildlauf-Benutzereinstellung abrufen, indem sie die SystemParametersInfo-API mit SPI_GETWHEELSCROLLLINES oder SPI_GETWHEELSCROLLCHARS Parameter verwenden.

Hier ist ein Beispiel für einen solchen Radbehandlungscode:

RAWMOUSE& mouse = raw->data.mouse;

if ((mouse.usButtonFlags & RI_MOUSE_WHEEL) || (mouse.usButtonFlags & RI_MOUSE_HWHEEL))
{
    short wheelDelta = (short)mouse.usButtonData;
    float scrollDelta = (float)wheelDelta / WHEEL_DELTA;

    if (mouse.usButtonFlags & RI_MOUSE_HWHEEL) // Horizontal
    {
        unsigned long scrollChars = 1; // 1 is the default
        SystemParametersInfo(SPI_GETWHEELSCROLLCHARS, 0, &scrollChars, 0);
        scrollDelta *= scrollChars;
        ...
    }
    else // Vertical
    {
        unsigned long scrollLines = 3; // 3 is the default
        SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &scrollLines, 0);
        if (scrollLines != WHEEL_PAGESCROLL)
            scrollDelta *= scrollLines;
        ...
    }
}

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Windows XP [nur Desktop-Apps]
mindestens unterstützte Server- Windows Server 2003 [Nur Desktop-Apps]
Header- winuser.h (enthalten Windows.h)

Siehe auch

Konzeptionelle

GetRawInputDeviceInfo

RAWINPUT-

raw Input

Referenz-

MOUSEINPUT-Struktur

SendInput-Funktion

MOUSE_INPUT_DATA Struktur

Mouse Input Overview (Legacy)

Mauseingabebenachrichtigungen (Legacy)

SystemParametersInfo-