AEInstallEventHandler处理程序在启动时未被调用

时间:2011-11-25 06:29:28

标签: macos macos-carbon appleevents

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

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

如果我的应用程序正在运行,那就可以了。但是,如果我的应用程序未运行,则单击浏览器中的URL将启动应用程序,但我的处理程序上未收到Apple Event。我对AEInstallEventHandler的调用是在我的应用程序的启动阶段,在它到达消息循环之前。这不是我做的第一件事,但离它不太远。 (显然我正确地设置了plist,因为我在跑步时得到了事件)

有关如何使其发挥作用的任何想法?

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

注意:我已经设置了Apple Event调试并再次运行它。在安装了回调处理程序之后,我肯定会在启动时发送一个GURL事件。但是我仍然无法解决为什么我的回调没有用该事件调用。

1 个答案:

答案 0 :(得分:0)

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

var gulp = require('gulp');
var imagemin = require('gulp-imagemin');
var imageminJpegRecompress = require('imagemin-jpeg-recompress');

gulp.task('optimize', function () {
  return gulp.src('src/images/*')
    .pipe(imagemin([
      imagemin.gifsicle(),
      imageminJpegRecompress({
        loops:4,
        min: 50,
        max: 95,
        quality:'high' 
      }),
      imagemin.optipng(),
      imagemin.svgo()
    ]))
});

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

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

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

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