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

时间:2010-12-11 01:12:24

标签: c# macos mono background system-tray

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

最终目标是:

  1. 按时间方式放入托盘图标,以进行大部分互动。
  2. 删除通常随启动的应用程序附带的停靠栏图标
  3. 让应用程序在启动时运行。
  4. 简而言之,只需考虑Dropbox应用的工作原理。我想要那种类型的GUI,但需要使用Mono / Mac应用程序。

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

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

2 个答案:

答案 0 :(得分:9)

我有你的答案:

首先,添加状态栏图标(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实例,作为通知图标的上下文菜单条的一种方式。

并在项目文件中使用 Icon Composer 制作 ICNS 文件并将其标记为内容。 (右键单击 - >构建操作 - >内容)

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

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

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

答案 1 :(得分:0)

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

这样的代码
static void Main()
{
    Application.Run(new MyContext());
}

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

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