CGEventPostToPSN () не работает для щелчка мыши - PullRequest
3 голосов
/ 13 марта 2012

Мне нужно отправить события щелчка мышью в произвольный процесс (не обязательно передний), не выводя окно этого процесса на передний план.

Этот код работает для отправки щелчка мышью и позволяет оконному серверу отправлять его любому процессу, который он решает, имеет фокус:

#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 (), пожалуйста, пролить некоторую информацию о том, как это сделать?

...