Condividi tramite


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 con il parametro SPI_GETWHEELSCROLLLINES o SPI_GETWHEELSCROLLCHARS.

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

GetRawInputDeviceInfo

RAWINPUT

input non elaborato

riferimento

struttura MOUSEINPUT

funzione SendInput

MOUSE_INPUT_DATA struttura

panoramica dell'input del mouse (legacy)

notifiche di input del mouse (legacy)

SystemParametersInfo