Segmentation Fault mouse click

di il
5 risposte

Segmentation Fault mouse click

Salve a tutti
sto scrivendo un programma in C++ che sia in grado di simulare il click sinistro del mouse, in una data posizione x,y dello schermo.
ispirandomi da una porzione di codice funzionante, ho trovato la funzione XTestFakeButtonEvent() che "clicca". La compilazione non mi restituisce nessun errore, ma al momento di eseguire la suddetta funzione appare
Segmentation Fault
da che cosa può dipendere?

#include <X11/extensions/XTest.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
[...]
Display *display ;
[...]
void XN_CALLBACK_TYPE Push_Pushed(XnFloat fVelocity, XnFloat fAngle, void* cxt)
{
printf("\n  oh hai cliccato\n");
XTestFakeButtonEvent(display, 1, TRUE, CurrentTime);
XTestFakeButtonEvent(display, 1, FALSE, CurrentTime);
	
}
il programma funzionante si trova a questo indirizzo
https://github.com/Ooblik/Kinect-Mouse/blob/master/kinect_mouse.c


è possibile che si possa usare solo in C e non C++.

5 Risposte

  • Re: Segmentation Fault mouse click

    Wow x11
    domani te lo checko

    bye
  • Re: Segmentation Fault mouse click

    Si, mi sono dimenticato di dire che sto su ubuntu.
  • Re: Segmentation Fault mouse click

    X11 è molto tosto da studiare spero tu lo conosca abbastanza bene per metterci le mani.
    Ti consiglio di utilizzare toolkit che stanno sopra Xlib tipo gtk o qt che hanno il porting verso il ++

    cmq, ecco un esempio funzionante su Xlib alias X11:
    
    #include <X11/extensions/XTest.h>
    #include <X11/Xlib.h>
    #include <stdio.h>
    
    int main()
    {
    
      Display *dpy = XOpenDisplay(NULL);
      if (!dpy) return 1;
    
      XTestFakeButtonEvent(dpy,3,True,1);
    
      XCloseDisplay(dpy);
    
      return 0;
    }
    
    
    g++ -lX11 -lXtst -L/usr/include/X11 fake.c -o fake
    

    A me funziona anche se personalmente userei la xsendevent. tipo:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #include <unistd.h>
    
    #include <X11/Xlib.h>
    #include <X11/Xutil.h>
    
    void FakeClick(int button)
    {
        Display *display = XOpenDisplay(NULL);
    
        XEvent event;
        
        if(display == NULL)
        {
            fprintf(stderr, "Errore nell'apertura del Display !!!\n");
            exit(EXIT_FAILURE);
        }
        
        memset(&event, 0x00, sizeof(event));
        
        event.type = ButtonPress;
        event.xbutton.button = button;
        event.xbutton.same_screen = True;
        
        XQueryPointer(display, RootWindow(display, DefaultScreen(display)), &event.xbutton.root, &event.xbutton.window, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state);
        
        event.xbutton.subwindow = event.xbutton.window;
        
        while(event.xbutton.subwindow)
        {
            event.xbutton.window = event.xbutton.subwindow;
            
            XQueryPointer(display, event.xbutton.window, &event.xbutton.root, &event.xbutton.subwindow, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state);
        }
        
        if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) fprintf(stderr, "Errore nell'invio dell'evento !!!\n");
        
        XFlush(display);
        
        usleep(100000);
        
        event.type = ButtonRelease;
        event.xbutton.state = 0x100;
        
        if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) fprintf(stderr, "Errore nell'invio dell'evento !!!\n");
        
        XFlush(display);
        
        XCloseDisplay(display);
    }
    
    
    g++ -lX11 -L/usr/include/X11 fakeclick.c -o fakeclick
    

    Saluti,
    Max
  • Re: Segmentation Fault mouse click

    Grazie per la pronta risposta!

    per la prima opzione, ho integrato il codice nel mio programma ed al momento della compilazione restituisce questo errore
    error: expected unqualified-id before ‘if’
    riferito alla linea
      Display *dpy = XOpenDisplay(NULL);
      if (!dpy) return 1;
    se rimuovo la riga dell' if()
    me lo compila correttamente senza errori o warnings ma una volta eseguito non clicca... sarà dovuto a qualche conflitto?

    Mentre la seconda opzione funziona alla perfezione!!!

    Però avrei una domanda, ma X11 non sono le librerie grafiche che usa linux (ubuntu) per la grafica ?
    attualmente uso le opengl per impostare la posizione del mouse con la funzione
    glutWarpPointer(posx,posy);
    ma il campo d'azione è limitato, non posso arrivare a cliccare sulla barra delle applicazioni.
    Se usassi l'equivalente funzione delle X11 dovrei riuscire a spostarmi su tutto lo schermo?

    Edit:
    ci ho provato con la funzione
    XTestFakeMotionEvent(display, screen_number,  x, y, delay);
    includendo
    #include <X11/extensions/XTest.h>
    e restituisce
    undefined reference to `XTestFakeMotionEvent'
    collect2: ld returned 1 exit status
    Se eseguo il programma il mouse non si muove...
  • Re: Segmentation Fault mouse click

    se rimuovo la riga dell' if()
    me lo compila correttamente senza errori o warnings ma una volta eseguito non clicca... sarà dovuto a qualche conflitto?
    Naaa qualche carattere strano trasferito con copia/incolla. Cancella la riga e riscrivila
    Però avrei una domanda, ma X11 non sono le librerie grafiche che usa linux (ubuntu) per la grafica ?
    Xlib è principalmente un protocollo client/server usato da tutti i sistemi *nix e Apple (modificato) oltre ad essere un gestore grafico. La caratteristica principale ed anche il punto di forza è che puoi eseguire applicazioni da un client differente e visualizzarle sul proprio server... un po' come un VNC.
    *Nota che la terminologia client/server quì è opposta a quello che normalmente intendiamo.


    attualmente uso le opengl per impostare la posizione del mouse con la funzione
    Le OpenGL sono librerie grafiche che interagiscono a livello più basso direttamente con l'hardware sfruttando tutte le potenzialità delle nuove schede video, ma nativamente non avevano la trasparenza di rete aggiunta successivamente da GLX


    Se usassi l'equivalente funzione delle X11 dovrei riuscire a spostarmi su tutto lo schermo?
    Certo che si.
    ...
    l'estensione tst dovrebbe essere ad uso escusivo dei test incorporando -lXtst.
    inb4 la sconsiglio



    ~Max


    EDIT:
    
    #include <X11/extensions/XTest.h>
    #include <X11/Xlib.h>
    #include <stdio.h>
    
    int main()
    {
    
      Display *dpy = XOpenDisplay(NULL);
      
      if (!dpy) return 1;
    
        XTestFakeMotionEvent(dpy,XDefaultScreen(dpy),1,XHeightOfScreen(XScreenOfDisplay(dpy,XDefaultScreen(dpy))),1);
      XTestFakeButtonEvent(dpy,1,True,1);
    
      XCloseDisplay(dpy);
      
      return 0;
    }
    
    
    gcc -g prova.c -lX11 -lXtst
    
    ~Max
Devi accedere o registrarti per scrivere nel forum
5 risposte