Funzione GetMouseMovePointsEx (winuser.h)

Recupera una cronologia di un massimo di 64 coordinate precedenti del mouse o della penna.

Sintassi

int GetMouseMovePointsEx(
  [in]  UINT             cbSize,
  [in]  LPMOUSEMOVEPOINT lppt,
  [out] LPMOUSEMOVEPOINT lpptBuf,
  [in]  int              nBufPoints,
  [in]  DWORD            resolution
);

Parametri

[in] cbSize

Tipo: UINT

Dimensione, in byte, della struttura MOUSEMOVEPOINT .

[in] lppt

Tipo: LPMOUSEMOVEPOINT

Puntatore a una struttura MOUSEMOVEPOINT contenente coordinate del mouse valide (nelle coordinate dello schermo). Può anche contenere un timestamp.

La funzione GetMouseMovePointsEx cerca il punto nella cronologia delle coordinate del mouse. Se la funzione trova il punto, restituisce gli ultimi nBufPoints precedenti e include il punto fornito.

Se l'applicazione fornisce un timestamp, la funzione GetMouseMovePointsEx la userà per distinguere tra due punti uguali registrati in momenti diversi.

Un'applicazione deve chiamare questa funzione usando le coordinate del mouse ricevute dal messaggio WM_MOUSEMOVE e convertirle in coordinate dello schermo.

[out] lpptBuf

Tipo: LPMOUSEMOVEPOINT

Puntatore a un buffer che riceverà i punti. Deve essere almeno cbSize* nBufPoints in dimensioni.

[in] nBufPoints

Tipo: int

Numero di punti da recuperare.

[in] resolution

Tipo: DWORD

Risoluzione desiderata. Questo parametro può avere uno dei valori seguenti.

Valore Significato
GMMP_USE_DISPLAY_POINTS
1
Recupera i punti utilizzando la risoluzione dello schermo.
GMMP_USE_HIGH_RESOLUTION_POINTS
2
Recupera punti ad alta risoluzione. I punti possono variare da zero a 65.535 (0xFFFF) in coordinate x e y. Questa è la risoluzione fornita da dispositivi di coordinata assoluta, ad esempio tavole di disegno.

Valore restituito

Tipo: int

Se la funzione ha esito positivo, il valore restituito è il numero di punti nel buffer. In caso contrario, la funzione restituisce –1. Per informazioni sugli errori estesi, l'applicazione può chiamare GetLastError.

Commenti

Il sistema mantiene le ultime 64 coordinate del mouse e i relativi timestamp. Se l'applicazione fornisce una coordinata del mouse a GetMouseMovePointsEx e la coordinata esiste nella cronologia delle coordinate del mouse del sistema, la funzione recupera il numero specificato di coordinate dalla cronologia dei sistemi. È anche possibile specificare un timestamp, che verrà usato per distinguere tra punti identici nella cronologia.

La funzione GetMouseMovePointsEx restituirà punti che alla fine sono stati inviati non solo al thread chiamante, ma anche ad altri thread.

GetMouseMovePointsEx potrebbe non riuscire o restituire valori errati nei casi seguenti:

  • Se le coordinate negative vengono passate nella struttura MOUSEMOVEPOINT .
  • Se GetMouseMovePointsEx recupera una coordinata con un valore negativo.
Queste situazioni possono verificarsi se sono presenti più monitor. Per risolvere il problema, chiamare prima GetSystemMetrics per ottenere i valori seguenti:
  • SM_XVIRTUALSCREEN,
  • SM_YVIRTUALSCREEN,
  • SM_CXVIRTUALSCREEN e
  • SM_CYVIRTUALSCREEN.
Quindi, per ogni punto restituito da GetMouseMovePointsEx, eseguire la trasformazione seguente:
int nVirtualWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN) ;
int nVirtualHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN) ;
int nVirtualLeft = GetSystemMetrics(SM_XVIRTUALSCREEN) ;
int nVirtualTop = GetSystemMetrics(SM_YVIRTUALSCREEN) ;
int cpt = 0 ;
int mode = GMMP_USE_DISPLAY_POINTS ;

MOUSEMOVEPOINT mp_in ;
MOUSEMOVEPOINT mp_out[64] ;

ZeroMemory(&mp_in, sizeof(mp_in)) ;
mp_in.x = pt.x & 0x0000FFFF ;//Ensure that this number will pass through.
mp_in.y = pt.y & 0x0000FFFF ;
cpt = GetMouseMovePointsEx(&mp_in, &mp_out, 64, mode) ;

for (int i = 0; i < cpt; i++)
{
   switch(mode)
   {
   case GMMP_USE_DISPLAY_POINTS:
      if (mp_out[i].x > 32767)
         mp_out[i].x -= 65536 ;
      if (mp_out[i].y > 32767)
         mp_out[i].y -= 65536 ;
      break ;
   case GMMP_USE_HIGH_RESOLUTION_POINTS:
      mp_out[i].x = ((mp_out[i].x * (nVirtualWidth - 1)) - (nVirtualLeft * 65536)) / nVirtualWidth ;
      mp_out[i].y = ((mp_out[i].y * (nVirtualHeight - 1)) - (nVirtualTop * 65536)) / nVirtualHeight ;
      break ;
   }
} 

Requisiti

Requisito Valore
Client minimo supportato Windows 2000 Professional [solo app desktop]
Server minimo supportato Windows 2000 Server [solo app desktop]
Piattaforma di destinazione Windows
Intestazione winuser.h (include Windows.h)
Libreria User32.lib
DLL User32.dll

Vedi anche

Informazioni concettuali

MOUSEMOVEPOINT

Mouse Input

Riferimento