2010-12-11 4 views
14

Je cherche à déplacer une de mes applications C# sur Mono pour l'utiliser sur Mac. Actuellement, j'essaie de comprendre comment en faire une sorte de "fond" processus, mais j'ai toujours la possibilité d'avoir des éléments graphiques (je crois que cela exclut mono-service).Application System Tray uniquement (sans icône de dock) utilisant C#/Mono sur Mac

Le but ultime est la suivante:

  1. Mettez une icône de la barre par l'horloge pour la majorité des interactions.
  2. Supprimer l'icône du Dock qui accompagne généralement une application lancée
  3. Exécutez l'application au démarrage.

En bref, il suffit de penser à la façon dont fonctionne l'application Dropbox. Je veux ce type d'interface graphique, mais avec une application Mono/Mac.

Je crois que cela est généralement accompli en définissant LSUIElement = 1 dans Info.plist du groupe d'applications. Cependant, je n'ai pas eu de chance avec ça. Je pense que cela peut avoir quelque chose à voir avec la commande mono qui lance mon application depuis l'ensemble des applications. Une fois que l'application lance mono, je suppose qu'il ne cascade pas à d'autres lancements d'applications. C'est une pure conjecture, cependant.

Est-ce que quelqu'un a des idées à ce sujet? Merci.

+0

Vous pourriez avoir plus de succès si vous avez mentionné la boîte à outils que vous utilisez. –

+0

J'essayais d'utiliser GTK #. Je ne pense pas que ce soit possible cependant. – jocull

+1

Vous pouvez regarder MonoMac à la place. Vous aurez plus de hooks Mac OS X natifs que GTK #. – Nate

Répondre

9

-je avoir votre réponse:

Tout d'abord, pour ajouter une icône de la barre d'état (alternative Icône Notify dans 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 est votre instance de NSMenu comme moyen de bande de menu contextuel pour votre icône de notification.

et mettre vos ICNS fichier fait en utilisant icône Composer dans vos fichiers de projet et marquer comme contenu. (À droite droit-> construire action-> contenu)

Maintenant, il est temps d'enlever l'icône du dock:

sur votre fichier Info.plist.créez un nouvel élément booléen et nommez-le "LSUIElement" et définissez la valeur sur OUI.

Espérons que ça aide. Cordialement, Peyman Mortazavi

+0

Si quelqu'un peut confirmer cela, je vais le marquer comme la meilleure réponse (je n'ai plus les outils installés) – jocull

+0

Je peux confirmer que cela fonctionne sur Yosemite avec Xamarin Studio 5.8.2 –

0

Je ne sais pas si j'ai bien compris votre question. Si vous avez juste besoin d'une application sans aucune notion de fenêtre principale, mais avec plateau de système, je fait une fois avec WinForms en utilisant le code comme

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

MyContext est une classe dérivée de ApplicationContext qui dans son constructeur a créé une icône de la barre en utilisant la classe NotifyIcon. En fait Application.Run() démarre la boucle de message pour votre application en donnant à l'icône de la barre une chance de répondre aux clics de l'utilisateur (l'icône de la barre elle-même pourrait être créée plus tôt). Cela a fonctionné sur Windows et Ubuntu, jamais testé sur Mac. Néanmoins, aujourd'hui j'utiliserais Gtk # sur Linux et MonoMac sur Mac. Dans le premier cas, le concept est probablement très similaire (vous pouvez également voir le code de Tomboy, il fait exactement cela!). Dans la seconde - ne sais pas, jamais utilisé.

Questions connexes