Поделиться через


Структура RAWMOUSE (winuser.h)

Содержит сведения о состоянии мыши.

Синтаксис

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;

Члены

usFlags

Тип: USHORT

Состояние мыши. Этот член может быть любым разумным сочетанием следующего.

Ценность Значение
MOUSE_MOVE_RELATIVE
0x00
Данные перемещения мыши относительно последней позиции мыши. Дополнительные сведения о движении мыши см. в следующем разделе "Примечания".
MOUSE_MOVE_ABSOLUTE
0x01
Данные перемещения мыши основаны на абсолютной позиции. Дополнительные сведения о движении мыши см. в следующем разделе "Примечания".
MOUSE_VIRTUAL_DESKTOP
0x02
Координаты мыши сопоставляются с виртуальным рабочим столом (для нескольких мониторных систем). Дополнительные сведения о движении мыши см. в следующем разделе "Примечания".
MOUSE_ATTRIBUTES_CHANGED
0x04
Изменены атрибуты мыши; приложению необходимо запрашивать атрибуты мыши.
MOUSE_MOVE_NOCOALESCE
0x08
Это событие перемещения мыши не было объединено. События перемещения мыши можно объединять по умолчанию.
Windows XP/2000: это значение не поддерживается.

DUMMYUNIONNAME

DUMMYUNIONNAME.ulButtons

Тип: ULONG

Скрытный.

DUMMYUNIONNAME.DUMMYSTRUCTNAME

DUMMYUNIONNAME.DUMMYSTRUCTNAME.usButtonFlags

Тип: USHORT

Состояние перехода кнопок мыши. Этот элемент может быть одним или несколькими из следующих значений.

Ценность Значение
RI_MOUSE_BUTTON_1_DOWN
RI_MOUSE_LEFT_BUTTON_DOWN
0x0001
Левая кнопка изменилась вниз.
RI_MOUSE_BUTTON_1_UP
RI_MOUSE_LEFT_BUTTON_UP
0x0002
Левая кнопка изменилась вверх.
RI_MOUSE_BUTTON_2_DOWN
RI_MOUSE_RIGHT_BUTTON_DOWN
0x0004
Правая кнопка изменилась вниз.
RI_MOUSE_BUTTON_2_UP
RI_MOUSE_RIGHT_BUTTON_UP
0x0008
Правая кнопка изменилась вверх.
RI_MOUSE_BUTTON_3_DOWN
RI_MOUSE_MIDDLE_BUTTON_DOWN
0x0010
Средняя кнопка изменилась вниз.
RI_MOUSE_BUTTON_3_UP
RI_MOUSE_MIDDLE_BUTTON_UP
0x0020
Средняя кнопка изменилась вверх.
RI_MOUSE_BUTTON_4_DOWN
0x0040
XBUTTON1 изменен на "вниз".
RI_MOUSE_BUTTON_4_UP
0x0080
XBUTTON1 изменено.
RI_MOUSE_BUTTON_5_DOWN
0x0100
XBUTTON2 изменено на "вниз".
RI_MOUSE_BUTTON_5_UP
0x0200
XBUTTON2 изменено.
RI_MOUSE_WHEEL
0x0400
Необработанные входные данные поступают из колесика мыши. Разностное колесо хранится в usButtonData.
Положительное значение указывает, что колесо было повернуто вперед, в сторону от пользователя; Отрицательное значение указывает, что колесо было повернуто назад к пользователю. Дополнительные сведения см. в следующем разделе "Примечания".
RI_MOUSE_HWHEEL
0x0800
Необработанные входные данные поступают из горизонтального колесика мыши. Разностное колесо хранится в usButtonData.
Положительное значение указывает, что колесо было повернуто справа; отрицательное значение указывает, что колесо было повернуто влево. Дополнительные сведения см. в следующем разделе "Примечания".
Windows XP/2000: это значение не поддерживается.

DUMMYUNIONNAME.DUMMYSTRUCTNAME.usButtonData

Тип: USHORT

Если usButtonFlags имеет RI_MOUSE_WHEEL или RI_MOUSE_HWHEEL, этот элемент указывает расстояние поворота колеса. Дополнительные сведения см. в следующем разделе "Примечания".

ulRawButtons

Тип: ULONG

Необработанное состояние кнопок мыши. Подсистема Win32 не использует этот элемент.

lLastX

Тип: LONG

Движение в направлении X. Это подписывается относительное движение или абсолютное движение в зависимости от значения usFlags.

lLastY

Тип: LONG

Движение в направлении Y. Это подписывается относительное движение или абсолютное движение в зависимости от значения usFlags.

ulExtraInformation

Тип: ULONG

Дополнительные сведения об устройстве для события. Дополнительные сведения см. в отличия ввода пера от мыши и сенсорного.

Замечания

Если мышь перемещена, указанная MOUSE_MOVE_RELATIVE или MOUSE_MOVE_ABSOLUTE, lLastX и lLastY укажите сведения об этом движении. Сведения указываются как относительные или абсолютные целые значения.

Если задано значение MOUSE_MOVE_RELATIVE, lLastX и lLastY указать перемещение относительно предыдущего события мыши (последнее указанное положение). Положительные значения означают, что мышь перемещается вправо (или вниз); отрицательные значения означают, что мышь перемещается влево (или вверх).

Если задано значение MOUSE_MOVE_ABSOLUTE, lLastX и lLastY содержат нормализованные абсолютные координаты от 0 до 65 535. Координата (0,0) сопоставляется с левым верхним углом поверхности отображения; координата (65535 65535) сопоставляется с правым нижним углом. В многомониторной системе координаты сопоставляют с основным монитором.

Если MOUSE_VIRTUAL_DESKTOP указан в дополнение к MOUSE_MOVE_ABSOLUTE, координаты сопоставляется со всем виртуальным рабочим столом.

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

В отличие от устаревших событий WM_MOUSEMOVE окна необработанные события мыши не влияют на влияние скорости мыши, заданной на панели управления свойства мыши листе. Дополнительные сведения см. в обзоре ввода мыши.

Если колесико мыши перемещается, указано RI_MOUSE_WHEEL или RI_MOUSE_HWHEEL в usButtonFlags, то usButtonData содержит короткое значение, указывающее расстояние поворота колеса.

Поворот колеса будет несколькими WHEEL_DELTA, который установлен в 120. Это пороговое значение для выполнения действий, и одно такое действие (например, прокрутка одного добавочного значения) должна выполняться для каждого разностного значения.

В разностном режиме было установлено значение 120, чтобы корпорация Майкрософт или другие поставщики могли создавать колеса тонкого разрешения (свободно вращающееся колесо без замечания), чтобы отправлять больше сообщений на поворот, но с меньшим значением в каждом сообщении. Чтобы использовать эту функцию, можно добавить входящие разностные значения до тех пор, пока WHEEL_DELTA не достигнут (поэтому для разностного поворота вы получаете тот же ответ) или прокрутите частичные строки в ответ на более частые сообщения. Вы также можете выбрать степень детализации прокрутки и накапливать разностные значения, пока она не будет достигнута.

Приложение также может получить текущий параметр пользователя для прокрутки строк и символов для прокрутки с помощью API SystemParametersInfo с параметром SPI_GETWHEELSCROLLLINES или SPI_GETWHEELSCROLLCHARS.

Ниже приведен пример такого кода обработки колес:

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

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows XP [только классические приложения]
минимальный поддерживаемый сервер Windows Server 2003 [только классические приложения]
заголовка winuser.h (включая Windows.h)

См. также

концептуальные

GetRawInputDeviceInfo

RAWINPUT

необработанные входные

Справочник

структура MOUSEINPUT

функция SendInput

структуры MOUSE_INPUT_DATA

обзор ввода мыши (устаревшая версия)

уведомления ввода мыши (устаревшая версия)

SystemParametersInfo