Только системный лоток (без значка док-станции) с использованием С#/Mono на Mac
Я хочу перенести одно из своих приложений на С# на Mono для использования на Mac. В настоящее время я пытаюсь понять, как сделать его своего рода "фоновым" процессом, но все же иметь возможность иметь элементы GUI (я считаю, что это исключает mono-service
).
Конечная цель такова:
- Поместите иконку в лоток часами для большинства взаимодействий.
- Удалите значок док-станции, который обычно поставляется с запущенным приложением
- Попросите приложение запустить при запуске.
Короче говоря, просто подумайте о том, как работает приложение Dropbox. Я хочу этот тип графического интерфейса, но с приложением Mono/Mac.
Я считаю, что это обычно достигается установкой LSUIElement = 1
в наборе приложений Info.plist. Однако мне не повезло. Я думаю, что это может иметь какое-то отношение к команде mono
, запускающей мое приложение из набора приложений. Когда приложение запускает mono
, я предполагаю, что он не каскадирует для дальнейшего запуска приложений. Однако это чистое предположение.
Есть ли у кого-нибудь идеи по этому поводу? Спасибо.
Ответы
Ответ 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, она делает именно это!). Во втором - не знаю, никогда не использовал его.