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
usButtonFlagsRI_MOUSE_WHEEL 또는 RI_MOUSE_HWHEEL경우 이 멤버는 휠이 회전되는 거리를 지정합니다. 자세한 내용은 다음 설명 섹션을 참조하세요.
ulRawButtons
형식: ULONG
마우스 단추의 원시 상태입니다. Win32 하위 시스템은 이 멤버를 사용하지 않습니다.
lLastX
형식: LONG
X 방향의 동작입니다. 이 동작은 usFlags
lLastY
형식: LONG
Y 방향의 동작입니다. 이 동작은 usFlags
ulExtraInformation
형식: ULONG
이벤트에 대한 추가 디바이스 관련 정보입니다. 자세한 내용은 마우스 및 터치 펜 입력 구분을 참조하세요.
발언
마우스가
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)
{
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 창 메시지와 달리 원시 입력 마우스 이벤트는 제어판의 마우스 속성 시트에 설정된 마우스 속도의 영향을 받지 않습니다. 자세한 내용은 마우스 입력 개요 참조하세요.
usButtonFlags
휠 회전은 120으로 설정된 WHEEL_DELTA배수입니다. 이는 수행할 작업에 대한 임계값이며 각 델타에 대해 이러한 작업(예: 한 증분 스크롤)이 발생해야 합니다.
델타는 Microsoft 또는 다른 공급업체가 회전당 더 많은 메시지를 보낼 수 있지만 각 메시지에서 더 작은 값으로 더 많은 메시지를 보낼 수 있도록 더 미세한 해상도의 휠(노치 없이 자유롭게 회전하는 휠)을 빌드할 수 있도록 120으로 설정되었습니다. 이 기능을 사용하려면 WHEEL_DELTA 도달할 때까지 들어오는 델타 값을 추가하거나(델타 회전의 경우 동일한 응답을 받음) 더 빈번한 메시지에 대한 응답으로 부분선을 스크롤할 수 있습니다. 스크롤 세분성을 선택하고 델타에 도달할 때까지 델타를 누적할 수도 있습니다.
애플리케이션은 SPI_GETWHEELSCROLLLINES 또는 SPI_GETWHEELSCROLLCHARS 매개 변수와 함께 SystemParametersInfo API를 사용하여 현재 줄-스크롤 및 문자-스크롤 사용자 설정을 검색할 수도 있습니다.
이러한 휠 처리 코드의 예는 다음과 같습니다.
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 함수
마우스 입력 개요(레거시)
마우스 입력 알림(레거시)
systemParametersInfo