第32回 タスクトレイに常駐させる

今回はタスクバーの右側、通知領域となるタスクトレイにアイコンを追加し、そのダブルクリックで最小化/元に戻すができるようにする。

まずタスクトレイに表示するアイコンをプロジェクトに追加する。
「プロジェクト」メニューから「既存項目の追加」を開き、適当なアイコンファイルを追加する。
今回はVisual Studio 2008付属の再配布可能アイコンのAudioFile.icoを利用した。

次にフォームへ通知アイコンコントロールを追加する。
Form1のデザインを開き、「NotifyIcon」を配置する。名前はデフォルト「notifyIcon1」のまま。
そしてプロパティを開き、Iconプロパティにプロジェクトフォルダ内のアイコンを指定する。
さらにTextプロパティは「MP3Player」とした。

■Form1.cs
		public Form1()
		{
			InitializeComponent();

			//設定の読み込み
			Option.Load(out _option, Utility.GetExeFolder() + "option.txt");

			Utility.CreateTmpFolder();			//tmpフォルダの作成


			//ウインドウ表示位置設定
			//[Ctrl]キーが押されていないときのみ設定=表示位置を復元したくないときは[Ctrl]キーを押して起動する
			if ((Control.ModifierKeys & Keys.Control) != Keys.Control)
			{
				StartPosition = FormStartPosition.Manual;
				Location = _option.ptWindowPos;
			}


			//DBに情報がなければ再構築する=>時間が非常にかかる!
			if (MP3Info.GetCount() == 0)
			{
				MP3Info.RefreshAllInfo(true);
			}


			ControlBox = false;		//タイトルバーを消す
			FormBorderStyle = FormBorderStyle.None;


			//フォームのドラッグでウインドウを移動する
			{
				bool _bMoving = false;
				Point _ptMouseDown = new Point(-1, -1);
				Point _ptMouseDownWindowPos = new Point(-1, -1);

				MouseDown += (sender, e) =>
				{
					if (e.Button != MouseButtons.Left)
						return;

					_ptMouseDown.X = e.X;
					_ptMouseDown.Y = e.Y;
					_ptMouseDown = PointToScreen(_ptMouseDown);
					_ptMouseDownWindowPos.X = this.Left;
					_ptMouseDownWindowPos.Y = this.Top;
					_bMoving = true;
				};

				MouseMove += (sender, e) =>
				{
					if (_bMoving)
					{
						Point tmp = new Point(e.X, e.Y);
						tmp = PointToScreen(tmp);

						this.Left = _ptMouseDownWindowPos.X - _ptMouseDown.X + tmp.X;
						this.Top = _ptMouseDownWindowPos.Y - _ptMouseDown.Y + tmp.Y;
					}
				};

				MouseUp += (sender, e) =>
				{
					_bMoving = false;
					_ptMouseDown.X = -1;
					_ptMouseDown.Y = -1;
				};
			}


			ShowInTaskbar = false;		//タスクバーから消す		//追加


			//以下を追加
			//タスクトレイアイコン右クリックメニューの設定
			{
				ContextMenuStrip menu = new ContextMenuStrip();

				ToolStripItem[] stripItem = new ToolStripMenuItem[]
				{
					new ToolStripMenuItem("表示/最小化", null, delegate
						{
							if (WindowState == FormWindowState.Normal)
								WindowState = FormWindowState.Minimized;
							else if (WindowState == FormWindowState.Minimized)
								WindowState = FormWindowState.Normal;
						}),
					new ToolStripMenuItem("終了", null, delegate
						{
							Close();
						}),
				};
				menu.Items.AddRange(stripItem);

				notifyIcon1.ContextMenuStrip = menu;
			}

			//以下を追加
			//タスクトレイアイコンのダブルクリック処理
			notifyIcon1.DoubleClick += delegate
			{
				if (WindowState == FormWindowState.Normal)
					WindowState = FormWindowState.Minimized;
				else if (WindowState == FormWindowState.Minimized)
					WindowState = FormWindowState.Normal;
			};


			//フォームが表示されたときの処理
			Shown += delegate
			{
				//シークバーにフォーカスがあると、再生位置が表示されないのでここで再生ボタンにフォーカスを与える
				buttonPlay.Focus();
			};

プロジェクトファイルをダウンロード


カテゴリー「MP3プレーヤーを作る(C#)」 のエントリー