NotifyIcon没有显示

时间:2009-05-09 01:57:42

标签: c# winforms 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;
     }

2 个答案:

答案 0 :(得分:8)

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

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

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

以下是一个带有右键菜单和双击功能的工作示例:

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();
        }
    }

}

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

答案 1 :(得分:5)

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

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

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

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

然而,这种情况相当罕见。