7

実行時にドック アイコンを表示または非表示にする機能をユーザーに提供するアプリを作成しています。KVOを使用して次のコードを起動する、ユーザーのデフォルト値を設定するチェックボックス付きの設定ウィンドウがあります。

if (!hideDockIcon) {
    TransformProcessType(&psn, kProcessTransformToForegroundApplication);
} else {
    TransformProcessType(&psn, kProcessTransformToUIElementApplication);
}

これは機能しますが、非表示にすると、環境設定ウィンドウが直接閉じられます (現在はバックグラウンド アプリであるため、これは理にかなっています)。しかし、MS の SkyDrive クライアントは、[設定] ウィンドウを開いたままにして、アイコンを非表示にしていることに気付きました。私はそれをどのように行うかを見つけることができませんでした。誰かアイデアがありますか?

[NSApp setActivationPolicy: NSApplicationActivationPolicyRegular]and NSApplicationActivationPolicyAccessory/も使用してみNSApplicationActivationPolicyProhibitedましたが、うまくいきません。Accessoryドックアイコンを非表示にせずProhibited、ウィンドウも閉じ、[NSApp activateIgnoringOtherApps:YES]無視されるようです。

4

2 に答える 2

5

ウィンドウが非表示になるのを防ぐために次のことが提案されているこのスレッドに出くわしました。

[window setCanHide:NO];

これは隠蔽をカバーするだけです。ウィンドウが閉じられた場合は、ウィンドウ デリゲートを使用してみてください。ウィンドウが閉じられないようにする呼び出しがあります

- (BOOL)windowShouldClose:(id)sender
于 2012-11-14T17:26:00.007 に答える
1

同じ実行ループターンでアプリをアクティブにしないことで、この問題を解決しました。

dispatch_async(dispatch_get_main_queue(), ^{
    [NSApp activateIgnoringOtherApps:YES];
});

迅速:

dispatch_async(dispatch_get_main_queue()) { 
    NSApp.activateIgnoringOtherApps(true)
}

私は、dispatch_async を呼び出して、数ナノ秒後の次の実行ループ ターンのいずれかで実行するブロックをスケジュールしています。これにより、プロセスは自分自身を非表示にする機会を得ることができます。

于 2016-08-07T15:18:26.543 に答える