Conoscere le coordinate correnti del mouse sullo schermo
Da Gambas-it.org - Wikipedia.
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.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
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() Label1.Text = 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: 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
Note
[1] Vedere anche le seguenti pagine: