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
Referencia
estructura de MOUSE_INPUT_DATA
Introducción a la entrada del mouse (heredada)
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de