2

アプリケーションのアクティブ化に失敗する明確な理由がない場合に[NSRunningApplication activateWithOptions:]戻るという問題があります。NO

これは-[NSRunningApplication activateWithOptions:] が機能しないのと同じではありません

その質問に対する受け入れられた答えはNSApplicationActivateIgnoringOtherApps代わりに使用することですNSApplicationActivateAllWindowsが、2 つのオプションはオプション値が示すように異なる方法でアプリケーションをアクティブ化することを目的としているため、受け入れられる答えではありません。

私のコード内には[NSRunningApplication activateWithOptions:]機能する場所がありますが、EventTap を介して呼び出すと、NONSApplicationActivateAllWindowsまたは引数NSApplicationActivateIgnoringOtherAppsとしての使用に関係なく、ほとんどの場合返されます。option「ほぼ」常に返さNOれると言う理由は、最初に呼び出されたときに機能するためです。2 回目以降の呼び出しはすべて失敗します。

基本的に、Dock のアプリケーション アイコンでシングルクリック イベントを処理しています。Dockで作成されたプロセスにインストールされた EventTap を使用していCGEventTapCreateForPSN()ます。イベント タップ コールバック内で、process identifierでクリックされたアイコンの を正常に特定しましたDock。プロセス ID は、Accessibility API.

次に、アプリケーションをアクティブ化する必要があるため、次のように呼び出します。

BOOL result = NO;
NSRunningApplication *currentApp = [NSRunningApplication runningApplicationWithProcessIdentifier:pid];

if (currentApp) {
        result = [currentApp activateWithOptions:NSApplicationActivateAllWindows];
}

上記の例では、currentAppが有効であること bundleIdentifier、 、 processIdentifierおよびオブジェクト内の他のいくつかのインスタンス変数RunningApplicationが正しいことを確認しました。

前述のように、NSApplicationActivationOptions使用に関係なく、アプリケーションは起動せず、メソッドは を返しますNO。繰り返しになりますが、最初のクリックでは機能する場合がありますが、アプリケーションのドック アイコンの後続のすべてのクリックでは失敗します。

このような単純な方法が失敗する理由を誰か説明できますか? おそらく、最初に呼び出されたときにのみ機能するのはなぜですか? EventTap から実行されていない場合に常に機能するのはなぜですか?

この問題を解決するために数時間を費やしましたが、常に機能する唯一SetFrontProcessWithOptions(&psn, 0);の方法は、の代わりに非推奨のメソッドを使用することです[NSRunningApplication activateWithOptions:NSApplicationActivateAllWindows]

への呼び出しをラップしようとしましたが、EventTap[NSRunningApplication activateWithOptions:]dispatch_asyncから操作キューを使用しようとしましたが、どちらも問題を解決しません。最後に、通知の送信と[NSRunningApplication activateWithOptions:]通知コールバック内からの呼び出しを試みましたが、これも失敗しました。これは私のイベントタップのコードです:

case kCGEventLeftMouseDown:
    if (cgClickCount == 1) {
        NSNumber *pidNumber = [NSNumber numberWithLong:actualPid];
        NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:pidNumber, @"pidNumber", nil];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"DockApplicationClickedNotification" object:self userInfo:userInfo];
        return NULL; /* swallows event */
    }
break;

どんな支援も大歓迎です!デバッグ画面のグラブが添付されており、ドック アイコンをクリックしてアプリをアクティブ化する最初の試行が成功し、その後のクリックでアプリのアクティブ化が失敗する方法を示しています。

ここに画像の説明を入力

更新と半分解決:[NSRunningApplication activateWithOptions:] 1 回目の試行で機能し、2 回目以降の試行で失敗 する理由を特定しました。Dock のアプリケーション アイコンを初めてクリックすると、そのアプリケーションがアクティブな app になります。その後アプリ アイコンをクリックすると、他のアプリケーションがアクティブになります。したがって、ここでの問題[NSRunningApplication activateWithOptions:]は、アプリケーションが最前面のプロセスである場合にのみ機能するようです。

[NSApp activateIgnoringOtherApps:YES];への呼び出しの前に追加する[NSRunningApplication activateWithOptions:]と、一貫して意図したとおりに機能しますが、アプリをアクティブ化してから別のアプリをアクティブ化するため、メニューバーがちらつきます。したがって、質問は次のようになります。

[NSRunningApplication activateWithOptions:]アプリケーションが最前面に表示されていない場合に作業を開始する方法はありますか? このように動作することにactivateWithOptions:なっていますか?

4

0 に答える 0