Conoscere le coordinate correnti del mouse sullo schermo
In questa pagina mostreremo alcune modalità per conoscere le coordinate correnti del puntatore del mouse rispetto ovviamente all'angolo in alto a sinistra (x=0, y=0) dello schermo e senza tenere premuto un tasto del mouse.
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. [nota 1]
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.Title = "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.Title = "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
Ponendo in osservazione il file-device del Mouse
Per porre in "osservazione" un file-device del Mouse, è necessario eliminare la protezione di sistema impostata.
Esempio pratico, ponendo in osservazione il file-device "/dev/input/mouse0":
Private fl As File Public Sub Form_Open() ' Provvede a eliminare la protezione del file-device del mouse prescelto: Dim pw As String pw = InputBox("Immettere la propria password di sistema...") Shell "echo " & pw & " | sudo -S chmod 444 /dev/input/mouse0" Wait ' Apre il file-device "/dev/input/mouse0" e lo pone in "osservazione": fl = Open "/dev/input/mouse0" For Read Watch End Public Sub File_Read() Me.Title = Mouse.ScreenX & " " & Mouse.ScreenY End
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: Write "\r" & CStr(x) & " " & CStr(y) Flush 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
Note
[1] Vedere anche le seguenti pagine: