Conoscere le coordinate correnti del mouse sullo schermo

Da Gambas-it.org - Wikipedia.

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.


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: