GNU/Linux >> Tutoriels Linux >  >> Linux

Linux, comment capturer l'écran et simuler les mouvements de la souris

Je n'ai pas pu faire fonctionner le clic avec la méthode @axiom utilisée, seul le mouvement du pointeur. J'ai utilisé ceci à la place :(Ubuntu 18.04).

Compile avec :g++ mouse_click.cpp -lX11 -lXtst -lstdc++

#include<stdio.h>
#include<unistd.h>
#include <stdlib.h>
#include <string.h>

#include <unistd.h>

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/extensions/XTest.h>


void mouseClick(int button)
{
    Display *display = XOpenDisplay(NULL);

    // click left button
    XTestFakeButtonEvent(display, Button1, true, 0);
    XFlush(display);

    usleep(10000);

    // release left mouse
    XTestFakeButtonEvent(display, Button1, false, 0);
    XFlush(display);


    XCloseDisplay(display);


}
int main(int argc,char * argv[]) {

    int x , y;
    x=atoi(argv[1]);
    y=atoi(argv[2]);
    Display *display = XOpenDisplay(0);

    Window root = DefaultRootWindow(display);
    XTestFakeMotionEvent(display, root, x, y, 0);
    XFlush(display);
    mouseClick(Button1);
    XFlush(display);
    XCloseDisplay(display);
    return 0;
}

//sg

//Solution using Xlib for those who use Linux
#include <X11/Xlib.h>
#include<stdio.h>
#include<unistd.h>
#include <stdlib.h>
#include <string.h>

#include <unistd.h>

#include <X11/Xlib.h>
#include <X11/Xutil.h>

void mouseClick(int button)
{
    Display *display = XOpenDisplay(NULL);

    XEvent event;

    if(display == NULL)
    {
        fprintf(stderr, "Cannot initialize the 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, "Error\n");

    XFlush(display);

    usleep(100000);

    event.type = ButtonRelease;
    event.xbutton.state = 0x100;

    if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) fprintf(stderr, "Error\n");

    XFlush(display);

    XCloseDisplay(display);
}
int main(int argc,char * argv[]) {

    int x , y;
    x=atoi(argv[1]);
    y=atoi(argv[2]);
    Display *display = XOpenDisplay(0);

    Window root = DefaultRootWindow(display);
    XWarpPointer(display, None, root, 0, 0, 0, 0, x, y);
    mouseClick(Button1);
    XFlush(display);
    XCloseDisplay(display);
    return 0;
}

Construisez-le puis pour simuler un clic en x ,y faites :

$ ./a.out x y

c'est-à-dire

$ g++ -lX11 sgmousesim2.cpp

$ ./a.out 123 13

Juste au cas où vous seriez toujours intéressé.


Swinput est une solution pour simuler des événements souris/touche. Vous devez probablement le compiler pour votre noyau. Xorg a fourni quelques en-têtes pour enregistrer les événements souris/touche mais je pense qu'il est cassé pour le moment. Il y a un C code evtest qui peut être utilisé pour capturer les événements de /dev/input/eventX , /dev/input/mice des dossiers. Cela peut être utile.

Modifier :

Le bogue a été corrigé dans l'extension d'enregistrement Xorg, il peut donc fonctionner aussi.


Linux
  1. Comment afficher des informations supplémentaires sur le package à l'aide de yum et yumdb – RedHat Linux

  2. Comment gérer et répertorier les services sous Linux

  3. Comment installer et tester Ansible sur Linux

  4. Comment installer et utiliser Flatpak sous Linux

  5. Comment afficher les détails du système et du matériel dans Linux Mint 20

Comment renommer des fichiers et des répertoires sous Linux

Comment compresser des fichiers et des répertoires sous Linux

Comment faire un screencasting simple sur Linux

Comment capturer et diffuser votre session de jeu sur Linux

Comment installer et utiliser PuTTY sous Linux

Comment verrouiller le clavier et la souris, mais pas l'écran sous Linux