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 に答える