13

トレイ アイコンのみを持ち、タスクバーには表示されないアプリケーションを作成しようとしています。(Dropbox と同様) Windows 版と Mac 版の両方のアプリケーションを作成する必要があるため、MonoMac を使用して Mac フロントエンドを作成してみました。

MonoMac でトレイのみのアプリケーションを作成する最良の方法は何ですか?

私が見つけたすべてのリソースは、次の2つのいずれかを行うと言っています。

  • ファイルに追加<key>LSUIElement</key><string>1</string>Info.plistます。
  • クラスのFinishedLaunchingイベントに次のコードを追加します。AppDelegateNSApplication.SharedApplication.ActivationPolicy = NSApplicationActivationPolicy.Accessory;

これら 2 つのすべての組み合わせを試しましたが、 C# をインスタンス化しようとするとすぐにSystem.Timers.Timer、アイコンが画面下部のドックに再表示されるようです。OSX がバックグラウンド アプリケーションを処理する方法について何か不足していますか?

私は何を間違っていますか?OSX で上部のトレイ アイコンがあり、下部のドック アイコンがないバックグラウンド アプリケーションを作成するより良い方法はありますか?

(これはこのSO questionと非常によく似ていますが、その質問は数年前のものであり、完全には回答されていないため、より完全な回答があることを願っています。)


これまでのコードは次のとおりです。

public partial class AppDelegate : NSApplicationDelegate
{
    MyServiceObject currentServiceObject;

    public AppDelegate () { }

    public override void FinishedLaunching (NSObject notification)
    {
        // Construct menu that will be displayed when tray icon is clicked
        var notifyMenu = new NSMenu();
        var exitMenuItem = new NSMenuItem("Quit My Application", 
            (a,b) => { System.Environment.Exit(0); }); // Just add 'Quit' command
        notifyMenu.AddItem(exitMenuItem);

        // Display tray icon in upper-right-hand corner of the screen
        var sItem = NSStatusBar.SystemStatusBar.CreateStatusItem(30);
        sItem.Menu = notifyMenu;
        sItem.Image = NSImage.FromStream(System.IO.File.OpenRead(
            NSBundle.MainBundle.ResourcePath + @"/notify-icon.icns"));
        sItem.HighlightMode = true;

        // Remove the system tray icon from upper-right hand corner of the screen
        // (works without adjusting the LSUIElement setting in Info.plist)
        NSApplication.SharedApplication.ActivationPolicy = 
            NSApplicationActivationPolicy.Accessory;

        // Start running the program -- If I comment out then no dock icon appears
        currentServiceObject = new MyServiceObject();
    }
}
4

2 に答える 2

7

問題が見つかりましたが、アプリケーションの設定とはまったく関係ありませんでした。明らかに、MacOS が「エージェント アプリケーション」の実行を許可していない操作がいくつかあります。これらのメソッドのいずれかが呼び出されるとすぐに、アプリケーションは強制的にドックに表示されます。私のアプリケーションをつまずかせていたコードは、次の呼び出しでした。

System.Windows.Forms.Cursor.Position.ToString()

その行を削除し、次の MonoMac メソッドに置き換えると、アプリケーションを非表示のままにすることができました。

NSEvent.CurrentMouseLocation.ToString()
于 2012-08-03T23:21:54.863 に答える
3

info.plistファイルで「Applicationisagent(UIElement)」キーの値を1に設定することで、これを機能させることができました。BOOL値である必要がありますが、MonoDevelopはそれを文字列にしますが、1に設定すると機能するようです。「アイコンファイル」に空の文字列を設定することもできますが、必須ではありません。

info.plist

于 2012-07-29T06:37:35.400 に答える