70 votes

Simulation d'entrée de souris par programme sous OS X

Est-il possible de simuler les actions d'une souris à partir d'un programme sous OS X? Spécifiquement, la version courte est que j'essaye de simuler un écran tactile en utilisant deux webcams. Donc, en supposant que je puisse obtenir les positions X, Y, puis-je envoyer des informations au système d'exploitation sous forme de mouvement de souris ou de clic?

Edit- Ou si cela est particulièrement facile dans un autre système d'exploitation, je serais prêt à en tenir compte.

98voto

jweyrich Points 10002

Oui c'est possible. Vous pouvez utiliser les services d'événements Quartz pour simuler des événements d'entrée.

En supposant que C, j'ai écrit cet exemple rapide:

 #include <ApplicationServices/ApplicationServices.h>
#include <unistd.h>

int main() {
    // Move to 200x200
    CGEventRef move1 = CGEventCreateMouseEvent(
        NULL, kCGEventMouseMoved,
        CGPointMake(200, 200),
        kCGMouseButtonLeft // ignored
    );
    // Move to 250x250
    CGEventRef move2 = CGEventCreateMouseEvent(
        NULL, kCGEventMouseMoved,
        CGPointMake(250, 250),
        kCGMouseButtonLeft // ignored
    );
    // Left button down at 250x250
    CGEventRef click1_down = CGEventCreateMouseEvent(
        NULL, kCGEventLeftMouseDown,
        CGPointMake(250, 250),
        kCGMouseButtonLeft
    );
    // Left button up at 250x250
    CGEventRef click1_up = CGEventCreateMouseEvent(
        NULL, kCGEventLeftMouseUp,
        CGPointMake(250, 250),
        kCGMouseButtonLeft
    );

    // Now, execute these events with an interval to make them noticeable
    CGEventPost(kCGHIDEventTap, move1);
    sleep(1);
    CGEventPost(kCGHIDEventTap, move2);
    sleep(1);
    CGEventPost(kCGHIDEventTap, click1_down);
    CGEventPost(kCGHIDEventTap, click1_up);

    // Release the events
    CFRelease(click1_up);
    CFRelease(click1_down);
    CFRelease(move2);
    CFRelease(move1);

    return 0;
}
 

Et en supposant que GCC, compile avec:

gcc -o program program.c -Wall -framework ApplicationServices

Profitez de la magie.

9voto

ghoti Points 14996

Si vous ne voulez pas compiler et que vous recherchez un outil basé sur un shell, Cliclick peut être la solution.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X