Estrutura RAWMOUSE (winuser.h)
Contém informações sobre o estado do mouse.
Sintaxe
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;
Membros
usFlags
Tipo: USHORT
O estado do mouse. Esse membro pode ser qualquer combinação razoável do seguinte.
Valor | Significado |
---|---|
MOUSE_MOVE_RELATIVE 0x00 |
Os dados de movimentação do mouse são relativos à última posição do mouse. Para obter mais informações sobre o movimento do mouse, consulte a seção Comentários a seguir. |
MOUSE_MOVE_ABSOLUTE 0x01 |
Os dados de movimentação do mouse são baseados na posição absoluta. Para obter mais informações sobre o movimento do mouse, consulte a seção Comentários a seguir. |
MOUSE_VIRTUAL_DESKTOP 0x02 |
As coordenadas do mouse são mapeadas para a área de trabalho virtual (para um sistema de vários monitores). Para obter mais informações sobre o movimento do mouse, consulte a seção Comentários a seguir. |
MOUSE_ATTRIBUTES_CHANGED 0x04 |
Atributos do mouse alterados; o aplicativo precisa consultar os atributos do mouse. |
MOUSE_MOVE_NOCOALESCE 0x08 |
Este evento de movimento do mouse não foi unido. Os eventos de movimento do mouse podem ser unidos por padrão. Windows XP/2000: não há suporte para esse valor. |
DUMMYUNIONNAME
DUMMYUNIONNAME.ulButtons
Tipo: ULONG
Reservado.
DUMMYUNIONNAME.DUMMYSTRUCTNAME
DUMMYUNIONNAME.DUMMYSTRUCTNAME.usButtonFlags
Tipo: USHORT
O estado de transição dos botões do mouse. Esse membro pode ser um ou mais dos valores a seguir.
Valor | Significado |
---|---|
RI_MOUSE_BUTTON_1_DOWN RI_MOUSE_LEFT_BUTTON_DOWN 0x0001 |
Botão esquerdo alterado para baixo. |
RI_MOUSE_BUTTON_1_UP RI_MOUSE_LEFT_BUTTON_UP 0x0002 |
Botão esquerdo alterado para cima. |
RI_MOUSE_BUTTON_2_DOWN RI_MOUSE_RIGHT_BUTTON_DOWN 0x0004 |
Botão direito alterado para baixo. |
RI_MOUSE_BUTTON_2_UP RI_MOUSE_RIGHT_BUTTON_UP 0x0008 |
Botão direito alterado para cima. |
RI_MOUSE_BUTTON_3_DOWN RI_MOUSE_MIDDLE_BUTTON_DOWN 0x0010 |
Botão do meio alterado para baixo. |
RI_MOUSE_BUTTON_3_UP RI_MOUSE_MIDDLE_BUTTON_UP 0x0020 |
Botão do meio alterado para cima. |
RI_MOUSE_BUTTON_4_DOWN 0x0040 |
XBUTTON1 alterado para baixo. |
RI_MOUSE_BUTTON_4_UP 0x0080 |
XBUTTON1 alterado para cima. |
RI_MOUSE_BUTTON_5_DOWN 0x0100 |
XBUTTON2 alterado para baixo. |
RI_MOUSE_BUTTON_5_UP 0x0200 |
XBUTTON2 alterado para cima. |
RI_MOUSE_WHEEL 0x0400 |
A entrada bruta vem de uma roda do mouse. O delta da roda é armazenado em usButtonData. Um valor positivo indica que a roda foi girada para frente, longe do usuário; um valor negativo indica que a roda foi girada para trás, em direção ao usuário. Para obter mais informações, consulte a seção Comentários a seguir. |
RI_MOUSE_HWHEEL 0x0800 |
A entrada bruta vem de uma roda horizontal do mouse. O delta da roda é armazenado em usButtonData. Um valor positivo indica que a roda foi girada para a direita; um valor negativo indica que a roda foi girada para a esquerda. Para obter mais informações, consulte a seção Comentários a seguir. Windows XP/2000: não há suporte para esse valor. |
DUMMYUNIONNAME.DUMMYSTRUCTNAME.usButtonData
Tipo: USHORT
Se usButtonFlags tiver RI_MOUSE_WHEEL ou RI_MOUSE_HWHEEL, esse membro especifica a distância em que a roda é girada. Para obter mais informações, consulte a seção Comentários a seguir.
ulRawButtons
Tipo: ULONG
O estado bruto dos botões do mouse. O subsistema Win32 não usa esse membro.
lLastX
Tipo: LONG
O movimento na direção X. Isso é movimento relativo assinado ou movimento absoluto, dependendo do valor de usFlags.
lLastY
Tipo: LONG
O movimento na direção Y. Isso é movimento relativo assinado ou movimento absoluto, dependendo do valor de usFlags.
ulExtraInformation
Tipo: ULONG
Informações adicionais específicas do dispositivo para o evento. Consulte Diferenciando a entrada de caneta do mouse e do toque para obter mais informações.
Observações
Se o mouse tiver sido movido, indicado por MOUSE_MOVE_RELATIVE ou MOUSE_MOVE_ABSOLUTE, lLastX e lLastY especificar informações sobre esse movimento. As informações são especificadas como valores inteiros relativos ou absolutos.
Se MOUSE_MOVE_RELATIVE valor for especificado, lLastX e lLastY especificar o movimento relativo ao evento do mouse anterior (a última posição relatada). Valores positivos significam que o mouse foi movido para a direita (ou para baixo); valores negativos significam que o mouse foi movido para a esquerda (ou para cima).
Se MOUSE_MOVE_ABSOLUTE valor for especificado, lLastX e lLastY conterão coordenadas absolutas normalizadas entre 0 e 65.535. A coordenada (0,0) é mapeada para o canto superior esquerdo da superfície de exibição; coordenada (65535.65535) mapeia para o canto inferior direito. Em um sistema multimonitor, as coordenadas são mapeadas para o monitor primário.
Se MOUSE_VIRTUAL_DESKTOP for especificado além de MOUSE_MOVE_ABSOLUTE, as coordenadas serão mapeadas para toda a área de trabalho 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;
}
Em contraste com as mensagens de janela de
Se a roda do mouse for movida, indicada por
A rotação da roda será um múltiplo de WHEEL_DELTA, que é definido como 120. Esse é o limite para a ação a ser tomada e uma dessas ações (por exemplo, rolagem de um incremento) deve ocorrer para cada delta.
O delta foi definido como 120 para permitir que a Microsoft ou outros fornecedores criem rodas de resolução mais fina (uma roda de rotação livre sem entalhes) para enviar mais mensagens por rotação, mas com um valor menor em cada mensagem. Para usar esse recurso, você pode adicionar os valores delta de entrada até que WHEEL_DELTA seja atingido (portanto, para uma rotação delta, você obtém a mesma resposta) ou rolar linhas parciais em resposta às mensagens mais frequentes. Você também pode escolher sua granularidade de rolagem e acumular deltas até que ela seja atingida.
O aplicativo também pode recuperar a configuração atual de usuário de linhas para rolagem e caracteres para rolar usando a API
Aqui está um exemplo desse código de manipulação de roda:
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 |
---|---|
de cliente com suporte mínimo | Windows XP [somente aplicativos da área de trabalho] |
servidor com suporte mínimo | Windows Server 2003 [somente aplicativos da área de trabalho] |
cabeçalho | winuser.h (inclua Windows.h) |
Consulte também
Conceitual
de referência de
estrutura MOUSE_INPUT_DATA
Visão geral da entrada do mouse (herdada)
Notificações de entrada do mouse (herdadas)