2009-05-09 10 views
2

J'écris une application simple que je voudrais contrôler avec un notifyIcon plutôt qu'un formulaire, j'ai suivi des exemples que j'ai trouvés par l'intermédiaire de Google, mais mon notifyIcon ne montrera pas. Qu'est-ce que je fais mal?NotifyIcon ne montrant pas


    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; 
    } 
+0

À l'avenir, ajoutez autant de balises pertinentes à vos questions que vous le pouvez (je crois que la limite est de cinq?) Elle aide les gens à trouver vos questions plus facilement. –

Répondre

8

Je viens de terminer un projet qui a commencé comme NotifyIcon. Votre code (je suppose que vous venez de fournir un extrait) est incroyablement similaire au mien.

J'ai vérifié votre code, et le seul changement que je devais faire pour l'obtenir au travail changeait la façon dont vous avez appelé l'icône pour:

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

est Ci-dessous un échantillon de travail avec un menu clic droit et double-cliquez sur la fonctionnalité:

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

} 

J'espère que cela vous aide, faites-moi savoir si vous avez des questions!

+0

Merci cela a bien fonctionné. Est-il possible d'ajouter le fichier d'icône à l'application, je n'ai donc pas besoin de connaître son emplacement? – Tester101

+0

Qu'est-ce que FormName? – user1709408

5

Une autre raison pour laquelle NotifyIcon ne s'affiche pas est que l'Explorateur Windows s'exécute avec des privilèges élevés alors que votre application de plateau ne l'est pas (uniquement sur les systèmes avec UAC bien sûr). Cela peut arriver si explorer.exe a planté ou a été tué, puis l'utilisateur l'a redémarré manuellement à partir du Gestionnaire des tâches élevé.

Le contrôle NotifyIcon utilise la méthode native Shell_NotifyIcon à l'intérieur, mais ne vérifie pas la valeur de retour. Si Shell_NotifyIcon renvoie FALSE, vous ne serez jamais averti.

J'ai dû créer un point d'arrêt avec WinDbg sur Shell_NotifyIcon et GetLastError m'a donné ERROR_ACCESS_DENIED. Je me suis donc rendu compte qu'il y avait un problème d'autorisation, et il pouvait être causé par l'élévation de l'explorateur redémarré. D'autres tests ont confirmé cette hypothèse.

Cependant, ceci est plutôt rare.