Archive for the ‘Mouse’ Category
Per contare le linee di scroll della rotella del mouse utilizziamo l’API SystemParametersInfo già usata in altri appunti. Di seguito una funzione che restituisce il numero di linee:
function GETWHEELSCROLLLINES: Integer;
begin
SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, @Result, 0);
end;
Se restituisce -1 dovrebbe essere impostato per lo scroll dell’intera pagina.
Compatibile con:
- Windows XP: SI
- Windows VISTA: SI
E’ molto utile se si pensa di dover pilotare una finestra di terzi o un sito web, una volta acquisite le giuste posizioni del mouse.
Posiziona il mouse
SetCursorPos(x, y);
Simulazione della pressione del tasto sinistro del mouse
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
Simulazione di pressione del pulsante destro del mouse
mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);
Simulazione del doppio click del mouse
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
GetDoubleClickTime;
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
Compatibile con:
- Windows XP: SI
- Windows VISTA: SI
Questa funzione permette di invertire i pulsanti del mouse:
SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP, 1, nil, 0);
Per far tornare invece i pulsanti allo stato originale:
SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP, 0, nil, 0);
Ho utilizzato questa funzione una sola volta in quanto si rischia di confondere l’utente, soprattutto se non si prevedono tutte le casistiche, ad esempio nell’eventualità di un errore che chiude l’applicazione in modo inaspettato i pulsanti rimangono invertiti. Il seguito ve lo faccio immaginare.
Comunque è possibile chiamare l’API SystemParametersInfo per impostare e ottenere tutte le impostazioni controllate dal Pannello di controllo di Windows. Nei prossimi appunti vedremo come.
A volte si può rilevare utile ottenere la posizione corrente del mouse. Nelle mie applicazioni ho utilizzato due metodi distinti.
Se devo semplicemente rilevare le posizione del mouse sul form o su un componente è possibile utilizzare l’evento onmousemove del componente nella seguente maniera:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
x_edit.Text :=’X=’+ IntToStr(X);
y_edit.Text:=’Y=’+ IntToStr(Y);
end;
Tuttavia questo metodo restituisce la posizione del mouse relativa al form o al componente solo quando il mouse su trova sul componente. Ad esempio se sto rilevando la posizione del mouse sul form e con il mouse vado su un textbox onmousemove del form smetterà di restituire la posizione in quanto il mouse non si trova più sul componente form.
Un’altro metodo alternativo al primo è quello di restituire la posizione del mouse relativa allo schermo inserendo ad esempio il seguente codice in un Timer:
var
pmouse: TPoint;
begin
GetCursorPos(pmouse);
x_edit1.Text :=’X=’+ IntToStr(pmouse.x);
y_edit1.text :=’Y=’+ IntToStr(pmouse.y);
end;
Potete scaricare i sorgenti e l’eseguibile di esempio da qui: Posizione_Mouse
Nell’esempio dei sorgenti potrete notare la differenza tra i due metodi qui spiegati.