共用方式為


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

如果 usButtonFlags 具有 RI_MOUSE_WHEELRI_MOUSE_HWHEEL,則此成員會指定輪子旋轉的距離。 如需詳細資訊,請參閱下列一節。

ulRawButtons

類型:ULONG

滑鼠按鈕的原始狀態。 Win32 子系統不會使用此成員。

lLastX

類型:LONG

X 方向的動作。 這是帶正負號的相對動作或絕對動作,視 usFlags 的值而定。

lLastY

類型:LONG

Y 方向的動作。 這是帶正負號的相對動作或絕對動作,視 usFlags 的值而定。

ulExtraInformation

類型:ULONG

事件的其他裝置特定資訊。 如需詳細資訊,請參閱 區分手寫筆輸入與滑鼠和觸控

言論

如果滑鼠已移動,MOUSE_MOVE_RELATIVEMOUSE_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)
    {
        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中的 RI_MOUSE_WHEELRI_MOUSE_HWHEEL 表示,則 usButtonData 包含帶正負號的 值,指定旋轉方向盤的距離。

方向盤旋轉將是 WHEEL_DELTA的倍數,其設定為120。 這是要採取的動作閾值,而且每個差異應該發生一個此類動作(例如卷動一個遞增)。

差異設定為 120,以允許Microsoft或其他廠商建置更精細的解析度方向盤(無針腳輪自由旋轉輪),以每個輪替傳送更多訊息,但每個訊息中的值較小。 若要使用這項功能,您可以新增傳入的差異值,直到達到 WHEEL_DELTA 為止(因此對於差異輪替,您會得到相同的回應),或捲動部分行以回應更頻繁的訊息。 您也可以選擇捲動粒度,並累積差異,直到到達為止。

應用程式也可以使用具有 SPI_GETWHEELSCROLLLINESSPI_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