我正在尝试创建一个只有托盘图标的应用程序,而不会出现在任务栏中。 (类似于Dropbox)我需要创建应用程序的Windows和Mac版本,所以我尝试使用MonoMac来创建Mac前端。
在MonoMac中创建仅托盘应用程序的最佳方法是什么?
我找到的所有资源都说要做两件事之一:
<key>LSUIElement</key><string>1</string>
添加到Info.plist
文件。FinishedLaunching
课程中的AppDelegate
事件:NSApplication.SharedApplication.ActivationPolicy = NSApplicationActivationPolicy.Accessory;
我已尝试过这两种方法的所有组合,但似乎只要我尝试实例化C#System.Timers.Timer
,图标就会重新出现在屏幕底部的停靠栏中 。我错过了OSX处理后台应用程序的方法吗?
我做错了什么?是否有更好的方法来制作具有上部托盘图标但在OSX中没有底部停靠图标的后台应用程序?
(这与此SO question非常相似,但这个问题来自几年前,并且从未得到完全回答,所以我希望那里可能有更完整的答案。)
这是我到目前为止的代码:
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 :(得分:7)
我发现了问题,而且根本与应用程序设置无关。显然,有一些操作MacOS不允许“代理应用程序”执行。只要调用其中一个方法,就会强制应用程序出现在停靠栏中。绊倒我的应用程序的代码是调用:
System.Windows.Forms.Cursor.Position.ToString()
删除该行,并使用以下MonoMac方法替换它,使应用程序保持隐藏状态:
NSEvent.CurrentMouseLocation.ToString()
答案 1 :(得分:3)
我能够通过在info.plist文件中将“Application is agent(UIElement)”键的值设置为1来实现此功能。尽管它应该是BOOL值,MonoDevelop使它成为一个字符串,但将其设置为1似乎可行。您也可以为“图标文件”设置一个空字符串,但这不是必需的。