GNU/Linux >> Belajar Linux >  >> Linux

Linux, cara menangkap layar, dan mensimulasikan gerakan mouse

Saya tidak bisa mengklik dengan metode yang digunakan @aksiom, hanya gerakan penunjuk. Saya menggunakan ini sebagai gantinya:(Ubuntu 18.04).

Dikompilasi dengan: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;
}

Bangun dan kemudian untuk mensimulasikan klik di x ,y lakukan:

$ ./a.out x y

yaitu

$ g++ -lX11 sgmousesim2.cpp

$ ./a.out 123 13

Kalau-kalau Anda masih tertarik.


Swinput adalah solusi untuk mensimulasikan peristiwa mouse/key. Anda mungkin perlu mengkompilasinya untuk kernel Anda. Xorg menyediakan beberapa tajuk untuk merekam peristiwa mouse/tombol tetapi saya pikir itu rusak saat ini. Ada C kode evtest yang dapat digunakan untuk menangkap peristiwa dari /dev/input/eventX , /dev/input/mice file. Ini bisa membantu.

Edit:

Bug telah diperbaiki di ekstensi rekaman Xorg, jadi mungkin juga berfungsi.


Linux
  1. Cara menampilkan informasi paket tambahan menggunakan yum dan yumdb – RedHat Linux

  2. Cara Mengelola dan Mendaftar Layanan di Linux

  3. Cara Menginstal Dan Menggunakan Flatpak Di Linux

  1. Cara Menginstal dan Menguji Ansible di Linux

  2. Cara Menggunakan Perintah Layar Linux

  3. Cara Menampilkan Detail Sistem dan Perangkat Keras di Linux Mint 20

  1. Cara dual-boot Linux dan Windows

  2. Cara menginstal Elasticsearch dan Kibana di Linux

  3. Cara mempartisi dan memformat drive di Linux