在Mac上使用C# / Mono编写仅有系统托盘(无Dock图标)的应用程序

17

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

最终目标是:

  1. 在大多数互动中通过时钟放置托盘图标。
  2. 删除通常随启动应用程序而来的Dock图标
  3. 在启动时运行应用程序。

简而言之,想象一下Dropbox应用程序的工作方式。我想要那种类型的GUI,但是使用Mono / Mac应用程序。

我认为通常通过在应用程序包的Info.plist中设置LSUIElement = 1来实现这一点。但是,我没有成功。我认为这可能与mono命令从app包内部启动我的应用程序有关。一旦应用程序启动mono,我假设它不会级联到更深层次的应用程序启动。纯粹是猜测。

有人有任何想法吗?谢谢。


如果你提到你正在使用的工具包,你可能会更成功。 - Mikayla Hutchinson
我曾尝试使用GTK#,但我认为这是不可能的。 - jocull
1
你可能需要考虑使用MonoMac。相比使用GTK#,它提供了更多本地的Mac OS X钩子。 - Nate
如果我今天重新审视这个问题,我可能会将其拆分为两个不同的应用程序。1)一个用于状态栏的程序,2)一个用于与状态栏通信的程序(后台服务)。这可能会解决我8年前遇到的问题。 - jocull
2个回答

10

我有你要的答案:

首先,要添加状态栏图标(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文件放入项目文件中,并将其标记为内容。(右键单击->构建操作->内容)

现在是时候删除Dock图标了:

在你的info.plist文件上,新建一个Boolean类型项目,命名为"LSUIElement"并将值设置为YES

希望这有所帮助。 问候, Peyman Mortazavi


如果有人能够确认这一点,我会将其标记为最佳答案(我不再安装该工具)。 - jocull
1
我可以确认,在使用Xamarin Studio 5.8.2的Yosemite上它是可行的。 - Mads Y

0

我不知道我是否正确地理解了您的问题。如果您只需要一个没有任何主窗口概念但有系统托盘的应用程序,我曾经使用WinForms编写过以下代码实现:

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

MyContext 是一个从 ApplicationContext 派生的类,在其构造函数中使用 NotifyIcon 类创建了一个托盘图标。实际上,Application.Run() 启动了应用程序的消息循环,使托盘图标有机会响应用户的点击(托盘图标本身可以更早地创建)。它在 Windows 和 Ubuntu 上运行良好,但从未在 Mac 上测试过。

尽管如此,今天我会在 Linux 上使用 Gtk#,在 Mac 上使用 MonoMac。在第一种情况下,概念可能非常相似(您还可以查看 Tomboy 代码,它正是这样做的!)。至于第二种情况——不知道,从未使用过。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接