CGEventPostToPSN()不适用于鼠标单击

时间:2012-03-13 04:09:25

标签: objective-c macos cocoa quartz-graphics macos-carbon

我需要将鼠标点击事件发送到任意进程(不一定是前面的进程),而不将该进程的窗口放到前面。

此代码适用于发送鼠标单击并让窗口服务器将其发送到它决定具有焦点的任何进程:

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

我已经被困在这几天了,我似乎无法弄明白。根据{{​​3}},这是(据我所知)究竟应该如何完成。

我已经在Snow Leopard和Lion上测试了这个代码,结果相同。

通过CGEventPostToPSN()点击取得成功的人能否对正确的方法有所了解?

0 个答案:

没有答案