【问题标题】:System Tray only (no dock icon) application using C# / Mono on Mac仅系统托盘(无停靠图标)应用程序在 Mac 上使用 C#/Mono
【发布时间】:2011-05-23 19:30:16
【问题描述】:

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

最终目标是这样的:

  1. 为大多数交互设置一个托盘图标。
  2. 删除启动应用程序通常附带的停靠图标
  3. 让应用程序在启动时运行。

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

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

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

【问题讨论】:

  • 如果您提到您正在使用的工具包,您可能会取得更大的成功。
  • 我尝试使用 GTK#。不过我认为这是不可能的。
  • 您可能想改用 MonoMac。与使用 GTK# 相比,您将拥有更多可用的原生 Mac OS X 挂钩。
  • 如果我今天重新审视这个问题,我可能会把它分成两个不同的应用程序。 1)状态栏的程序和2)与状态栏(后台服务)通信的程序。这可能会解决我近 8 年前遇到的问题。

标签: c# macos mono background system-tray


【解决方案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 实例,作为通知图标的上下文菜单条。

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

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

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

希望对您有所帮助。 问候, 佩曼·莫尔塔扎维

【讨论】:

  • 如果有人可以确认这一点,我会将其标记为最佳答案(我不再安装工具)
  • 我可以确认它在 Yosemite 上与 Xamarin Studio 5.8.2 一起工作
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多