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: de USHORT de

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

Valor Significado
MOUSE_MOVE_RELATIVE
0x00
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_ABSOLUTE
0x01
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_DESKTOP
0x02
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_CHANGED
0x04
Se cambiaron los atributos del mouse; la aplicación debe consultar los atributos del mouse.
MOUSE_MOVE_NOCOALESCE
0x08
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 se admite.

DUMMYUNIONNAME

DUMMYUNIONNAME.ulButtons

Tipo: ULONG

Reservado.

DUMMYUNIONNAME.DUMMYSTRUCTNAME

DUMMYUNIONNAME.DUMMYSTRUCTNAME.usButtonFlags

Tipo: de USHORT de

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

Valor Significado
RI_MOUSE_BUTTON_1_DOWN
RI_MOUSE_LEFT_BUTTON_DOWN
0x0001
Botón izquierdo cambiado a abajo.
RI_MOUSE_BUTTON_1_UP
RI_MOUSE_LEFT_BUTTON_UP
0x0002
El botón izquierdo cambió a arriba.
RI_MOUSE_BUTTON_2_DOWN
RI_MOUSE_RIGHT_BUTTON_DOWN
0x0004
El botón derecho cambió a abajo.
RI_MOUSE_BUTTON_2_UP
RI_MOUSE_RIGHT_BUTTON_UP
0x0008
El botón derecho cambió a arriba.
RI_MOUSE_BUTTON_3_DOWN
RI_MOUSE_MIDDLE_BUTTON_DOWN
0x0010
El botón central cambió a abajo.
RI_MOUSE_BUTTON_3_UP
RI_MOUSE_MIDDLE_BUTTON_UP
0x0020
El botón central cambió a arriba.
RI_MOUSE_BUTTON_4_DOWN
0x0040
XBUTTON1 ha cambiado a abajo.
RI_MOUSE_BUTTON_4_UP
0x0080
XBUTTON1 ha cambiado hasta arriba.
RI_MOUSE_BUTTON_5_DOWN
0x0100
XBUTTON2 ha cambiado a abajo.
RI_MOUSE_BUTTON_5_UP
0x0200
XBUTTON2 ha cambiado hasta arriba.
RI_MOUSE_WHEEL
0x0400
La entrada sin procesar procede de una rueda del mouse. El delta de rueda se almacena en usButtonData.
Un valor positivo indica que la rueda se ha girado hacia delante, lejos del 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_HWHEEL
0x0800
La entrada sin procesar procede de una rueda horizontal del mouse. El delta de rueda se almacena en usButtonData.
Un valor positivo indica que la rueda se ha girado a la derecha; un valor negativo indica que la rueda se ha girado a la izquierda. Para obtener más información, consulte la siguiente sección Comentarios.
Windows XP/2000: este valor no se admite.

DUMMYUNIONNAME.DUMMYSTRUCTNAME.usButtonData

Tipo: de USHORT de

Si usButtonFlags tiene RI_MOUSE_WHEEL o RI_MOUSE_HWHEEL, este miembro especifica la distancia 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 movimiento relativo firmado o movimiento absoluto, según el valor de usFlags.

lLastY

Tipo: LONG

Movimiento en dirección Y. Se trata de movimiento relativo firmado o movimiento absoluto, según el valor de usFlags.

ulExtraInformation

Tipo: ULONG

Información adicional específica del dispositivo para el evento. Consulta distinguir la entrada del lápiz del mouse y la táctil para obtener más información.

Observaciones

Si el mouse se ha movido, indicado por MOUSE_MOVE_RELATIVE o MOUSE_MOVE_ABSOLUTE, lLastX y lLastY especificar 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 especificar 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 movió 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; coordenada (65535,65535) se asigna a la esquina inferior derecha. En un sistema multimonitor, las coordenadas se asignan al monitor principal.

Si se especifica MOUSE_VIRTUAL_DESKTOP 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)
    {
        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;
}

A diferencia de los mensajes de ventana de WM_MOUSEMOVE heredados, 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 del 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 de corto con signo que especifica la distancia que gira la rueda.

El giro de la rueda será un múltiplo de WHEEL_DELTA, que se establece en 120. Este es el umbral de acción que se va a realizar y una de estas acciones (por ejemplo, desplazarse por un incremento) debe producirse para cada delta.

El delta se estableció en 120 para permitir a Microsoft u otros proveedores crear ruedas de resolución más finas (una rueda giratoria libremente sin pulgadas) para enviar más mensajes por rotación, pero con un valor más pequeño en cada mensaje. Para usar esta característica, puede agregar los valores diferenciales entrantes hasta que se alcance WHEEL_DELTA (por lo que para una rotación diferencial obtiene la misma respuesta) o desplazarse por líneas parciales en respuesta a los mensajes más frecuentes. También puede elegir la granularidad del desplazamiento y acumular deltas hasta que se alcance.

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

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

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

Requisitos

Requisito Valor
cliente mínimo admitido Windows XP [solo aplicaciones de escritorio]
servidor mínimo admitido Windows Server 2003 [solo aplicaciones de escritorio]
encabezado de winuser.h (incluya Windows.h)

Consulte también

conceptual de

GetRawInputDeviceInfo

RAWINPUT

de entrada sin procesar

de referencia de

estructura MOUSEINPUT

de función SendInput

MOUSE_INPUT_DATA estructura

información general sobre la entrada del mouse (heredada)

Notificaciones de entrada del mouse (heredadas)

SystemParametersInfo