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_ABSOLUTE0x01 |
鼠标移动数据基于绝对位置。 有关鼠标运动的详细信息,请参阅以下“备注”部分。 |
MOUSE_VIRTUAL_DESKTOP 0x02 |
鼠标坐标映射到多个监视系统) 的虚拟桌面 (。 有关鼠标运动的详细信息,请参阅以下“备注”部分。 |
MOUSE_ATTRIBUTES_CHANGED0x04 |
鼠标属性已更改;应用程序需要查询鼠标属性。 |
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_DOWN0x0001 |
向左按钮更改为向下。 |
RI_MOUSE_BUTTON_1_UP RI_MOUSE_LEFT_BUTTON_UP0x0002 |
向左按钮更改为向上。 |
RI_MOUSE_BUTTON_2_DOWNRI_MOUSE_RIGHT_BUTTON_DOWN 0x0004 |
向右按钮更改为向下键。 |
RI_MOUSE_BUTTON_2_UP RI_MOUSE_RIGHT_BUTTON_UP0x0008 |
向右按钮更改为向上。 |
RI_MOUSE_BUTTON_3_DOWN RI_MOUSE_MIDDLE_BUTTON_DOWN0x0010 |
中间按钮更改为向下。 |
RI_MOUSE_BUTTON_3_UPRI_MOUSE_MIDDLE_BUTTON_UP 0x0020 |
中间按钮更改为向上。 |
RI_MOUSE_BUTTON_4_DOWN 0x0040 |
XBUTTON1更改为关闭。 |
RI_MOUSE_BUTTON_4_UP0x0080 |
XBUTTON1更改为 up。 |
RI_MOUSE_BUTTON_5_DOWN 0x0100 |
XBUTTON2更改为关闭。 |
RI_MOUSE_BUTTON_5_UP 0x0200 |
XBUTTON2更改为 up。 |
RI_MOUSE_WHEEL0x0400 |
原始输入来自鼠标滚轮。 滚轮增量存储在 usButtonData 中。 正值表示滚轮向前旋转(远离用户);负值表示滚轮向后旋转(朝向用户)。 有关详细信息,请参阅以下“备注”部分。 |
RI_MOUSE_HWHEEL0x0800 |
原始输入来自水平鼠标滚轮。 滚轮增量存储在 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_MOVE_ABSOLUTE 之外还指定 了MOUSE_VIRTUAL_DESKTOP,则坐标将映射到整个虚拟桌面。
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;
...
}
...
}
}
与旧的WM_MOUSEMOVE窗口消息原始输入鼠标事件不受控制面板的鼠标属性表中设置的鼠标速度的影响。 有关详细信息 ,请参阅鼠标输入概述 。
如果移动鼠标滚轮(由 usButtonFlags 中的RI_MOUSE_WHEEL或RI_MOUSE_HWHEEL指示),则 usButtonData 包含一个有符号的短值,该值指定滚轮的旋转距离。
滚轮旋转将是 WHEEL_DELTA 的倍数,设置为 120。 这是要执行的操作的阈值,应针对每个增量执行一个此类操作(例如,滚动一个增量)。
增量设置为 120,以允许 Microsoft 或其他供应商构建更精细的分辨率滚轮(一个无槽位的自由旋转轮),从而在每次旋转发送更多消息,但每条消息中的值较小。 若要使用此功能,请添加传入的增量值,直到达到 WHEEL_DELTA(以便在增量旋转中获取相同响应),或者滚动部分行以响应更频繁的消息。 还可以选择滚动粒度并累积增量,直到达到它。
应用程序还可以使用带有 SPI_GETWHEELSCROLLLINES 或SPI_GETWHEELSCROLLCHARS 参数的 SystemParametersInfo API 检索当前的行滚动和字符滚动用户设置。
下面是此类滚轮处理代码的示例:
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;
}
}
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows XP [仅限桌面应用] |
最低受支持的服务器 | Windows Server 2003 [仅限桌面应用] |
标头 | winuser.h (包括 Windows.h) |
请参阅
概念性
引用
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈