Conoscere le coordinate correnti del mouse sullo schermo
Indice
Uso delle sole risorse di Gambas
Per conoscere le coordinate correnti del puntatore del mouse sullo schermo anche al di fuori di un Form/finestra di un programma Gambas, è possibile utilizzare le Proprietà ".ScreenX" e ".ScreenY" della Classe Mouse.
Usando l'Oggetto Timer
Mostriamo un esempio con l'aiuto della Classe Timer:
Private tm As Timer Public Sub Form_Open() With tm = New Timer As "Tempus" .Delay = 50 .Start End With End Public Sub Tempus_Timer() ' Mostra i risultati nella parte alta (intestazione) del bordo del "Form" principale: Me.Text = "X = " & CStr(Mouse.ScreenX) & " Y = " & CStr(Mouse.ScreenY) End
Usando un ciclo
In quest'altro esempio si utilizzerà un ciclo infinito:
Public Sub Form_Open() ' Consente l'apertura del "Form": Me.Show() Do ' Mostra i risultati nella parte alta (intestazione) del bordo del "Form" principale: Me.Text = "X = " & CStr(Mouse.ScreenX) & " Y = " & CStr(Mouse.ScreenY) ' Il "Wait" consente un risparmio delle risorse di sistema e di poter agire su eventuali Oggetti grafici posti sul "Form": Wait 0.1 Loop End
Intercettando i dati grezzi letti dal file-device del mouse
Un'altra modalità può essere intercettando i dati grezzi letti dal file-device del mouse "/dev/input/mouse0 " (al quale andrà eliminata preliminarmente la protezione per poter essere utilizzato).
Si rinvia a questo paragrafo della Wiki:
https://www.gambas-it.org/wiki/index.php/Intercettare_i_dati_del_mouse_dai_file-device_mouse,_mice,_event#...un.27applicazione_pratica
Uso delle funzioni esterne del API di X11
E' possibile utilizzare anche alcune funzioni esterne del API del sistema X11.
Mostriamo di seguito un esempio pratico:
Private tempus As Timer Private dsp As Pointer Private win As Integer Library "libX11:6.4.0" ' Display *XOpenDisplay(char *display_name) ' Opens a connection to the X server that controls a display. Private Extern XOpenDisplay(display_name As Pointer) As Pointer ' int XDefaultScreen (Display *display) ' returns the default screen number referenced by the XOpenDisplay function. Private Extern XDefaultScreen(display As Pointer) As Integer ' Window XRootWindow(Display *display, int screen_number) ' Returns the root window. Private Extern XRootWindow(display As Pointer, screen_number As Integer) As Integer ' Bool XQueryPointer(Display *display, Window w, Window *root_return, Window *child_return, int *root_x_return, int *root_y_return, int *win_x_return, int *win_y_return, unsigned int *mask_return) ' Returns the root window the pointer is logically on and the pointer coordinates relative to the root window's origin. Private Extern XQueryPointer(display As Pointer, w As Integer, root_return As Pointer, child_return As Pointer, root_x_return As Pointer, root_y_return As Pointer, win_x_return As Pointer, win_y_return As Pointer, mask_return As Pointer) As Boolean ' int XUngrabServer(Display *display) ' Restarts processing of requests and close downs on other connections. Private Extern XUngrabServer(display As Pointer) As Integer ' int XCloseDisplay(Display *display) ' Closes the connection to the X server for the display specified in the Display structure and destroys all windows. Private Extern XCloseDisplay(display As Pointer) As Integer Public Sub Main() Dim scr As Integer dsp = XOpenDisplay(0) If dsp == 0 Then Error.Raise("Impossibile connettersi al server X !") scr = XDefaultScreen(dsp) win = XRootWindow(dsp, scr) With tempus = New Timer As "Tempus" .Delay = 100 .Start End With End Public Sub Tempus_Timer() Dim rr, cr, x, y, xr, yr, mr As Integer XQueryPointer(dsp, win, VarPtr(rr), VarPtr(cr), VarPtr(x), VarPtr(y), VarPtr(xr), VarPtr(yr), VarPtr(mr)) ' Mostra le coordinate x, y attuali del puntatore del mouse sullo schermo: Print x, y End Public Sub Application_Read() ' Se si preme il tasto "Invio" della tastiera, viene chiuso il programma tempus.Stop XUngrabServer(dsp) XCloseDisplay(dsp) Quit End