Bagikan melalui


Struktur RAWMOUSE (winuser.h)

Berisi informasi tentang status tetikus.

Sintaksis

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;

Anggota

usFlags

Jenis: USHORT

Status mouse. Anggota ini bisa menjadi kombinasi yang wajar dari berikut ini.

Nilai Arti
MOUSE_MOVE_RELATIVE
0x00
Data pergerakan mouse relatif terhadap posisi mouse terakhir. Untuk informasi selengkapnya tentang gerakan mouse, lihat bagian Komentar berikut.
MOUSE_MOVE_ABSOLUTE
0x01
Data pergerakan mouse didasarkan pada posisi absolut. Untuk informasi selengkapnya tentang gerakan mouse, lihat bagian Komentar berikut.
MOUSE_VIRTUAL_DESKTOP
0x02
Koordinat mouse dipetakan ke desktop virtual (untuk beberapa sistem monitor). Untuk informasi selengkapnya tentang gerakan mouse, lihat bagian Komentar berikut.
MOUSE_ATTRIBUTES_CHANGED
0x04
Atribut mouse berubah; aplikasi perlu mengkueri atribut mouse.
MOUSE_MOVE_NOCOALESCE
0x08
Kejadian gerakan mouse ini tidak digabungkan. Peristiwa gerakan mouse dapat dikoalesced secara default.
Windows XP/2000: Nilai ini tidak didukung.

DUMMYUNIONNAME

DUMMYUNIONNAME.ulButtons

Jenis: ULONG

Dipesan.

DUMMYUNIONNAME.DUMMYSTRUCTNAME

DUMMYUNIONNAME.DUMMYSTRUCTNAME.usButtonFlags

Jenis: USHORT

Status transisi tombol mouse. Anggota ini bisa menjadi satu atau beberapa nilai berikut.

Nilai Arti
RI_MOUSE_BUTTON_1_DOWN
RI_MOUSE_LEFT_BUTTON_DOWN
0x0001
Tombol kiri diubah ke bawah.
RI_MOUSE_BUTTON_1_UP
RI_MOUSE_LEFT_BUTTON_UP
0x0002
Tombol kiri diubah ke atas.
RI_MOUSE_BUTTON_2_DOWN
RI_MOUSE_RIGHT_BUTTON_DOWN
0x0004
Tombol kanan diubah ke bawah.
RI_MOUSE_BUTTON_2_UP
RI_MOUSE_RIGHT_BUTTON_UP
0x0008
Tombol kanan diubah ke atas.
RI_MOUSE_BUTTON_3_DOWN
RI_MOUSE_MIDDLE_BUTTON_DOWN
0x0010
Tombol tengah diubah ke bawah.
RI_MOUSE_BUTTON_3_UP
RI_MOUSE_MIDDLE_BUTTON_UP
0x0020
Tombol tengah berubah ke atas.
RI_MOUSE_BUTTON_4_DOWN
0x0040
XBUTTON1 berubah menjadi tidak berfungsi.
RI_MOUSE_BUTTON_4_UP
0x0080
XBUTTON1 berubah menjadi naik.
RI_MOUSE_BUTTON_5_DOWN
0x0100
XBUTTON2 berubah menjadi tidak berfungsi.
RI_MOUSE_BUTTON_5_UP
0x0200
XBUTTON2 berubah menjadi naik.
RI_MOUSE_WHEEL
0x0400
Input mentah berasal dari roda mouse. Delta roda disimpan di usButtonData.
Nilai positif menunjukkan bahwa roda diputar ke depan, jauh dari pengguna; nilai negatif menunjukkan bahwa roda diputar mundur, ke arah pengguna. Untuk informasi selengkapnya, lihat bagian Keterangan berikut.
RI_MOUSE_HWHEEL
0x0800
Input mentah berasal dari roda mouse horizontal. Delta roda disimpan di usButtonData.
Nilai positif menunjukkan bahwa roda diputar ke kanan; nilai negatif menunjukkan bahwa roda diputar ke kiri. Untuk informasi selengkapnya, lihat bagian Keterangan berikut.
Windows XP/2000: Nilai ini tidak didukung.

DUMMYUNIONNAME.DUMMYSTRUCTNAME.usButtonData

Jenis: USHORT

Jika usButtonFlags memiliki RI_MOUSE_WHEEL atau RI_MOUSE_HWHEEL, anggota ini menentukan jarak roda diputar. Untuk informasi selengkapnya, lihat bagian Keterangan berikut.

ulRawButtons

Jenis: ULONG

Status mentah tombol mouse. Subsistem Win32 tidak menggunakan anggota ini.

lLastX

Jenis: LONG

Gerakan ke arah X. Ini ditandatangani gerakan relatif atau gerakan absolut, tergantung pada nilai usFlags.

lLastY

Jenis: LONG

Gerakan ke arah Y. Ini ditandatangani gerakan relatif atau gerakan absolut, tergantung pada nilai usFlags.

ulExtraInformation

Jenis: ULONG

Informasi khusus perangkat tambahan untuk peristiwa tersebut. Lihat Membedakan Input Pena dari Mouse dan Sentuh untuk informasi selengkapnya.

Komentar

Jika mouse telah bergerak, ditunjukkan oleh MOUSE_MOVE_RELATIVE atau MOUSE_MOVE_ABSOLUTE, lLastX dan lLastY menentukan informasi tentang gerakan tersebut. Informasi ditentukan sebagai nilai bilangan bulat relatif atau absolut.

Jika nilai MOUSE_MOVE_RELATIVE ditentukan, lLastX dan lLastY menentukan gerakan relatif terhadap peristiwa mouse sebelumnya (posisi terakhir yang dilaporkan). Nilai positif berarti mouse bergerak ke kanan (atau ke bawah); nilai negatif berarti mouse bergerak ke kiri (atau ke atas).

Jika nilai MOUSE_MOVE_ABSOLUTE ditentukan, lLastX dan lLastY berisi koordinat absolut yang dinormalisasi antara 0 dan 65.535. Koordinat (0,0) peta ke sudut kiri atas permukaan tampilan; koordinat (65535.65535) memetakan ke sudut kanan bawah. Dalam sistem multimonitor, koordinat memetakan ke monitor utama.

Jika MOUSE_VIRTUAL_DESKTOP ditentukan selain MOUSE_MOVE_ABSOLUTE, koordinat memetakan ke seluruh desktop virtual.

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;
}

Berbeda dengan pesan jendela warisan WM_MOUSEMOVE peristiwa mouse Input Mentah tidak tunduk pada efek kecepatan mouse yang diatur dalam lembar Properti Mouse Panel Kontrol. Lihat Gambaran Umum Input Mouse untuk detailnya.

Jika roda mouse dipindahkan, ditunjukkan oleh RI_MOUSE_WHEEL atau RI_MOUSE_HWHEEL di usButtonFlags, maka usButtonData berisi nilai pendek yang menentukan jarak roda diputar.

Rotasi roda akan menjadi kelipatan WHEEL_DELTA, yang diatur pada 120. Ini adalah ambang batas untuk tindakan yang akan diambil, dan satu tindakan seperti itu (misalnya, menggulir satu kenaikan) harus terjadi untuk setiap delta.

Delta diatur ke 120 untuk memungkinkan Microsoft atau vendor lain membangun roda resolusi yang lebih halus (roda yang diputar bebas tanpa takik) untuk mengirim lebih banyak pesan per rotasi, tetapi dengan nilai yang lebih kecil di setiap pesan. Untuk menggunakan fitur ini, Anda dapat menambahkan nilai delta masuk hingga WHEEL_DELTA tercapai (sehingga untuk rotasi delta Anda mendapatkan respons yang sama), atau menggulir baris parsial sebagai respons terhadap pesan yang lebih sering. Anda juga dapat memilih granularitas gulir dan mengakumulasi delta hingga tercapai.

Aplikasi ini juga dapat mengambil pengaturan pengguna lines-to-scroll dan characters-to-scroll saat ini dengan menggunakan SystemParametersInfo API dengan parameter SPI_GETWHEELSCROLLLINES atau SPI_GETWHEELSCROLLCHARS.

Berikut adalah contoh kode penanganan roda tersebut:

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;
        ...
    }
}

Persyaratan

Syarat Nilai
klien minimum yang didukung Windows XP [hanya aplikasi desktop]
server minimum yang didukung Windows Server 2003 [hanya aplikasi desktop]
Header winuser.h (termasuk Windows.h)

Lihat juga

Konseptual

GetRawInputDeviceInfo

RAWINPUT

Input Mentah

Referensi

struktur MOUSEINPUT

fungsi SendInput

struktur MOUSE_INPUT_DATA

Gambaran Umum Input Mouse (warisan)

Pemberitahuan Input Mouse (warisan)

SystemParametersInfo