Estructura RAWMOUSE (winuser.h)

Contiene información sobre el estado del mouse.

Sintaxis

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;

Miembros

usFlags

Tipo: USHORT

Estado del mouse. Este miembro puede ser cualquier combinación razonable de lo siguiente.

Valor Significado

MOUSE_MOVE_RELATIVE0x00
Los datos de movimiento del mouse son relativos a la última posición del mouse. Para obtener más información sobre el movimiento del mouse, consulte la siguiente sección Comentarios.

MOUSE_MOVE_ABSOLUTE0x01
Los datos de movimiento del mouse se basan en la posición absoluta. Para obtener más información sobre el movimiento del mouse, consulte la siguiente sección Comentarios.

MOUSE_VIRTUAL_DESKTOP0x02
Las coordenadas del mouse se asignan al escritorio virtual (para un sistema de supervisión múltiple). Para obtener más información sobre el movimiento del mouse, consulte la siguiente sección Comentarios.

MOUSE_ATTRIBUTES_CHANGED0x04
Los atributos del mouse han cambiado; la aplicación debe consultar los atributos del mouse.

MOUSE_MOVE_NOCOALESCE0x08
Este evento de movimiento del mouse no se ha combinado. Los eventos de movimiento del mouse se pueden fusionar de forma predeterminada.
Windows XP/2000: este valor no es compatible.

DUMMYUNIONNAME

DUMMYUNIONNAME.ulButtons

Tipo: ULONG

Reservado.

DUMMYUNIONNAME.DUMMYSTRUCTNAME

DUMMYUNIONNAME.DUMMYSTRUCTNAME.usButtonFlags

Tipo: USHORT

Estado de transición de los botones del mouse. Este miembro puede ser uno o varios de los valores siguientes.

Valor Significado

RI_MOUSE_BUTTON_1_DOWN
RI_MOUSE_LEFT_BUTTON_DOWN0x0001
El botón izquierdo ha cambiado a abajo.

RI_MOUSE_BUTTON_1_UP
RI_MOUSE_LEFT_BUTTON_UP0x0002
El botón izquierdo ha cambiado a arriba.

RI_MOUSE_BUTTON_2_DOWN
RI_MOUSE_RIGHT_BUTTON_DOWN0x0004
El botón derecho ha cambiado a abajo.

RI_MOUSE_BUTTON_2_UP
RI_MOUSE_RIGHT_BUTTON_UP0x0008
El botón derecho ha cambiado a arriba.

RI_MOUSE_BUTTON_3_DOWN
RI_MOUSE_MIDDLE_BUTTON_DOWN0x0010
El botón central cambió a abajo.

RI_MOUSE_BUTTON_3_UP
RI_MOUSE_MIDDLE_BUTTON_UP0x0020
El botón central cambió a arriba.

RI_MOUSE_BUTTON_4_DOWN0x0040
XBUTTON1 ha cambiado a abajo.

RI_MOUSE_BUTTON_4_UP0x0080
XBUTTON1 ha cambiado a arriba.

RI_MOUSE_BUTTON_5_DOWN0x0100
XBUTTON2 ha cambiado a abajo.

RI_MOUSE_BUTTON_5_UP0x0200
XBUTTON2 ha cambiado a arriba.

RI_MOUSE_WHEEL0x0400
La entrada sin procesar procede de una rueda del mouse. El delta de la rueda se almacena en usButtonData.
Un valor positivo indica que la rueda se ha girado hacia delante, hacia el lado contrario al usuario. Un valor negativo indica que la rueda se ha girado hacia atrás, hacia el usuario. Para obtener más información, consulte la siguiente sección Comentarios.

RI_MOUSE_HWHEEL0x0800
La entrada sin procesar procede de una rueda del mouse horizontal. El delta de la rueda se almacena en usButtonData.
Un valor positivo indica que la rueda se ha rotado hacia la derecha; un valor negativo indica que la rueda se ha rotado hacia la izquierda. Para obtener más información, consulte la siguiente sección Comentarios.
Windows XP/2000: este valor no es compatible.

DUMMYUNIONNAME.DUMMYSTRUCTNAME.usButtonData

Tipo: USHORT

Si usButtonFlags tiene RI_MOUSE_WHEEL o RI_MOUSE_HWHEEL, este miembro especifica la distancia a la que gira la rueda. Para obtener más información, consulte la siguiente sección Comentarios.

ulRawButtons

Tipo: ULONG

Estado sin procesar de los botones del mouse. El subsistema Win32 no usa este miembro.

lLastX

Tipo: LONG

Movimiento en la dirección X. Se trata de un movimiento relativo con signo o movimiento absoluto, dependiendo del valor de usFlags.

lLastY

Tipo: LONG

Movimiento en la dirección Y. Se trata de un movimiento relativo con signo o movimiento absoluto, dependiendo del valor de usFlags.

ulExtraInformation

Tipo: ULONG

Información adicional específica del dispositivo para el evento.

Comentarios

Si el mouse se ha movido, indicado por MOUSE_MOVE_RELATIVE o MOUSE_MOVE_ABSOLUTE, lLastX y lLastY especifican información sobre ese movimiento. La información se especifica como valores enteros relativos o absolutos.

Si se especifica MOUSE_MOVE_RELATIVE valor, lLastX y lLastY especifican el movimiento con respecto al evento anterior del mouse (la última posición notificada). Los valores positivos significan que el mouse se movió a la derecha (o hacia abajo); los valores negativos significan que el mouse se ha movido a la izquierda (o hacia arriba).

Si se especifica MOUSE_MOVE_ABSOLUTE valor, lLastX y lLastY contienen coordenadas absolutas normalizadas entre 0 y 65 535. Coordenada (0,0) se asigna a la esquina superior izquierda de la superficie de visualización; coordenadas (65535,65535) se asignan a la esquina inferior derecha. En un sistema multimonitor, las coordenadas se asignan al monitor principal.

Si MOUSE_VIRTUAL_DESKTOP se especifica además de MOUSE_MOVE_ABSOLUTE, las coordenadas se asignan a todo el escritorio virtual.

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

A diferencia de los mensajes heredados de WM_MOUSEMOVE ventana, los eventos del mouse entrada sin procesar no están sujetos a los efectos del conjunto de velocidad del mouse en la hoja Propiedades del mouse de Panel de control. Consulte Introducción a la entrada del mouse para obtener más información.

Si se mueve la rueda del mouse, indicada por RI_MOUSE_WHEEL o RI_MOUSE_HWHEEL en usButtonFlags, usButtonData contiene un valor corto firmado que especifica la distancia a la que se gira la rueda.

El giro de la rueda será un múltiplo de WHEEL_DELTA, que está establecido en 120. Este valor es el umbral para que se realice una acción. Debe producirse una acción de este tipo (por ejemplo, desplazarse un incremento) por cada delta.

El delta se estableció en 120 para permitir a Microsoft y otros proveedores crear ruedas con una resolución más fina (una rueda que gira libremente sin muescas) con el fin de enviar más mensajes por giro, pero con un valor más pequeño en cada mensaje. Para usar esta característica, puede agregar los valores delta entrantes hasta que se alcance WHEEL_DELTA (de modo que obtiene la misma respuesta para un giro delta), o bien desplazar líneas parciales en respuesta a mensajes más frecuentes. También puede elegir una granularidad de desplazamiento y acumular deltas hasta que se alcance.

La aplicación también podría recuperar la configuración actual de usuario de líneas a desplazamiento y caracteres a desplazamiento mediante systemParametersInfo API con SPI_GETWHEELSCROLLLINES o parámetro SPI_GETWHEELSCROLLCHARS .

Este es un ejemplo de este código de control de ruedas:

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

Requisitos

Requisito Value
Cliente mínimo compatible Windows XP [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2003 [solo aplicaciones de escritorio]
Encabezado winuser.h (incluir Windows.h)

Consulte también

Conceptual

GetRawInputDeviceInfo

RAWINPUT

Entrada sin procesar

Referencia

Estructura MOUSEINPUT

Función SendInput

estructura de MOUSE_INPUT_DATA

Introducción a la entrada del mouse (heredada)

Notificaciones de entrada del mouse (heredadas)

SystemParametersInfo