2012-07-23 15 views
12

Ich versuche, eine Anwendung zu erstellen, die nur ein Tray-Symbol hat und nicht in der Taskleiste angezeigt wird. (ähnlich wie Dropbox) Ich muss sowohl die Windows- als auch die Mac-Version der Anwendung erstellen, also habe ich versucht, mit MonoMac das Mac-Frontend zu erstellen.Wie mache ich in MonoMac eine C# -Applikation nur mit einem Tray-Icon (kein Dock-Icon)?

Was ist der beste Weg, um eine Tray-only-Anwendung in MonoMac zu erstellen?

Alle Ressourcen, die ich gefunden habe, sagen, eines von zwei Dingen zu tun:

  • hinzufügen <key>LSUIElement</key><string>1</string> zur Info.plist Datei.
  • Fügen Sie den folgenden Code in das FinishedLaunching Ereignis in der AppDelegate Klasse: NSApplication.SharedApplication.ActivationPolicy = NSApplicationActivationPolicy.Accessory;

ich alle Kombinationen dieser beiden versucht haben, aber es scheint, dass, sobald ich versuche, eine C# System.Timers.Timer, das Symbol zu instanziiert Erneut erscheint im Dock am unteren Bildschirmrand. Fehle ich etwas darüber, wie OSX Hintergrundanwendungen behandelt?

Was mache ich falsch? Gibt es eine bessere Möglichkeit, eine Hintergrundanwendung zu erstellen, die in OSX ein Symbol für das obere Fach, aber kein Symbol für das untere Dock enthält?

(Dies ist sehr ähnlich wie diese SO question, aber diese Frage war von ein paar Jahren und wurde nie vollständig beantwortet, so hoffe ich, könnte es da draußen eine vollständigere Antwort sein.)


Hier ist der Code, den ich bisher habe:

public partial class AppDelegate : NSApplicationDelegate 
{ 
    MyServiceObject currentServiceObject; 

    public AppDelegate() { } 

    public override void FinishedLaunching (NSObject notification) 
    { 
     // Construct menu that will be displayed when tray icon is clicked 
     var notifyMenu = new NSMenu(); 
     var exitMenuItem = new NSMenuItem("Quit My Application", 
      (a,b) => { System.Environment.Exit(0); }); // Just add 'Quit' command 
     notifyMenu.AddItem(exitMenuItem); 

     // Display tray icon in upper-right-hand corner of the screen 
     var 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; 

     // Remove the system tray icon from upper-right hand corner of the screen 
     // (works without adjusting the LSUIElement setting in Info.plist) 
     NSApplication.SharedApplication.ActivationPolicy = 
      NSApplicationActivationPolicy.Accessory; 

     // Start running the program -- If I comment out then no dock icon appears 
     currentServiceObject = new MyServiceObject(); 
    } 
} 
+0

Liebe die Antwort wissen dazu auch! – berg

Antwort

6

fand ich das Problem, und es war gar nicht zu den Anwendungseinstellungen verwendet. Offensichtlich gibt es einige Operationen, bei denen MacOS keine 'Agentenanwendungen' ausführen kann. Sobald eine dieser Methoden aufgerufen wird, muss die Anwendung im Dock erscheinen. Der Code, der meine Anwendung wurde Stolpern war ein Aufruf an:

System.Windows.Forms.Cursor.Position.ToString() 

diese Zeile entfernen und sie mit folgendem MonoMac Verfahren ersetzt erlaubt die Anwendung verborgen bleiben:

NSEvent.CurrentMouseLocation.ToString() 
2

ich in der Lage war, diese Funktion zu erhalten, indem der Wert der Einstellung „Application ist Agent (UIElement)“ Taste 1 in der Datei info.plist. Obwohl es ein BOOL-Wert sein sollte, macht MonoDevelop es zu einer Zeichenkette, aber die Einstellung auf 1 scheint zu funktionieren. Sie können auch eine leere Zeichenfolge für die "Symboldatei" festlegen, dies ist jedoch nicht notwendig.

info.plist

+0

Danke für den Tipp - ich habe das versucht, aber leider ohne Erfolg. – Matt

+0

können Sie mehr Code Ihrer Anwendung teilen? Wie sieht Ihre info.plist aus? Was macht MyServiceObject? – berg