Partager via


RAWMOUSE, structure (winuser.h)

Contient des informations sur l’état de la souris.

Syntaxe

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;

Membres

usFlags

Type : USHORT

État de la souris. Ce membre peut être une combinaison raisonnable des éléments suivants.

Valeur Signification
MOUSE_MOVE_RELATIVE
0x00
Les données de déplacement de la souris sont relatives à la dernière position de la souris. Pour plus d’informations sur le mouvement de la souris, consultez la section Remarques suivante.
MOUSE_MOVE_ABSOLUTE
0x01
Les données de déplacement de la souris sont basées sur une position absolue. Pour plus d’informations sur le mouvement de la souris, consultez la section Remarques suivante.
MOUSE_VIRTUAL_DESKTOP
0x02
Les coordonnées de la souris sont mappées au bureau virtuel (pour un système de surveillance multiple). Pour plus d’informations sur le mouvement de la souris, consultez la section Remarques suivante.
MOUSE_ATTRIBUTES_CHANGED
0x04
Attributs de la souris modifiés ; l’application doit interroger les attributs de la souris.
MOUSE_MOVE_NOCOALESCE
0x08
Cet événement de mouvement de souris n’a pas été coalesced. Les événements de déplacement de la souris peuvent être coalescés par défaut.
Windows XP/2000 : cette valeur n’est pas prise en charge.

DUMMYUNIONNAME

DUMMYUNIONNAME.ulButtons

Type : ULONG

Réservé.

DUMMYUNIONNAME.DUMMYSTRUCTNAME

DUMMYUNIONNAME.DUMMYSTRUCTNAME.usButtonFlags

Type : USHORT

État de transition des boutons de la souris. Ce membre peut être une ou plusieurs des valeurs suivantes.

Valeur Signification
RI_MOUSE_BUTTON_1_DOWN
RI_MOUSE_LEFT_BUTTON_DOWN
0x0001
Bouton gauche modifié vers le bas.
RI_MOUSE_BUTTON_1_UP
RI_MOUSE_LEFT_BUTTON_UP
0x0002
Bouton gauche modifié vers le haut.
RI_MOUSE_BUTTON_2_DOWN
RI_MOUSE_RIGHT_BUTTON_DOWN
0x0004
Bouton droit modifié vers le bas.
RI_MOUSE_BUTTON_2_UP
RI_MOUSE_RIGHT_BUTTON_UP
0x0008
Bouton droit modifié vers le haut.
RI_MOUSE_BUTTON_3_DOWN
RI_MOUSE_MIDDLE_BUTTON_DOWN
0x0010
Bouton central modifié vers le bas.
RI_MOUSE_BUTTON_3_UP
RI_MOUSE_MIDDLE_BUTTON_UP
0x0020
Bouton central modifié vers le haut.
RI_MOUSE_BUTTON_4_DOWN
0x0040
XBUTTON1 changé vers le bas.
RI_MOUSE_BUTTON_4_UP
0x0080
XBUTTON1 changé vers le haut.
RI_MOUSE_BUTTON_5_DOWN
0x0100
XBUTTON2 changé vers le bas.
RI_MOUSE_BUTTON_5_UP
0x0200
XBUTTON2 changé vers le haut.
RI_MOUSE_WHEEL
0x0400
L’entrée brute provient d’une roulette de souris. Le delta de roue est stocké dans usButtonData.
Une valeur positive indique que la roue a été pivotée vers l’avant, loin de l’utilisateur ; une valeur négative indique que la roue a été pivotée vers l’arrière vers l’utilisateur. Pour plus d’informations, consultez la section Remarques suivante.
RI_MOUSE_HWHEEL
0x0800
L’entrée brute provient d’une roulette de souris horizontale. Le delta de roue est stocké dans usButtonData.
Une valeur positive indique que la roue a été pivotée vers la droite ; une valeur négative indique que la roue a été pivotée vers la gauche. Pour plus d’informations, consultez la section Remarques suivante.
Windows XP/2000 : cette valeur n’est pas prise en charge.

DUMMYUNIONNAME.DUMMYSTRUCTNAME.usButtonData

Type : USHORT

Si usButtonFlags a RI_MOUSE_WHEEL ou RI_MOUSE_HWHEEL, ce membre spécifie la distance à laquelle la roue est pivotée. Pour plus d’informations, consultez la section Remarques suivante.

ulRawButtons

Type : ULONG

État brut des boutons de la souris. Le sous-système Win32 n’utilise pas ce membre.

lLastX

Type : long

Mouvement dans la direction X. Il s’agit d’un mouvement relatif signé ou d’un mouvement absolu, selon la valeur de usFlags.

lLastY

Type : long

Mouvement dans la direction Y. Il s’agit d’un mouvement relatif signé ou d’un mouvement absolu, selon la valeur de usFlags.

ulExtraInformation

Type : ULONG

Informations supplémentaires spécifiques à l’appareil pour l’événement. Pour plus d’informations, consultez distinction entre l’entrée de stylet et la souris et le tactile.

Remarques

Si la souris a été déplacée, indiquée par MOUSE_MOVE_RELATIVE ou MOUSE_MOVE_ABSOLUTE, lLastX et lLastY spécifier des informations sur ce mouvement. Les informations sont spécifiées en tant que valeurs entières relatives ou absolues.

Si MOUSE_MOVE_RELATIVE valeur est spécifiée, lLastX et lLastY spécifier le mouvement par rapport à l’événement de souris précédent (dernière position signalée). Les valeurs positives signifient que la souris a été déplacée vers la droite (ou vers le bas) ; les valeurs négatives signifient que la souris est déplacée vers la gauche (ou vers le haut).

Si MOUSE_MOVE_ABSOLUTE valeur est spécifiée, lLastX et lLastY contiennent des coordonnées absolues normalisées comprises entre 0 et 65 535. Les coordonnées (0,0) sont mappée sur le coin supérieur gauche de l’aire d’affichage ; coordonnée (65535 65535) mappe sur le coin inférieur droit. Dans un système multimonitor, les coordonnées sont mappées au moniteur principal.

Si MOUSE_VIRTUAL_DESKTOP est spécifié en plus de MOUSE_MOVE_ABSOLUTE, les coordonnées correspondent à l’intégralité du bureau virtuel.

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

Contrairement aux messages de fenêtre WM_MOUSEMOVE hérités, les événements de souris entrée brute ne sont pas soumis aux effets de la vitesse de la souris définie dans la feuille Propriétés de la souris du Panneau de configuration. Pour plus d’informations, consultez Vue d’ensemble de l’entrée de la souris.

Si la roulette de la souris est déplacée, indiquée par RI_MOUSE_WHEEL ou RI_MOUSE_HWHEEL dans usButtonFlags, usButtonData contient une valeur de courte signée qui spécifie la distance à laquelle la roue est pivotée.

La rotation des roues sera un multiple de WHEEL_DELTA, qui est définie à 120. Il s’agit du seuil d’action à entreprendre, et une telle action (par exemple, le défilement d’un incrément) doit se produire pour chaque delta.

Le delta a été défini sur 120 pour permettre à Microsoft ou à d’autres fournisseurs de créer des roues de résolution plus fines (roue librement pivotante sans pouces) pour envoyer plus de messages par rotation, mais avec une plus petite valeur dans chaque message. Pour utiliser cette fonctionnalité, vous pouvez ajouter les valeurs delta entrantes jusqu’à ce que WHEEL_DELTA soit atteinte (par conséquent, pour une rotation delta, vous obtenez la même réponse), ou faire défiler les lignes partielles en réponse aux messages les plus fréquents. Vous pouvez également choisir votre granularité de défilement et accumuler des deltas jusqu’à ce qu’elle soit atteinte.

L’application peut également récupérer le paramètre utilisateur lignes à défilement et caractères à défilement actuel à l’aide de l’API SystemParametersInfo avec SPI_GETWHEELSCROLLLINES ou SPI_GETWHEELSCROLLCHARS paramètre.

Voici un exemple de ce code de gestion des roues :

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

Exigences

Exigence Valeur
client minimum pris en charge Windows XP [applications de bureau uniquement]
serveur minimum pris en charge Windows Server 2003 [applications de bureau uniquement]
d’en-tête winuser.h (include Windows.h)

Voir aussi

conceptuelle

GetRawInputDeviceInfo

RAWINPUT

d’entrée brute

de référence

structure MOUSEINPUT

fonction SendInput

MOUSE_INPUT_DATA structure

Vue d’ensemble de l’entrée de la souris (héritée)

notifications d’entrée de souris (hérité)

SystemParametersInfo