Мне нужно отправить события щелчка мышью в произвольный процесс (не обязательно передний), не выводя окно этого процесса на передний план.
Этот код работает для отправки щелчка мышью и позволяет оконному серверу отправлять его любому процессу, который он решает, имеет фокус:
#include <ApplicationServices/ApplicationServices.h>
int
main()
{
CGEventRef down, up;
down = CGEventCreateMouseEvent(
NULL,
kCGEventLeftMouseDown,
CGPointMake(16, 36),
kCGMouseButtonLeft
);
up = CGEventCreateMouseEvent(
NULL,
kCGEventLeftMouseUp,
CGPointMake(16, 36),
kCGMouseButtonLeft
);
CGEventPost(kCGHIDEventTap, down);
CGEventPost(kCGHIDEventTap, up);
CFRelease(down);
CFRelease(up);
return 0;
}
Я могу отправлять события щелчка мышью через CGEventPost (), но для этого требуется, чтобы целевой процесс имел фокус (чего я пытаюсь избежать).
Я могу отправлять события клавиатуры через CGEventPostToPSN () очень хорошо, и, насколько я могу судить, события перемещения мыши тоже работают, с чем у меня возникают проблемы, это события мыши вниз / вверх.
Этот код (в значительной степени описанный выше, единственное отличие состоит в том, что я сам указываю, в какой процесс отправлять события) не работает, и я даже не знаю, как узнать, где он выходит из строя.
#include <ApplicationServices/ApplicationServices.h>
#include <Carbon/Carbon.h> /* for ProcessSerialNumber stuff */
#include <stdio.h>
int
main()
{
ProcessSerialNumber psn;
CGEventRef down, up;
if (GetFrontProcess(&psn) != noErr) {
printf("Unable to get front process\n");
return 1;
}
down = CGEventCreateMouseEvent(
NULL,
kCGEventLeftMouseDown,
CGPointMake(16, 36),
kCGMouseButtonLeft
);
up = CGEventCreateMouseEvent(
NULL,
kCGEventLeftMouseUp,
CGPointMake(16, 36),
kCGMouseButtonLeft
);
CGEventPostToPSN(&psn, down);
CGEventPostToPSN(&psn, up);
CFRelease(down);
CFRelease(up);
return 0;
}
Я застрял на этом в течение нескольких дней, и я не могу понять это. Согласно документации (насколько я могу судить) это именно то, как это должно быть сделано.
Я тестировал этот код на Snow Leopard и Lion, с теми же результатами.
Может ли кто-нибудь, кто имел успех при нажатии с помощью CGEventPostToPSN (), пожалуйста, пролить некоторую информацию о том, как это сделать?