System Tray only (no dock icon) application using

2019-01-14 16:47发布

问题:

I'm looking to move one of my C# applications over to Mono for use on the Mac. Currently, I'm trying to figure out how to make it a sort of "background" process, but still have the ability to have GUI elements (I believe this rules out mono-service).

The ultimate goal is this:

  1. Put a tray icon up by the clock for the majority of interactions.
  2. Remove the dock icon that typically comes with a launched application
  3. Have the application run on startup.

In short, just think of how the Dropbox app works. I want that type of GUI, but with a Mono / Mac app.

I believe this is typically accomplished by setting LSUIElement = 1 in the application bundle's Info.plist. However, I've had no luck with it. I think it may have something to do with the mono command launching my application from within the app bundle. Once the app launches mono I'm assuming it doesn't cascade to further application launches. That is a pure guess, though.

Does anyone have any ideas on this? Thanks.

回答1:

I have your answer:

First, to add a Status bar icon (alternative of Notify Icon in 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 is your instance of NSMenu as a means of context menu strip for your notify icon.

and put your ICNS file made using Icon Composer in your project files and flag it as Content. (right click->build action->content)

Now It is time to remove dock icon:

on your info.plist file. make a new Boolean type item and name it "LSUIElement" and set the value to YES.

Hope it helps. Regards, Peyman Mortazavi



回答2:

I do not know whether I understand your question properly. If you just need an application without any notion of main window, but with system tray, I once did it with WinForms using code like

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

Where MyContext was a class derived from ApplicationContext which in its constructor created a tray icon using NotifyIcon class. In fact Application.Run() starts message loop for your application giving tray icon a chance to answer user clicks (tray icon itself could be created earlier). It worked on Windows and Ubuntu, never tested on Mac.

Nevertheless today I would use Gtk# on Linux and MonoMac on Mac. In the first case concept is probably very similar (you can also see Tomboy code, it does exactly that!). In the second - don't know, never used it.