Compartilhar via


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 WM_MOUSEMOVE herdadas, os eventos do mouse de Entrada Bruta não estão sujeitos aos efeitos da velocidade do mouse definida na folha Propriedades do Mouse painel de controle. Confira visão geral de entrada do mouse para obter detalhes.

Se a roda do mouse for movida, indicada por RI_MOUSE_WHEEL ou RI_MOUSE_HWHEEL em usButtonFlags, usButtonData conterá um valor de curto assinado que especifica a distância em que a roda é girada.

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 SystemParametersInfo com parâmetro SPI_GETWHEELSCROLLLINES ou SPI_GETWHEELSCROLLCHARS.

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

GetRawInputDeviceInfo

RAWINPUT

de Entrada Bruta

de referência de

estrutura MOUSEINPUT

função SendInput

estrutura MOUSE_INPUT_DATA

Visão geral da entrada do mouse (herdada)

Notificações de entrada do mouse (herdadas)

SystemParametersInfo