Struttura RAWMOUSE (winuser.h)
Contiene informazioni sullo stato del mouse.
Sintassi
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;
Membri
usFlags
Tipo: USHORT
Stato del mouse. Questo membro può essere qualsiasi combinazione ragionevole dei seguenti elementi.
Valore | Significato |
---|---|
MOUSE_MOVE_RELATIVE 0x00 |
I dati sullo spostamento del mouse sono relativi all'ultima posizione del mouse. Per altre informazioni sul movimento del mouse, vedere la sezione Osservazioni seguente. |
MOUSE_MOVE_ABSOLUTE 0x01 |
I dati di spostamento del mouse si basano sulla posizione assoluta. Per altre informazioni sul movimento del mouse, vedere la sezione Osservazioni seguente. |
MOUSE_VIRTUAL_DESKTOP 0x02 |
Le coordinate del mouse vengono mappate al desktop virtuale (per un sistema di monitoraggio multiplo). Per altre informazioni sul movimento del mouse, vedere la sezione Osservazioni seguente. |
MOUSE_ATTRIBUTES_CHANGED 0x04 |
Attributi del mouse modificati; l'applicazione deve eseguire query sugli attributi del mouse. |
MOUSE_MOVE_NOCOALESCE 0x08 |
Questo evento di spostamento del mouse non è stato unito. Gli eventi di spostamento del mouse possono essere uniti per impostazione predefinita. Windows XP/2000: questo valore non è supportato. |
DUMMYUNIONNAME
DUMMYUNIONNAME.ulButtons
Tipo: ULONG
Riservato.
DUMMYUNIONNAME.DUMMYSTRUCTNAME
DUMMYUNIONNAME.DUMMYSTRUCTNAME.usButtonFlags
Tipo: USHORT
Stato di transizione dei pulsanti del mouse. Questo membro può essere uno o più dei valori seguenti.
Valore | Significato |
---|---|
RI_MOUSE_BUTTON_1_DOWN RI_MOUSE_LEFT_BUTTON_DOWN 0x0001 |
Il pulsante sinistro è cambiato in basso. |
RI_MOUSE_BUTTON_1_UP RI_MOUSE_LEFT_BUTTON_UP 0x0002 |
Il pulsante sinistro è stato modificato in alto. |
RI_MOUSE_BUTTON_2_DOWN RI_MOUSE_RIGHT_BUTTON_DOWN 0x0004 |
Il pulsante destro è cambiato in basso. |
RI_MOUSE_BUTTON_2_UP RI_MOUSE_RIGHT_BUTTON_UP 0x0008 |
Il pulsante destro è cambiato in alto. |
RI_MOUSE_BUTTON_3_DOWN RI_MOUSE_MIDDLE_BUTTON_DOWN 0x0010 |
Il pulsante centrale è cambiato in basso. |
RI_MOUSE_BUTTON_3_UP RI_MOUSE_MIDDLE_BUTTON_UP 0x0020 |
Pulsante centrale modificato in su. |
RI_MOUSE_BUTTON_4_DOWN 0x0040 |
XBUTTON1 modificato inattivo. |
RI_MOUSE_BUTTON_4_UP 0x0080 |
XBUTTON1 modificata. |
RI_MOUSE_BUTTON_5_DOWN 0x0100 |
XBUTTON2 modificato in basso. |
RI_MOUSE_BUTTON_5_UP 0x0200 |
XBUTTON2 modificata. |
RI_MOUSE_WHEEL 0x0400 |
L'input non elaborato proviene da una rotellina del mouse. Il delta della rotellina viene archiviato in usButtonData. Un valore positivo indica che la ruota è stata ruotata in avanti, lontano dall'utente; un valore negativo indica che la ruota è stata ruotata all'indietro, verso l'utente. Per altre informazioni, vedere la sezione osservazioni seguente. |
RI_MOUSE_HWHEEL 0x0800 |
L'input non elaborato proviene da una rotellina del mouse orizzontale. Il delta della rotellina viene archiviato in usButtonData. Un valore positivo indica che la ruota è stata ruotata a destra; un valore negativo indica che la ruota è stata ruotata a sinistra. Per altre informazioni, vedere la sezione osservazioni seguente. Windows XP/2000: questo valore non è supportato. |
DUMMYUNIONNAME.DUMMYSTRUCTNAME.usButtonData
Tipo: USHORT
Se usButtonFlags ha RI_MOUSE_WHEEL o RI_MOUSE_HWHEEL, questo membro specifica la distanza di rotazione della ruota. Per altre informazioni, vedere la sezione osservazioni seguente.
ulRawButtons
Tipo: ULONG
Stato non elaborato dei pulsanti del mouse. Il sottosistema Win32 non usa questo membro.
lLastX
Tipo: LONG
Movimento nella direzione X. Questo è movimento relativo firmato o movimento assoluto, a seconda del valore di usFlags.
lLastY
Tipo: LONG
Movimento nella direzione Y. Questo è movimento relativo firmato o movimento assoluto, a seconda del valore di usFlags.
ulExtraInformation
Tipo: ULONG
Informazioni aggiuntive specifiche del dispositivo per l'evento. Per altre informazioni, vedi Distinguere l'input penna dal mouse e dal tocco.
Osservazioni
Se il mouse è stato spostato, indicato da MOUSE_MOVE_RELATIVE o MOUSE_MOVE_ABSOLUTE, lLastX e lLastY specificare informazioni su tale movimento. Le informazioni sono specificate come valori integer relativi o assoluti.
Se viene specificato MOUSE_MOVE_RELATIVE valore, lLastX e lLastY specificare lo spostamento rispetto all'evento precedente del mouse (l'ultima posizione segnalata). I valori positivi indicano lo spostamento del mouse verso destra (o verso il basso); i valori negativi indicano che il mouse è stato spostato verso sinistra (o su).
Se viene specificato MOUSE_MOVE_ABSOLUTE valore, lLastX e lLastY contengono coordinate assolute normalizzate comprese tra 0 e 65.535. Coordinata (0,0) mappa nell'angolo superiore sinistro della superficie di visualizzazione; coordinata (65535,65535) mappa nell'angolo inferiore destro. In un sistema multimonitor, le coordinate eseguono il mapping al monitoraggio primario.
Se MOUSE_VIRTUAL_DESKTOP viene specificato oltre a MOUSE_MOVE_ABSOLUTE, le coordinate vengono mappate all'intero desktop virtuale.
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;
}
A differenza dei messaggi della finestra di WM_MOUSEMOVE legacy, gli eventi mouse input non elaborato non sono soggetti agli effetti della velocità del mouse impostata nel pannello di controllo proprietà mouse foglio. Per informazioni dettagliate, vedere panoramica dell'input del mouse
Se la rotellina del mouse viene spostata, indicata da RI_MOUSE_WHEEL o RI_MOUSE_HWHEEL in usButtonFlags, usButtonData contiene un valore breve che specifica la distanza di rotazione della rotellina.
La rotazione della ruota sarà un multiplo di WHEEL_DELTA, impostato su 120. Si tratta della soglia per l'esecuzione dell'azione e deve verificarsi un'azione di questo tipo (ad esempio, lo scorrimento di un incremento) per ogni delta.
Il delta è stato impostato su 120 per consentire a Microsoft o ad altri fornitori di creare ruote a risoluzione più fine (una ruota a rotazione libera senza tacche) per inviare più messaggi per rotazione, ma con un valore più piccolo in ogni messaggio. Per usare questa funzionalità, è possibile aggiungere i valori delta in ingresso fino a quando non viene raggiunta WHEEL_DELTA (quindi per una rotazione differenziale si ottiene la stessa risposta) o scorrere le righe parziali in risposta ai messaggi più frequenti. È anche possibile scegliere la granularità di scorrimento e accumulare delta fino a raggiungere.
L'applicazione può anche recuperare l'impostazione utente corrente da scorrere e caratteri a scorrimento usando l'API systemParametersInfo
Di seguito è riportato un esempio di codice di gestione delle ruote:
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;
...
}
}
Fabbisogno
Requisito | Valore |
---|---|
client minimo supportato | Windows XP [solo app desktop] |
server minimo supportato | Windows Server 2003 [solo app desktop] |
intestazione |
winuser.h (include Windows.h) |
Vedere anche
concettuale
riferimento
panoramica dell'input del mouse
notifiche di input del mouse