仅在Mac上使用C#/ Mono的系统托盘(无停靠图标)应用程序

我希望将我的一个C#应用程序移到Mono上,以便在Mac上使用。 目前,我正在试图弄清楚如何使它成为一种“背景”过程,但仍然具有GUI元素的能力(我相信这排除了mono-service )。

最终目标是:

  1. 对于大多数交互,按时钟放置托盘图标。
  2. 删除通常随启动的应用程序一起提供的停靠栏图标
  3. 让应用程序在启动时运行。

简而言之,只需考虑Dropbox应用程序的工作原理。 我想要那种类型的GUI,但使用Mono / Mac应用程序。

我相信这通常是通过在应用程序包的Info.plist中设置LSUIElement = 1来实现的。 但是,我没有运气。 我认为这可能与mono命令在app bundle中启动我的应用程序有关。 一旦应用程序启动mono我假设它不会级联到进一步的应用程序启动。 不过,这是一个纯粹的猜测。

有没有人对此有任何想法? 谢谢。

我有你的答案:

首先,添加状态栏图标(Win Forms中的Notify Icon替代):

  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实例,作为通知图标的上下文菜单条的一种方式。

并将使用Icon Composer制作的ICNS文件放在项目文件中,并将其标记为内容。 (右击 – >构建动作 – >内容)

现在是时候删除停靠图标:

在您的info.plist文件中。 创建一个新的布尔类型项并将其命名为“ LSUIElement ”并将值设置为YES

希望能帮助到你。 此致,Peyman Mortazavi

我不知道我是否理解你的问题。 如果您只需要一个没有任何主窗口概念的应用程序,但是使用系统托盘,我曾经使用WinForms等代码执行此操作

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

其中MyContext是一个派生自ApplicationContext的类,它在构造函数中使用NotifyIcon类创建了一个托盘图标。 事实上, Application.Run()为您的应用程序启动消息循环,让托盘图标有机会回答用户点击(托盘图标本身可以在之前创建)。 它适用于Windows和Ubuntu,从未在Mac上进行过测试。

不过今天我会在Linux上使用Gtk#,在Mac上使用MonoMac。 在第一种情况下,概念可能非常相似(您也可以看到Tomboy代码,它就是这样!)。 在第二个 – 不知道,从未使用过它。