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_RELATIVE0x00
マウスの移動データは、最後のマウス位置を基準にしています。 マウスの動きの詳細については、次の「解説」セクションを参照してください。

MOUSE_MOVE_ABSOLUTE0x01
マウスの移動データは、絶対位置に基づいています。 マウスの動きの詳細については、次の「解説」セクションを参照してください。

MOUSE_VIRTUAL_DESKTOP0x02
マウス座標は仮想デスクトップにマップされます (複数のモニター システムの場合)。 マウスの動きの詳細については、次の「解説」セクションを参照してください。

MOUSE_ATTRIBUTES_CHANGED0x04
マウス属性が変更されました。アプリケーションはマウス属性に対してクエリを実行する必要があります。

MOUSE_MOVE_NOCOALESCE0x08
このマウスの移動イベントは合体されませんでした。 マウスの移動イベントは、既定で合体できます。
Windows XP/2000: この値はサポートされていません。

DUMMYUNIONNAME

DUMMYUNIONNAME.ulButtons

種類: ULONG

予約済み。

DUMMYUNIONNAME.DUMMYSTRUCTNAME

DUMMYUNIONNAME.DUMMYSTRUCTNAME.usButtonFlags

種類: USHORT

マウス ボタンの切り替え状態。 このメンバーには、次の値の 1 つ以上を指定できます。

意味

RI_MOUSE_BUTTON_1_DOWN
RI_MOUSE_LEFT_BUTTON_DOWN0x0001
左ボタンが下に変更されました。

RI_MOUSE_BUTTON_1_UP
RI_MOUSE_LEFT_BUTTON_UP0x0002
左ボタンが上に変更されました。

RI_MOUSE_BUTTON_2_DOWN
RI_MOUSE_RIGHT_BUTTON_DOWN0x0004
右ボタンが下に変更されました。

RI_MOUSE_BUTTON_2_UP
RI_MOUSE_RIGHT_BUTTON_UP0x0008
右ボタンが上に変更されました。

RI_MOUSE_BUTTON_3_DOWN
RI_MOUSE_MIDDLE_BUTTON_DOWN0x0010
中央ボタンが下に変更されました。

RI_MOUSE_BUTTON_3_UP
RI_MOUSE_MIDDLE_BUTTON_UP0x0020
中央のボタンが上に変更されました。

RI_MOUSE_BUTTON_4_DOWN0x0040
XBUTTON1ダウンに変更されました。

RI_MOUSE_BUTTON_4_UP0x0080
XBUTTON1が up に変更されました。

RI_MOUSE_BUTTON_5_DOWN0x0100
XBUTTON2ダウンに変更されました。

RI_MOUSE_BUTTON_5_UP0x0200
XBUTTON2が up に変更されました。

RI_MOUSE_WHEEL0x0400
生の入力はマウス ホイールから取得されます。 ホイールデルタは usButtonData に格納されます。
正の値は、ホイールがユーザーより前方に回転したことを示します。負の値は、ユーザーに向かってホイールが後方に回転したことを示します。 詳細については、次の「解説」セクションを参照してください。

RI_MOUSE_HWHEEL0x0800
生の入力は、マウスの水平ホイールから取得されます。 ホイールデルタは 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で示されます)、 lLastXlLastY はその動きに関する情報を指定します。 情報は、相対整数値または絶対整数値として指定されます。

値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) 
    {
        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 ウィンドウ メッセージとは対照的に、生入力マウス イベントは、コントロール パネルの [マウスのプロパティ] シートに設定されたマウス速度の影響を受けません。 詳細については、「 マウス入力の概要 」を参照してください。

マウス ホイールが usButtonFlagsRI_MOUSE_WHEELまたはRI_MOUSE_HWHEELで示されている場合、usButtonData には、ホイールが回転する距離を指定する符号付きの短い値が含まれます。

ホイールの回転は、WHEEL_DELTA の倍数であり、120 に設定されています。 これは、実行されるアクションのしきい値であり、そのようなアクション (例: 1 インクリメントずつスクロール) は、デルタごとに 1 つ発生するはずです。

デルタは、120 に設定されていました。これは、Microsoft やその他のベンダーが、各メッセージの値を小さく抑えながら 1 回転ごとに送信できるメッセージ数を増やすために、より細かな解像度のホイール (ノッチがなく、自由に回転するホイール) を構築できるようにするためです。 この機能を使用するには、WHEEL_DELTA に到達するまで受信デルタ値を追加するか (デルタ回転の場合は同じ応答が得られます)、より頻繁なメッセージに応答して一部の行をスクロールします。 また、スクロールの粒度を選択し、デルタに到達するまでデルタを累積することもできます。

また、 SystemParametersInfo API と SPI_GETWHEELSCROLLLINES パラメーターまたは SPI_GETWHEELSCROLLCHARS パラメーターを使用して、現在のスクロール行と文字からスクロールまでのユーザー設定 取得することもできます。

このようなホイール処理コードの例を次に示します。

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 (デスクトップ アプリのみ)
Header winuser.h (Windows.h を含む)

関連項目

概念

GetRawInputDeviceInfo

RAWINPUT

未加工の入力

参照

MOUSEINPUT 構造体

SendInput 関数

MOUSE_INPUT_DATA構造体

マウス入力の概要 (レガシ)

マウス入力通知 (レガシ)

SystemParametersInfo