Dockアイコンを非表示にし、NSStatusItem
を表示するように設定します。 StatusItemは作成できますが、Dockからアイコンを削除する方法がわかりません。 :-/
何か案は?
Info.plistでLSUIElement
を探していると思います
LSUIElement(文字列)。このキーが「1」に設定されている場合、Launch Servicesはアプリケーションをエージェントアプリケーションとして実行します。エージェントアプリケーションは、Dockまたは強制終了ウィンドウに表示されません。通常はバックグラウンドアプリケーションとして実行されますが、必要に応じてフォアグラウンドに移動してユーザーインターフェイスを表示できます。
短い議論を参照してください こちら オン/オフの切り替えについて
アクティベーションポリシーと呼ばれるものを使用できます。
// The application is an ordinary app that appears in the Dock and may
// have a user interface.
[NSApp setActivationPolicy: NSApplicationActivationPolicyRegular];
// The application does not appear in the Dock and does not have a menu
// bar, but it may be activated programmatically or by clicking on one
// of its windows.
[NSApp setActivationPolicy: NSApplicationActivationPolicyAccessory];
// The application does not appear in the Dock and may not create
// windows or be activated.
[NSApp setActivationPolicy: NSApplicationActivationPolicyProhibited];
// The application is an ordinary app that appears in the Dock and may
// have a user interface.
NSApp.setActivationPolicy(.regular)
// The application does not appear in the Dock and does not have a menu
// bar, but it may be activated programmatically or by clicking on one
// of its windows.
NSApp.setActivationPolicy(.accessory)
// The application does not appear in the Dock and may not create
// windows or be activated.
NSApp.setActivationPolicy(.prohibited)
これにより、ドックアイコンが非表示になります。
Appleアプリケーションバンドルを変更しないというガイドラインに準拠し、Mac App Storeアプリ/(Lionアプリ?)がinfo.plistの変更によって署名が壊れないことを保証するにはデフォルトでLSUIElementを1に設定してから、アプリケーションの起動時にdoを実行します。
_ProcessSerialNumber psn = { 0, kCurrentProcess };
TransformProcessType(&psn, kProcessTransformToForegroundApplication);
_
ドックアイコンを表示するか、ユーザーがアイコンを望まない場合はこれをバイパスします。
副作用が1つしかありません。アプリケーションのメニューは、フォーカスを失い、取り戻すまで表示されません。
ソース: チェックボックスのDockアイコンのオンとオフの切り替え
個人的には、Info.plistオプションを設定せず、ユーザー設定に基づいてTransformProcessType(&psn, kProcessTransformToForegroundApplication)
またはTransformProcessType(&psn, kProcessTransformToUIElementApplication)
を使用します。
Xcode 4では、「アプリケーションはエージェント(UIElement)」として表示され、ブール値です。
Info.plistでコントロールを押しながら空のスペースをクリックし、メニューから[行の追加]を選択します。「アプリケーションはエージェント(UIElement)です」と入力します。
オプションにするために、次の行をコードに追加しました(Valexaに感謝します!)
// hide/display dock icon
if (![[NSUserDefaults standardUserDefaults] boolForKey:@"hideDockIcon"]) {
//hide icon on Dock
ProcessSerialNumber psn = { 0, kCurrentProcess };
TransformProcessType(&psn, kProcessTransformToForegroundApplication);
}
Swiftの更新:(上記の両方の方法を使用しましたが、結果は同じです)
public class func toggleDockIcon_Way1(showIcon state: Bool) -> Bool {
// Get transform state.
var transformState: ProcessApplicationTransformState
if state {
transformState = ProcessApplicationTransformState(kProcessTransformToForegroundApplication)
}
else {
transformState = ProcessApplicationTransformState(kProcessTransformToUIElementApplication)
}
// Show / hide dock icon.
var psn = ProcessSerialNumber(highLongOfPSN: 0, lowLongOfPSN: UInt32(kCurrentProcess))
let transformStatus: OSStatus = TransformProcessType(&psn, transformState)
return transformStatus == 0
}
public class func toggleDockIcon_Way2(showIcon state: Bool) -> Bool {
var result: Bool
if state {
result = NSApp.setActivationPolicy(NSApplicationActivationPolicy.Regular)
}
else {
result = NSApp.setActivationPolicy(NSApplicationActivationPolicy.Accessory)
}
return result
}
ユーザー設定にする場合は、UIElementを使用できません。 UIElementはアプリケーションバンドルに存在します。これは、バンドルの署名を無効にするため、アプリバンドルのファイルを編集しないでください。
私が見つけた最良の解決策は、 この優れた記事 に基づいています。私の解決策はダンのコメントに基づいています。要するに、Cocoaでこれを行う方法はありませんが、ほんの少しのCarbonコードで可能です。
この記事では、ドックアイコンのみを処理するヘルパーアプリを作成することも提案しています。メインのアプリが起動し、ユーザーの好みに応じてこのアプリを終了します。このアプローチは、Carbonコードを使用するよりも堅牢であると思いますが、私はまだ試していません。