1

我在我的应用程序中为 URL 安装了 Apple 事件处理程序:

OSStatus e = AEInstallEventHandler( kInternetEventClass,
                            kAEGetURL,
                            NewAEEventHandlerUPP(AppleEventProc),
                            (SRefCon)this,
                            false);

如果我的应用程序正在运行,这将有效。但是,如果我的应用程序未运行,则在浏览器中单击 URL 会启动应用程序,但我的处理程序没有收到 Apple 事件。我对 AEInstallEventHandler 的调用是在我的应用程序的启动阶段,在它到达消息循环之前。这不是我做的第一件事,但也不算太远。(显然我已经正确设置了 plist,因为我在运行时收到了事件)

关于如何使它工作的任何想法?

有趣的是,当 Chrome 开始处理 mailto URL 时,它会在命令行上传递“-psn_0_5100765”。这对我没有任何意义,有人知道它想告诉我什么吗?

注意:我已经设置了 Apple Event 调试并再次运行它。安装回调处理程序后,我肯定会在启动时收到 GURL 事件。但是我仍然无法弄清楚为什么我的回调没有被那个事件调用。

4

1 回答 1

0

所以我有一些使用 ReceiveNextEvent 的代码:

    while
    (
        ReceiveNextEvent
        (
            0,
            NULL,
            0.001, // kEventDurationForever,
            kEventRemoveFromQueue,
            &theEvent
        )
        ==
        noErr
    )
    {
        SendEventToEventTarget(theEvent, theTarget);
        ReleaseEvent(theEvent);
    }   

这在应用程序启动期间被多次调用。正在发生的事情是这些事件的处理没有考虑到需要为 kEventAppleEvent 事件调用 AEProcessEvent。这是在 RunApplicationEventLoop 内自动完成的,但如果您使用 ReceiveNextEvent 循环,则必须手动完成。所以我把它添加到我的循环中,如下所示:

    while
    (
        ReceiveNextEvent
        (
            0,
            NULL,
            0.001, // kEventDurationForever,
            kEventRemoveFromQueue,
            &theEvent
        )
        ==
        noErr
    )
    {
        if (GetEventKind(theEvent) == kEventAppleEvent)
            AEProcessEvent(theEvent);

        SendEventToEventTarget(theEvent, theTarget);
        ReleaseEvent(theEvent);
    }   

现在它可以在启动和运行时工作。

Uli Kusterer负责为我指明正确的方向。非常感谢他。

于 2016-07-08T02:25:18.280 回答