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

Da Gambas-it.org - Wikipedia.
(Creata pagina con "La simulazione del tasto premuto (ossia generare un "_MouseDown()" e "_MouseUp()" o un "_Click()" automaticamente senza l'intervento manuale dell'utente) del mouse su un Contr...")
 
Riga 1: Riga 1:
La simulazione del tasto premuto (ossia generare un "_MouseDown()" e "_MouseUp()" o un "_Click()" automaticamente senza l'intervento manuale dell'utente) del mouse 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.
+
La simulazione del tasto 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 con l'istruzione "Extern" e indiretto mediante una libreria esterna ''ad hoc'', da noi realizzata, di alcune funzioni esterne del sistema grafico X11, e contenute in particolare nella libreria condivisa: "''libX11.so.6.3.0'' ".
+
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 si cliccherà automaticamente su un ''Button'' posto sul ''Form''.
 
Mostriamo un semplice esempio, nel quale si cliccherà automaticamente su un ''Button'' posto sul ''Form''.

Versione delle 15:16, 28 ago 2022

La simulazione del tasto 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 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()

 Me.Show

 With Button1 = New Button(Me) As "Button1"
   .X = 0
   .Y = 20
   .W = 100
   .H = 50
 End With
 
 Wait 0.3
 
' Va a generare la libreria esterna condivisa ad hoc per la gestione di alcune 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)
 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