C# Programming

Image

タスクトレイにアイコンを表示する (NotifyIcon)

開発環境: Visual Studio 2003 

次のような機能のアプリケーションを作る。
・タスクトレイにアイコンを表示する。
・タスクトレイのアイコンを右クリックすると、メニューが表示される。
・メニューは、Menu1(ダイアログを表示), Exit(終了)。

作り方
1. Windows Forms の新規プロジェクトを TaskTray(任意) という名前で作る。
2. ツールボックスより、NotifyIcon コントロールを貼り付ける。
3. ツールボックスより、ContextMenu コントロールを貼り付ける。
4. ソリューション エクスプローラーより、TaskTray を選択し、
マウス右ボタン→追加→新しい項目の追加を選択する。
すると、次のようなダイアログが表示されるので、アイコン ファイルを選択して開くボタンを押す。

Image


5. アイコンエディタで適当な絵を書く。
6. 2で作成したNotifyIconのプロパティシートを開き、ContextMenu に 3で作成した
contextMenu1 を登録する。
7. 次に、NotifyIconのプロパティシートの Iconに、 5 で作ったアイコンファイルを登録する。
次の図参照。


Image

8. 3で作成したContextMenu に、フォームデザインで適当なメニューを作る。

9. 8 で作成したコンテクストメニューが選択された場合のイベント処理を、
メニュープロパティのイベントで設定する。次の図参照。

Image

10. 9 で追加したしたイベント処理を追加する。この例ではメッセージボックスを表示する。

                private void OnMenu1(object sender, System.EventArgs e)
                {
                        MessageBox.Show("Menu1", this.Text, MessageBoxButtons.OK, 
                        MessageBoxIcon.Exclamation);
                }

                private void OnExit(object sender, System.EventArgs e)
                {               
                        Application.Exit();
                }

11. このままだとアプリケーションのウィンドウが表示されるので、
必要に応じてフォームウィンドウを非表示にする。このためには、Form のプロパティより、
WindowsState を Minimized、ShowInTaskBar を False に設定する。

12. 以上で、次のようなタスクトレイ上にアイコンとメニューを出すことができる。

Image

ソースコードは次のとおり。

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace TaskTray
{
        /// <summary>
        /// Form1 の概要の説明です。
        /// </summary>
        public class Form1 : System.Windows.Forms.Form
        {
                private System.Windows.Forms.NotifyIcon notifyIcon1;
                private System.Windows.Forms.ContextMenu contextMenu1;
                private System.Windows.Forms.MenuItem menuItem1;
                private System.Windows.Forms.MenuItem menuItem2;
                private System.ComponentModel.IContainer components;

                public Form1()
                {
                        //
                        // Windows フォーム デザイナ サポートに必要です。
                        //
                        InitializeComponent();

                        //
                        // TODO: InitializeComponent 呼び出しの後に
                        // コンストラクタ コードを追加してください。
                        //
                }

                /// <summary>
                /// 使用されているリソースに後処理を実行します。
                /// </summary>
                protected override void Dispose( bool disposing )
                {
                        if( disposing )
                        {
                                if (components != null) 
                                {
                                        components.Dispose();
                                }
                        }
                        base.Dispose( disposing );
                }

                #region Windows Form Designer generated code
                /// <summary>
                /// デザイナ サポートに必要なメソッドです。このメソッドの内容を
                /// コード エディタで変更しないでください。
                /// </summary>
                private void InitializeComponent()
                {
                        this.components = new System.ComponentModel.Container();
                        System.Resources.ResourceManager resources = 
                        new System.Resources.ResourceManager(typeof(Form1));
                        this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(
                              this.components);
                        this.contextMenu1 = new System.Windows.Forms.ContextMenu();
                        this.menuItem1 = new System.Windows.Forms.MenuItem();
                        this.menuItem2 = new System.Windows.Forms.MenuItem();
                        // 
                        // notifyIcon1
                        // 
                        this.notifyIcon1.ContextMenu = this.contextMenu1;
                        this.notifyIcon1.Icon = ((System.Drawing.Icon)
                              (resources.GetObject("notifyIcon1.Icon")));
                        this.notifyIcon1.Text = "notifyIcon1";
                        this.notifyIcon1.Visible = true;
                        // 
                        // contextMenu1
                        // 
                        this.contextMenu1.MenuItems.AddRange(
                           new System.Windows.Forms.MenuItem[] {
                                 this.menuItem1,
                                 this.menuItem2});
                        // 
                        // menuItem1
                        // 
                        this.menuItem1.Index = 0;
                        this.menuItem1.Text = "Menu1";
                        this.menuItem1.Click += new System.EventHandler(this.OnMenu1);
                        // 
                        // menuItem2
                        // 
                        this.menuItem2.Index = 1;
                        this.menuItem2.Text = "Exit";
                        this.menuItem2.Click += new System.EventHandler(this.OnExit);
                        // 
                        // Form1
                        // 
                        this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
                        this.ClientSize = new System.Drawing.Size(296, 102);
                        this.Name = "Form1";
                        this.ShowInTaskbar = false;
                        this.Text = "Form1";
                        this.WindowState = System.Windows.Forms.FormWindowState.
                              Minimized;

                }
                #endregion

                /// <summary>
                /// アプリケーションのメイン エントリ ポイントです。
                /// </summary>
                [STAThread]
                static void Main() 
                {
                        Application.Run(new Form1());
                }

                private void OnMenu1(object sender, System.EventArgs e)
                {
                        MessageBox.Show("Menu1", this.Text, MessageBoxButtons.OK, 
              MessageBoxIcon.Exclamation);
                }

                private void OnExit(object sender, System.EventArgs e)
                {               
                        Application.Exit();
                }
        }
}