Saltar al contenido

Cómo simular un movimiento de ratón

Esta crónica ha sido analizado por nuestros expertos así se asegura la exactitud de nuestro tutorial.

Solución:

Aquí hay un código Win32 modificado que tenía por ahí:

#define WIN32_LEAN_AND_MEAN
#define _WIN32_WINNT 0x0500

#include 
#include 
#include 
#include 
#include 
#include 


#define X 123
#define Y 123
#define SCREEN_WIDTH 1024
#define SCREEN_HEIGHT 800


void MouseSetup(INPUT *buffer)

    buffer->type = INPUT_MOUSE;
    buffer->mi.dx = (0 * (0xFFFF / SCREEN_WIDTH));
    buffer->mi.dy = (0 * (0xFFFF / SCREEN_HEIGHT));
    buffer->mi.mouseData = 0;
    buffer->mi.dwFlags = MOUSEEVENTF_ABSOLUTE;
    buffer->mi.time = 0;
    buffer->mi.dwExtraInfo = 0;



void MouseMoveAbsolute(INPUT *buffer, int x, int y)

    buffer->mi.dx = (x * (0xFFFF / SCREEN_WIDTH));
    buffer->mi.dy = (y * (0xFFFF / SCREEN_HEIGHT));
    buffer->mi.dwFlags = (MOUSEEVENTF_ABSOLUTE 


void MouseClick(INPUT *buffer)

    buffer->mi.dwFlags = (MOUSEEVENTF_ABSOLUTE 


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

    INPUT buffer[1];

    MouseSetup(&buffer);

    MouseMoveAbsolute(&buffer, X, Y);
    MouseClick(&buffer);

    return 0;

tendrás que llamar MouseSetup() a cadaINPUT tampón antes de usarlo.

Recursos

MSDN- SendInput()

MSDN- INPUT

MSDN- MOUSEINPUT

Aquí hay una solución usando Xlib para aquellos que usan Linux :

#include 
#include
#include
#include 
#include 
#include 
#include 
#include 

void mouseClick(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, "Errorn");

    XFlush(display);

    usleep(100000);

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

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

    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;

Simplemente constrúyalo y luego para simular un clic en x, y haga lo siguiente:

$ ./a.out x y

es decir

$g++ -lX11 sgmousesim2.cpp

$./a.out 123 13

Usar SendInput para generar la entrada que desea simular. De la documentación de MSDN:

Sintetiza las pulsaciones de teclas, los movimientos del mouse y los clics de los botones.

Sección de Reseñas y Valoraciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *