Partager via


Structure RAWMOUSE (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_RELATIVE0x00
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_ABSOLUTE0x01
Les données de déplacement de la souris sont basées sur la position absolue. Pour plus d’informations sur le mouvement de la souris, consultez la section Remarques suivante.

MOUSE_VIRTUAL_DESKTOP0x02
Les coordonnées de la souris sont mappées au bureau virtuel (pour un système à plusieurs moniteurs). Pour plus d’informations sur le mouvement de la souris, consultez la section Remarques suivante.

MOUSE_ATTRIBUTES_CHANGED0x04
Les attributs de la souris ont été modifiés ; l’application doit interroger les attributs de la souris.

MOUSE_MOVE_NOCOALESCE0x08
Cet événement de déplacement de souris n’a pas été coalisé. Les événements de déplacement de souris peuvent être coalé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_DOWN0x0001
Le bouton gauche est passé à bas.

RI_MOUSE_BUTTON_1_UP
RI_MOUSE_LEFT_BUTTON_UP0x0002
Le bouton gauche est passé à haut.

RI_MOUSE_BUTTON_2_DOWN
RI_MOUSE_RIGHT_BUTTON_DOWN0x0004
Le bouton droit est passé à bas.

RI_MOUSE_BUTTON_2_UP
RI_MOUSE_RIGHT_BUTTON_UP0x0008
Le bouton droit est passé à haut.

RI_MOUSE_BUTTON_3_DOWN
RI_MOUSE_MIDDLE_BUTTON_DOWN0x0010
Le bouton central est passé à bas.

RI_MOUSE_BUTTON_3_UP
RI_MOUSE_MIDDLE_BUTTON_UP0x0020
Le bouton central a été remplacé par haut.

RI_MOUSE_BUTTON_4_DOWN0x0040
XBUTTON1 bas.

RI_MOUSE_BUTTON_4_UP0x0080
XBUTTON1 remplacé par up.

RI_MOUSE_BUTTON_5_DOWN0x0100
XBUTTON2 bas.

RI_MOUSE_BUTTON_5_UP0x0200
XBUTTON2 remplacé par up.

RI_MOUSE_WHEEL0x0400
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é actionnée vers l’avant, face à l’utilisateur ; une valeur négative indique que la roue a été actionnée vers l’arrière, en direction de l’utilisateur. Pour plus d’informations, consultez la section Remarques suivante.

RI_MOUSE_HWHEEL0x0800
L’entrée brute provient d’une roulette de souris horizontale. Le delta de roue est stocké dans usButtonData.
Une valeur positive indique une rotation de la molette vers la droite ; une valeur négative indique une rotation de la molette 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.

Remarques

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

Si MOUSE_MOVE_RELATIVE valeur est spécifiée, lLastX et lLastY spécifient 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 a été 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. Coordonnées (0,0) sur le coin supérieur gauche de la surface d’affichage ; coordonnée (65535,65535) correspond au 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 sont mappées à l’ensemble 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 hérités WM_MOUSEMOVE fenêtre, les événements de souris Entrée brute ne sont pas soumis aux effets du paramètre de vitesse de la souris défini dans la feuille Propriétés de la souris du Panneau de configuration. Pour plus d’informations, consultez Vue d’ensemble des entrées de 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 courte signée qui spécifie la distance à laquelle la roue est pivotée.

La rotation de la roulette sera un multiple de WHEEL_DELTA, défini à 120. Il s’agit du seuil de déclenchement de l’action, et une action de ce type (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 roulettes à résolution plus élevée (une roulette à rotation libre sans encoche) pour envoyer plus de messages par rotation, mais avec une valeur plus petite dans chaque message. Pour utiliser cette fonctionnalité, vous pouvez ajouter les valeurs delta entrantes jusqu’à atteindre la valeur WHEEL_DELTA (ainsi, pour une rotation delta, vous obtenez la même réponse), ou faire défiler des lignes partielles en réponse aux messages plus fréquents. Vous pouvez également choisir votre granularité de défilement et accumuler des deltas jusqu’à atteinte la valeur souhaitée.

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

Voici un exemple de code de gestion de roue de ce type :

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

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows XP [applications de bureau uniquement]
Serveur minimal pris en charge Windows Server 2003 [applications de bureau uniquement]
En-tête winuser.h (inclure Windows.h)

Voir aussi

Conceptuel

GetRawInputDeviceInfo

RAWINPUT

Entrée brute

Référence

MOUSEINPUT, structure

SendInput, fonction

MOUSE_INPUT_DATA structure

Vue d’ensemble des entrées de souris (héritée)

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

SystemParametersInfo