Подтвердить что ты не робот

Как сделать приложение С# для панели только для значков в MonoMac (без значка док-станции)?

Я пытаюсь создать приложение, которое будет иметь только значок в трее, и не появится на панели задач. (аналогично Dropbox) Мне нужно создать как Windows, так и Mac версию приложения, поэтому я попытался использовать MonoMac для создания интерфейса Mac.

Каков наилучший способ создания приложения только для лотков в MonoMac?

Все ресурсы, которые я нашел, говорят, чтобы сделать одну из двух вещей:

  • Добавить <key>LSUIElement</key><string>1</string> в файл Info.plist.
  • Добавьте следующий код в событие FinishedLaunching в классе AppDelegate: NSApplication.SharedApplication.ActivationPolicy = NSApplicationActivationPolicy.Accessory;

Я пробовал все комбинации этих двух, но кажется, что как только я попытаюсь создать экземпляр С# System.Timers.Timer, значок появится снова в док-станции в нижней части экрана. Я что-то пропустил о том, как OSX обрабатывает фоновые приложения?

Что я делаю неправильно? Есть ли лучший способ сделать фоновое приложение, имеющее значок верхнего лотка, но без значка нижней док-станции в OSX?

(Это очень похоже на этот вопрос SO > , но этот вопрос был от пары лет назад и никогда не был полностью отвечен, поэтому я надеюсь, что может быть более полный ответ там.)


Вот код, который у меня есть до сих пор:

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();
    }
}
4b9b3361

Ответ 1

Я нашел проблему, и она вообще не была связана с настройками приложения. Очевидно, что есть некоторые операции, которые MacOS не позволяет выполнять "приложения-агенты". Как только один из этих методов вызывается, приложение вынуждено появляться в доке. Код, который отключил мое приложение, был вызван:

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

Удаление этой строки и замена ее на следующий метод MonoMac позволили приложению оставаться скрытым:

NSEvent.CurrentMouseLocation.ToString()

Ответ 2

Мне удалось получить эту работу, установив значение "Application is agent (UIElement)" в 1 в файле info.plist. Несмотря на то, что это должно быть значение BOOL, MonoDevelop делает его строкой, но настройка на 1 кажется сработавшей. Вы также можете установить пустую строку для "файла значка", но это необязательно.

info.plist