다음을 통해 공유


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 또는 MOUSE_MOVE_ABSOLUTE표시된 경우 lLastX lLastY를 해당 이동에 대한 정보를 지정할 있습니다. 정보는 상대 또는 절대 정수 값으로 지정됩니다.

MOUSE_MOVE_RELATIVE 값이 지정된 경우 lLastXlLastY 이전 마우스 이벤트(마지막으로 보고된 위치)를 기준으로 이동을 지정할 수 있습니다. 양수 값은 마우스가 오른쪽으로 또는 아래로 이동됨을 의미합니다. 음수 값은 마우스가 왼쪽 또는 위로 이동한 것을 의미합니다.

MOUSE_MOVE_ABSOLUTE 값을 지정하면 lLastXlLastY 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 창 메시지와 달리 원시 입력 마우스 이벤트는 제어판의 마우스 속성 시트에 설정된 마우스 속도의 영향을 받지 않습니다. 자세한 내용은 마우스 입력 개요 참조하세요.

usButtonFlagsRI_MOUSE_WHEEL 또는 RI_MOUSE_HWHEEL 표시된 마우스 휠을 이동하면 usButtonData 휠 회전 거리를 지정하는 부가 짧은 값이 포함됩니다.

휠 회전은 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 함수

MOUSE_INPUT_DATA 구조체

마우스 입력 개요(레거시)

마우스 입력 알림(레거시)

systemParametersInfo