GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux, Bildschirm erfassen und Mausbewegungen simulieren

Ich konnte das Klicken mit der verwendeten Methode @axiom nicht zum Laufen bringen, nur die Bewegung des Zeigers. Ich habe stattdessen Folgendes verwendet:(Ubuntu 18.04).

Kompiliert mit: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;
}

Erstellen Sie es und simulieren Sie dann einen Klick auf x, y:

$ ./a.out x y

d.h.

$ g++ -lX11 sgmousesim2.cpp

$ ./a.out 123 13

Nur für den Fall, dass Sie immer noch interessiert sind.


Swinput ist eine Lösung zur Simulation von Maus-/Tastenereignissen. Sie müssen es wahrscheinlich für Ihren Kernel kompilieren. Xorg hat einige Header für die Aufzeichnung von Maus-/Tastenereignissen bereitgestellt, aber ich denke, dass es im Moment kaputt ist. Es gibt einen C code evtest, der zum Erfassen von Ereignissen aus /dev/input/eventX verwendet werden kann , /dev/input/mice Dateien. Es kann hilfreich sein.

Bearbeiten:

Der Fehler wurde in der Xorg-Eintragserweiterung behoben, also könnte es auch funktionieren.


Linux
  1. So zeigen Sie zusätzliche Paketinformationen mit yum und yumdb an – RedHat Linux

  2. So verwalten und listen Sie Dienste in Linux auf

  3. So installieren und testen Sie Ansible unter Linux

  4. So installieren und verwenden Sie Flatpak unter Linux

  5. So zeigen Sie System- und Hardwaredetails in Linux Mint 20 an

So benennen Sie Dateien und Verzeichnisse in Linux um

So komprimieren Sie Dateien und Verzeichnisse unter Linux

So führen Sie ein einfaches Screencasting unter Linux durch

So erfassen und streamen Sie Ihre Gaming-Session unter Linux

So installieren und verwenden Sie PuTTY unter Linux

So sperren Sie Tastatur und Maus, aber nicht den Bildschirm unter Linux