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
マウス ボタンの遷移状態。 このメンバーには、次の値のうち 1 つ以上を指定できます。
価値 | 意味 |
---|---|
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が up に変更されました。 |
RI_MOUSE_BUTTON_5_DOWN 0x0100 |
XBUTTON2ダウンに変更されました。 |
RI_MOUSE_BUTTON_5_UP 0x0200 |
XBUTTON2が up に変更されました。 |
RI_MOUSE_WHEEL 0x0400 |
生の入力はマウス ホイールから取得されます。 ホイールデルタは usButtonData 正の値は、ホイールがユーザーから離れて前方に回転したことを示します。負の値は、ホイールがユーザーに向かって後方に回転したことを示します。 詳細については、次の「解説」セクションを参照してください。 |
RI_MOUSE_HWHEEL 0x0800 |
生の入力は、水平マウス ホイールから取得されます。 ホイールデルタは usButtonData 正の値は、ホイールが右に回転したことを示します。負の値は、ホイールが左に回転したことを示します。 詳細については、次の「解説」セクションを参照してください。 Windows XP/2000: この値はサポートされていません。 |
DUMMYUNIONNAME.DUMMYSTRUCTNAME.usButtonData
型: USHORT
usButtonFlags
ulRawButtons
型: ULONG
マウス ボタンの生の状態。 Win32 サブシステムはこのメンバーを使用しません。
lLastX
型: long
X 方向のモーション。 これは、usFlagsの値に応じて、相対モーションまたは絶対モーション
lLastY
型: long
Y 方向のモーション。 これは、usFlagsの値に応じて、相対モーションまたは絶対モーション
ulExtraInformation
型: ULONG
イベントの追加のデバイス固有の情報。 詳細については、「ペン入力とマウスとタッチの の区別」を参照してください。
備考
マウスが移動した場合(
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;
}
従来の
usButtonFlags
ホイールの回転は、120 に設定された WHEEL_DELTAの倍数になります。 これはアクションを実行するためのしきい値であり、デルタごとに 1 つのアクション (たとえば、1 つの増分のスクロール) が発生する必要があります。
デルタは 120 に設定され、Microsoft や他のベンダーは、より細かい解像度のホイール (切り欠きのない自由に回転するホイール) を構築して、回転ごとにメッセージを送信できますが、各メッセージの値は小さくなります。 この機能を使用するには、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 の
生入力 を
リファレンス
SendInput 関数 を