2012-07-23 18 views
12

Próbuję utworzyć aplikację, która będzie miała tylko ikonę w zasobniku i nie pojawi się na pasku zadań. (podobnie jak w Dropbox) Potrzebuję utworzyć zarówno wersję Windowsa jak i Maca aplikacji, więc spróbowałem użyć MonoMaca do stworzenia Macintosha.Jak utworzyć aplikację C# z ikoną zasobnika w MonoMac (bez ikony dokowania)?

Jaki jest najlepszy sposób utworzenia aplikacji obsługującej tylko taca w MonoMac?

Wszystkie zasoby znalazłem powiedzieć zrobić jedną z dwóch rzeczy:

  • Dodaj <key>LSUIElement</key><string>1</string> do pliku Info.plist.
  • Dodaj następujący kod do zdarzenia FinishedLaunching w klasie AppDelegate: NSApplication.SharedApplication.ActivationPolicy = NSApplicationActivationPolicy.Accessory;

Próbowałem wszystkich kombinacji tych dwóch, ale wydaje się, że tak szybko, jak próbuję instancji C# System.Timers.Timer, ikona ponownie pojawia się w doku na dole ekranu. Czy brakuje mi czegoś o tym, jak OSX obsługuje aplikacje działające w tle?

Co robię źle? Czy istnieje lepszy sposób tworzenia aplikacji w tle, która ma ikonę górnego zasobnika, ale nie ma ikony dolnej stacji dokującej w systemie OSX?

(To jest bardzo podobne do tego SO question, ale to pytanie było od kilku lat temu i nigdy nie został w pełni odpowiedział, więc mam nadzieję, że może być pełniejsza odpowiedź tam.)


Oto kod mam tak daleko:

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

miłość znać odpowiedź do tego również! – berg

Odpowiedz

6

znalazłem problem, i to nie było związane z ustawieniami aplikacji w ogóle. Jest oczywiste, że MacOS nie zezwala na wykonywanie "aplikacji agenta". Gdy tylko jedna z tych metod zostanie wywołana, aplikacja zostanie wyświetlona w stacji dokującej. Kod, który został potknięcia się mój wniosek był wezwaniem do:

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

Usunięcie tej linii, i zastąpienie go następującym sposobem Monoman uwzględnił wniosek pozostaje ukryty:

NSEvent.CurrentMouseLocation.ToString() 
2

udało mi się uzyskać tej pracy, ustawiając wartość „Aplikacja jest (UIElement) agent” kluczem do 1 w pliku Info.plist. Mimo że powinna to być wartość typu BOOL, MonoDevelop tworzy ciąg znaków, ale ustawienie go na 1 wydaje się działać. Możesz również ustawić pusty ciąg dla "pliku ikony", ale nie jest to konieczne.

info.plist

+0

Dzięki za cynk - próbowałem tego, ale niestety bezskutecznie. – Matt

+0

Czy możesz udostępnić więcej kodu swojej aplikacji? Jak wygląda twój plik info.plist? co robi usługa MyServiceObject? – berg