web-dev-qa-db-ja.com

Dockアイコンを非表示にする方法

Dockアイコンを非表示にし、NSStatusItemを表示するように設定します。 StatusItemは作成できますが、Dockからアイコンを削除する方法がわかりません。 :-/

何か案は?

60
papr

Info.plistでLSUIElementを探していると思います

LSUIElement(文字列)。このキーが「1」に設定されている場合、Launch Servicesはアプリケーションをエージェントアプリケーションとして実行します。エージェントアプリケーションは、Dockまたは強制終了ウィンドウに表示されません。通常はバックグラウンドアプリケーションとして実行されますが、必要に応じてフォアグラウンドに移動してユーザーインターフェイスを表示できます。

短い議論を参照してください こちら オン/オフの切り替えについて

73
epatel

アクティベーションポリシーと呼ばれるものを使用できます。

Objective-C

// 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];

スイフト4

// 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)

これにより、ドックアイコンが非表示になります。

こちらもご覧ください

50
Albert

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)を使用します。

48
valexa

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);
} 
26
Tibidabo

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
}
9
Huy Nguyen

ユーザー設定にする場合は、UIElementを使用できません。 UIElementはアプリケーションバンドルに存在します。これは、バンドルの署名を無効にするため、アプリバンドルのファイルを編集しないでください。

私が見つけた最良の解決策は、 この優れた記事 に基づいています。私の解決策はダンのコメントに基づいています。要するに、Cocoaでこれを行う方法はありませんが、ほんの少しのCarbonコードで可能です。

この記事では、ドックアイコンのみを処理するヘルパーアプリを作成することも提案しています。メインのアプリが起動し、ユーザーの好みに応じてこのアプリを終了します。このアプローチは、Carbonコードを使用するよりも堅牢であると思いますが、私はまだ試していません。

2
Benedict Cohen