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
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 に設定されています。 これは、実行されるアクションのしきい値であり、そのようなアクション (例: 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 を含む) |
関連項目
概念
参照
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示