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:
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:
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:
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
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
Input Mentah
Referensi
fungsi SendInput
struktur
Gambaran Umum Input Mouse (warisan)
Pemberitahuan Input Mouse