【问题标题】:AEInstallEventHandler handler not being called on startup启动时未调用 AEInstallEventHandler 处理程序
【发布时间】:2011-11-25 06:29:28
【问题描述】:

我在我的应用中为 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 事件。但是我仍然无法弄清楚为什么我的回调没有被那个事件调用。

【问题讨论】:

  • 您正在编写新的 Carbon 应用程序吗?为什么??!?无论如何...有什么方法可以将您的 AEInstallEventHandler 放入应用程序启动时调用的函数中? (想法是处理程序在处理 Carbon 事件之前就位,Apple 事件在没有处理程序的情况下弹出)
  • 处理程序是在创建我的第一个对象期间安装的,并且肯定是在消息循环之前安装的。我正在开发一个没有时间移植到可可的现有应用程序。
  • -psn_0_5100765 看起来像 ProcessSerialNumber,这是一个较旧的(前碳时代)Mac 等效于进程 ID(有警告。)我怀疑 0 是高 long PSN的,5100765是低long。大概是调用 Chrome 选项卡的 PSN。
  • 看起来就是这样,虽然它存在于 Mozilla 源代码中,而不是 Chromium 源代码中。

标签: macos macos-carbon appleevents


【解决方案1】:

所以我有一些使用 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 负责为我指明正确的方向。非常感谢他。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多