Differenze tra le versioni di "Simulare il tasto premuto del mouse usando le funzioni esterne del API di X11"

Da Gambas-it.org - Wikipedia.
Riga 4: Riga 4:
  
 
Mostriamo un semplice esempio, nel quale - simulando la pressione sul tasto sinistro del mouse - si cliccherà automaticamente su un ''Button'' posto sul ''Form''.
 
Mostriamo un semplice esempio, nel quale - simulando la pressione sul tasto sinistro del mouse - si cliccherà automaticamente su un ''Button'' posto sul ''Form''.
Private dsp As Pointer
 
 
  Private Button1 As Button
 
  Private Button1 As Button
 
   
 
   
Riga 41: Riga 40:
 
   Mouse.Move(Button1.ScreenX + 20, Button1.ScreenY + (Button1.H * 0.5))
 
   Mouse.Move(Button1.ScreenX + 20, Button1.ScreenY + (Button1.H * 0.5))
 
    
 
    
   dsp = XOpenDisplay(0)
+
   Dim dsp As Pointer = XOpenDisplay(0)
 
   If dsp == 0 Then Error.Raise("Errore !")
 
   If dsp == 0 Then Error.Raise("Errore !")
 
   XButtonClick(dsp, 1, CByte(True), 500)
 
   XButtonClick(dsp, 1, CByte(True), 500)

Versione delle 16:23, 28 ago 2022

La simulazione del tasto sinistro premuto del mouse (ossia generare un "_MouseDown()" e "_MouseUp()" o un "_Click()" automaticamente senza l'intervento manuale dell'utente) su un Controllo grafico o comunque su una qualsiasi finestra/superficie (desktop compreso), è un Evento a volte richiesto dai programmatori, ma di difficilissima realizzazione in Gambas.

Una soluzione può essere il richiamo diretto - mediante l'istruzione "Extern" - e indiretto - mediante una libreria esterna appositamente realizzata - di alcune funzioni esterne del sistema grafico X11, e contenute in particolare nella libreria condivisa: "libX11.so.6.3.0 ".

Mostriamo un semplice esempio, nel quale - simulando la pressione sul tasto sinistro del mouse - si cliccherà automaticamente su un Button posto sul Form.

Private Button1 As Button

Library "libX11:6.3.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 XFlush(Display *display)
' Flushes the output buffer.
Private Extern XFlush(display As Pointer)

' 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

 ' void XButtonClick(Display * disp, int button, int is_press, int delay)
Private Extern XButtonClick(display As Pointer, xbutton As Integer, is_press As Boolean, delay As Integer) In "/tmp/mouse"


Public Sub _new()

 With Button1 = New Button(Me) As "Button1"
   .X = 0
   .Y = 20
   .W = 100
   .H = 50
 End With

 Me.Show
 
' Va a generare la libreria esterna condivisa ad hoc per la gestione di alcune particolarissime funzioni di X11:
 creaso()

 Mouse.Move(Button1.ScreenX + 20, Button1.ScreenY + (Button1.H * 0.5))
 
 Dim dsp As Pointer = XOpenDisplay(0)
 If dsp == 0 Then Error.Raise("Errore !")
 XButtonClick(dsp, 1, CByte(True), 500)
 XFlush(dsp)
 Wait 0.7
 XButtonClick(dsp, 1, CByte(False), 0)
 XFlush(dsp)

 XCloseDisplay(dsp)
' Assicura che il Puntatore non punti a un indirizzo rilevante di memoria:
 dsp = 0
  
End

Private Procedure Creaso()
 
 File.Save("/tmp/mouse.c", "#include <X11/Xlib.h>\n" &
                           "#include <X11/extensions/XTest.h>\n" &
                           "void XButtonClick(Display * disp, int button, int is_press, int delay) {\n"
                           "  XTestFakeButtonEvent(disp, button, is_press, delay);\n}")

 Shell "gcc -o /tmp/mouse.so /tmp/mouse.c -shared -lX11 -lXtst" Wait

End

Public Sub Button1_Click()

 Print "Tasto premuto !"

End