Comment simuler un mouvement de souris

Comment puis-je simuler un événement de souris provoquant le déplacement du pointeur de 500 pixels vers la gauche, puis cliquer en utilisant C++. Comment pourrais-je faire quelque chose comme cela?

18
demandé sur Mateen Ulhaq 2011-09-21 02:23:40

6 réponses

voici du code Win32 modifié que j'avais autour de moi:

#define WIN32_LEAN_AND_MEAN
#define _WIN32_WINNT 0x0500

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <string.h>
#include <windows.h>


#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 | MOUSEEVENTF_MOVE);

    SendInput(1, buffer, sizeof(INPUT));
}


void MouseClick(INPUT *buffer)
{
    buffer->mi.dwFlags = (MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN);
    SendInput(1, buffer, sizeof(INPUT));

    Sleep(10);

    buffer->mi.dwFlags = (MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP);
    SendInput(1, buffer, sizeof(INPUT));
}


int main(int argc, char *argv[])
{
    INPUT buffer[1];

    MouseSetup(&buffer);

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

    return 0;
}

Vous aurez besoin d'appeler MouseSetup()INPUT tampon avant de l'utiliser.

Ressources

MSDN -SendInput()

MSDN -INPUT

MSDN -MOUSEINPUT

36
répondu Mateen Ulhaq 2011-09-21 23:40:33

Voici une solution en utilisant Xlib pour ceux qui utilisent Linux:

//sg

#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, "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, "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;
}

il suffit de le construire et ensuite de simuler un clic à x, y faire:

$ ./a.out x y

i.e.

$g++ -lX11 sgmousesim2.cpp

$./a.out 123 13
23
répondu axiom 2017-02-28 18:16:52

Utiliser SendInput pour générer l'entrée que vous voulez simuler. From MSDN documentation:

synthétise des touches, des mouvements de souris et des clics de bouton.

3
répondu tenfour 2011-09-20 23:00:32

C++ seul ne peut pas faire cela. Il n'a pas le concept d'une "souris", encore moins d'un "clic".

Vous besoin d'une sorte de bibliothèque qui parle à votre système de fenêtrage. Par exemple, QT. Ensuite, il s'agit de chercher dans L'API et de faire les bons appels C++.

1
répondu nsanders 2011-09-20 22:26:06

Je n'ai jamais fait cela en utilisant C++. Néanmoins, il existe une classe Java appelée Robot qui est capable de produire des événements de souris. Je l'ai utilisé sur la version 1.4 de Java, mais ça marche toujours. J'ai essayé l'exemple de ce Simuler un physique de déplacement de la souris dans Mac OS X. Il fonctionne en douceur avec Oracle Java 1.6.0_26 sur MacOSX Lion. L'avantage de Java est qu'il est indépendant de la plate-forme.

import java.awt.AWTException;
import java.awt.Robot;

public final class MovingMouseDemo
{
   public static void main(String[] args) throws AWTException
   {
     Robot robot = new Robot();
     robot.setAutoDelay(5);
     robot.setAutoWaitForIdle(true);

     //put mouse in the top left of the screen
     robot.mouseMove(0, 0);
     //wait so that you can see the result
     robot.delay(1000);
     //put the mouse 200 pixels away from the top
     //10 pixels away from the left 
     robot.mouseMove(200, 10);
     robot.delay(1000);
     robot.mouseMove(40, 130);
  }
}

Vous pouvez toujours utiliser JNI pour le lier avec C++.

j'espère que c' aide

1
répondu Chubs 2017-05-23 12:09:48

mouse_event fonction.

0
répondu George Gaál 2011-09-21 23:18:38