2009-05-09 22 views
2

私は、フォームではなくnotifyIconで制御したい簡単なアプリケーションを書いていますが、私はGoogleで見つかった例がありますが、notifyIconは表示されません。私は間違って何をしていますか?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; 
    } 
+0

今後、できるだけ多くの関連タグを質問に追加してください(私の限界は5つだと思います)。 –

答えて

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

} 

ご質問がありましたらお知らせください。

+0

ありがとうございました。アイコンファイルをアプリケーションに追加する方法はありますか?それで、その場所を知る必要はありませんか? – Tester101

+0

FormNameとは何ですか? – user1709408

5

NotifyIconが表示されないもう1つの理由は、トレイアプリケーションが(もちろんUACを搭載したシステムでのみ)Windowsエクスプローラが昇格特権で実行されている場合です。

これは、explorer.exeがクラッシュまたは強制終了され、昇格したタスクマネージャから手動で再起動した場合に発生します。

NotifyIconコントロールは、内部でShell_NotifyIconネイティブメソッドを使用しますが、戻り値はチェックしません。 Shell_NotifyIconがFALSEを返すと、通知されることはありません。

Shell_NotifyIconでWinDbgとブレークポイントを設定し、GetLastErrorでERROR_ACCESS_DENIEDを与えました。そのため、アクセス許可の問題があり、エクスプローラを再起動したことが原因である可能性があることに気付きました。さらなる試験により、この仮定が確認された。

しかしこれはかなりまれです。

関連する問題