Differenze tra le versioni di "Simulare il tasto premuto del mouse usando le funzioni esterne del API di X11"
Riga 28: | Riga 28: | ||
'''Public''' Sub _new() | '''Public''' Sub _new() | ||
− | |||
− | |||
With Button1 = New Button(Me) As "Button1" | With Button1 = New Button(Me) As "Button1" | ||
Riga 37: | Riga 35: | ||
.H = 50 | .H = 50 | ||
End With | End With | ||
+ | |||
+ | Me.Show | ||
Wait 0.3 | Wait 0.3 |
Versione delle 15:45, 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 dsp As Pointer 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 Wait 0.3 ' 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)) dsp = XOpenDisplay(0) If dsp == 0 Then Error.Raise("Error !") XButtonClick(dsp, 1, CByte(True), 1000) XFlush(dsp) XButtonClick(dsp, 1, CByte(False), 1000) 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