NotifyIcon没有显示

我正在编写一个简单的应用程序,我想使用notifyIcon而不是表单来控制,我已经通过Google找到了示例,但我的notifyIcon将不会显示。 我究竟做错了什么?

static class MainEntryClass { /// /// The main entry point for the application. /// [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); C2F TestApp = new C2F(); Application.Run(); TestApp.Dispose(); } } class C2F { public C2F() { InitializeComponent(); loadSettings(); } private void InitializeComponent() { this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(C2F)); this.niC2F = new System.Windows.Forms.NotifyIcon(this.components); this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.separatorToolStripMenuItem = new System.Windows.Forms.ToolStripSeparator(); this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.contextMenuStrip1.SuspendLayout(); // // niC2F // this.niC2F.BalloonTipText = "MyApp"; this.niC2F.Icon = ((System.Drawing.Icon)(Clipboard2File.Properties.Resources.ResourceManager.GetObject("MyIcon.ico"))); this.niC2F.Text = "MyApp"; this.niC2F.ContextMenuStrip = this.contextMenuStrip1; this.niC2F.ShowBalloonTip(5); this.niC2F.Visible = true; this.niC2F.MouseClick += new System.Windows.Forms.MouseEventHandler(this.niC2F_MouseClick); // // contextMenuStrip1 // this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.settingsToolStripMenuItem, this.separatorToolStripMenuItem, this.exitToolStripMenuItem}); this.contextMenuStrip1.Name = "contextMenuStrip1"; this.contextMenuStrip1.Size = new System.Drawing.Size(153, 76); // // settingsToolStripMenuItem // this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem"; this.settingsToolStripMenuItem.Size = new System.Drawing.Size(152, 22); this.settingsToolStripMenuItem.Text = "Settings"; this.settingsToolStripMenuItem.Click += new System.EventHandler(this.settingsToolStripMenuItem_Click); // // separatorToolStripMenuItem // this.separatorToolStripMenuItem.Name = "separatorToolStripMenuItem"; this.separatorToolStripMenuItem.Size = new System.Drawing.Size(149, 6); this.separatorToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click); // // exitToolStripMenuItem1 // this.exitToolStripMenuItem.Name = "exitToolStripMenuItem1"; this.exitToolStripMenuItem.Size = new System.Drawing.Size(152, 22); this.exitToolStripMenuItem.Text = "Exit"; } private System.ComponentModel.IContainer components = null; private Form1 frmSettings = new Form1(); private Settings C2FSettings = new Settings(); private System.Windows.Forms.NotifyIcon niC2F; private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; private System.Windows.Forms.ToolStripMenuItem settingsToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator separatorToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; } 

我实际上刚刚完成了一个以NotifyIcon开头的项目。 你的代码(我猜你刚刚提供了一个片段)与我的代码非常相似。

我检查了你的代码,我必须做的唯一改变就是改变你调用图标的方式:

 this.niC2F.Icon = new System.Drawing.Icon(@"C:\PathToIcon\iconfile.ico"); 

下面是一个带有右键单击菜单和双击function的工作示例:

 using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace TestApp { static class MainEntryClass { /// /// The main entry point for the application. /// [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); C2F TestApp = new C2F(); Application.Run(); } } class C2F { System.ComponentModel.Container component; System.Drawing.Icon icon; ContextMenuStrip rightClickMenu = new ContextMenuStrip(); NotifyIcon trayIcon; ToolStripMenuItem options = new ToolStripMenuItem(); ToolStripMenuItem restore = new ToolStripMenuItem(); ToolStripMenuItem exit = new ToolStripMenuItem(); ToolStripSeparator seperator = new ToolStripSeparator(); public C2F() { InitializeComponent(); } private void InitializeComponent() { icon = new System.Drawing.Icon(@"C:\PathToIcon\iconfile.ico"); component = new System.ComponentModel.Container(); trayIcon = new NotifyIcon(component); trayIcon.Text = "Bill Reminder"; trayIcon.Icon = icon; trayIcon.Visible = true; trayIcon.DoubleClick += new EventHandler(trayIcon_DoubleClick); trayIcon.ContextMenuStrip = rightClickMenu; rightClickMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { options, seperator, restore, exit }); options.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); options.Text = "Options"; options.Click += new EventHandler(options_Click); restore.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); restore.Text = "Restore Window"; restore.Click += new EventHandler(restore_Click); exit.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); exit.Text = "Exit"; exit.Click += new EventHandler(exit_Click); } void exit_Click(object sender, EventArgs e) { Application.Exit(); } void restore_Click(object sender, EventArgs e) { FormName showWindow = new FormName(); showWindow.Show(); } void options_Click(object sender, EventArgs e) { Settings_Window settings = new Settings_Window(); settings.Show(); } void trayIcon_DoubleClick(object sender, EventArgs e) { FormName showWindow = new FormName(); showWindow.Show(); } } } 

希望这对您有所帮助,如果您有任何疑问请与我联系!

NotifyIcon未显示的另一个原因是,如果Windows资源管理器在托盘应用程序未运行时以提升的权限运行(当然仅在具有UAC的系统上)。

如果explorer.exe崩溃或被杀死,则会发生这种情况,然后用户从提升的任务管理器手动重新启动它。

NotifyIcon控件在内部使用Shell_NotifyIcon本机方法,但不检查返回值。 如果Shell_NotifyIcon返回FALSE,则不会通知您。

我不得不在Shell_NotifyIcon上使用WinDbg断点,GetLastError给了我ERROR_ACCESS_DENIED。 所以我意识到存在权限问题,可能是由重新启动的资源管理器提升引起的。 进一步测试证实了这一假设

然而,这是相当罕见的情况。