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

Только системный лоток (без значка док-станции) с использованием С#/Mono на Mac

Я хочу перенести одно из своих приложений на С# на Mono для использования на Mac. В настоящее время я пытаюсь понять, как сделать его своего рода "фоновым" процессом, но все же иметь возможность иметь элементы GUI (я считаю, что это исключает mono-service).

Конечная цель такова:

  • Поместите иконку в лоток часами для большинства взаимодействий.
  • Удалите значок док-станции, который обычно поставляется с запущенным приложением
  • Попросите приложение запустить при запуске.

Короче говоря, просто подумайте о том, как работает приложение Dropbox. Я хочу этот тип графического интерфейса, но с приложением Mono/Mac.

Я считаю, что это обычно достигается установкой LSUIElement = 1 в наборе приложений Info.plist. Однако мне не повезло. Я думаю, что это может иметь какое-то отношение к команде mono, запускающей мое приложение из набора приложений. Когда приложение запускает mono, я предполагаю, что он не каскадирует для дальнейшего запуска приложений. Однако это чистое предположение.

Есть ли у кого-нибудь идеи по этому поводу? Спасибо.

4b9b3361

Ответ 1

У меня есть ваш ответ:

Во-первых, чтобы добавить значок строки состояния (альтернатива значка уведомления в Win Forms):

        NSStatusItem 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;

notifyMenu - ваш экземпляр NSMenu в качестве средства контекстного меню для вашего значка уведомлений.

и поместите ваш файл ICNS с помощью Icon Composer в файлы проекта и отметьте его как Content. (щелкните правой кнопкой мыши- > создать action- > содержимое)

Теперь пришло время удалить значок док-станции:

в файле info.plist. создайте новый элемент типа Boolean и назовите его " LSUIElement" и установите значение YES.

Надеюсь, это поможет. С Уважением, Пейман Мортазави

Ответ 2

Я не знаю, правильно ли я понимаю ваш вопрос. Если вам просто нужно приложение без какого-либо понятия основного окна, но с системным лотком, я однажды сделал это с помощью WinForms, используя код типа

static void Main()
{
    Application.Run(new MyContext());
}

Где MyContext был класс, полученный из ApplicationContext, который в своем конструкторе создал значок в трее, используя класс NotifyIcon. Фактически Application.Run() запускает цикл сообщений для вашего приложения, предоставляя значок в виде значка для ответа на пользовательские клики (сам значок корзины может быть создан ранее). Он работал на Windows и Ubuntu, никогда не тестировался на Mac.

Тем не менее сегодня я бы использовал Gtk # в Linux и MonoMac на Mac. В первом случае концепция, вероятно, очень похожа (вы также можете увидеть код Tomboy, она делает именно это!). Во втором - не знаю, никогда не использовал его.