Структура 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) |
См. также
концептуальные
Справочник
структуры
обзор ввода мыши (устаревшая версия)