Sí, es posible. Puede usar el Quartz Event Services para simular eventos de entrada.
Suponiendo C, escribí esto rápido ejemplo:
#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;
}
Y suponiendo GCC, compilar con:
gcc -o program program.c -Wall -framework ApplicationServices
disfrutar de la magia.
Dependiendo de su caso de uso, hay una Instrumento llamado "Grabador UI" que registra todo lo que haces en la interfaz de usuario de tu programa y lo reproduce cuando lo desees. – zneak
Gracias, pero lo que realmente quiero hacer es enviar cualquier entrada de mouse arbitraria al sistema operativo. –
Lo hice antes al ejecutar un servidor vnc y escribir un pequeño cliente vnc para enviar eventos del mouse al servidor. Hay servidores vnc de código abierto que hacen eso, así que un último recurso sería leer la fuente de uno. –