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:
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:
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:
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
Si se mueve la rueda del mouse, indicada por
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
de referencia de
información general sobre la entrada del mouse (heredada)