NotifyIcon コントロール システムトレイ ( タスクトレイ ) にアイコンを表示する.NET Framework 2.0 以降の場合は 後述の 2 を観て欲しい Outlook や MSN Messenger 等の様に Windows アプリケーションではシステムトレイ ( タスクトレイ ステータス領域等とも呼ばれる ) にアイコンを表示して アプリケーションの状態を示したり アプリケーションのフォームを表示したりする為のショートカットとして利用する事が出来る.NET Framework のクラスライブラリには システムトレイにアイコンを表示する為の NotifyIcon コンポーネントが用意されて居り 此れを使用する事に依り 上記の様なアプリケーションを簡単に作成出来る 本稿では 以下の様な仕様のアプリケーションを作成し乍 NotifyIcon コンポーネントの基本的な利用方法に付いて纏める 起動時にフォームと同時にシステムトレイにアイコンを表示する アイコンを右クリックして表示されるコンテキスト メニューの [ 終了 ] で アプリケーションを終了出来る フォームの右上隅に有る [ 閉じる ] ボタンのクリックで フォームを非表示にする ( アプリケーションは終了しない ) アイコンのダブルクリックでフォームを表示し 且つアクティブにする システムトレイへのアイコンの表示 先ずアプリケーションの起動時に システムトレイにアイコンが表示される様にする Visual Studio.NET で Windows アプリケーションのプロジェクトを新規作成し [ ツールボックス ] ウィンドウから NotifyIcon コンポーネントをフォーム上にドラッグ & ドロップする 次に [ プロパティウィンドウ ] にて Icon プロパティで適当なアイコンファイル (.ico ファイル ) を選択する 此処で指定したアイコンが システムトレイに表示されるアイコンと成る 此の設定を行わなければ アプリケーションを実行してもシステムトレイにアイコンは表示されない 亦 NotifyIcon コンポーネントの Text プロパティに文字列を設定して置けば 其れがアイコンのツールヒントテキストとして使用される 此れはマウスカーソルをアイコン上に移動させた時に表示される システムトレイアイコンに於けるコンテキストメニューの表示 続いては アイコンの右クリックに依り [ 終了 ] メニューを表示し 其れを実行してアプリケーションを終了出来る様にする 此れには ContextMenu コンポーネントをフォーム上にドラッグ & ドロップし [ 終了 ] メニュー項目を追加する 然して [ プロパティ ] ウィンドウにて NotifyIcon コンポーネントの ContextMenu プロパティに 今作成した ContextMenu コンポーネントを設定する -1-
[ 終了 ] メニューの項目を追加した ContextMenu コンポーネント此処ではフォームのメニューとしてデザインするが メニュー ( 此の画面では contextmenu1) を NotifyIcon コンポーネントの ContextMenu プロパティに設定する事に依り アイコンを右クリックした時に表示される様に成る アイコンの [ 終了 ] メニューに依るアプリケーションの終了 次に 今追加した [ 終了 ] メニュー項目をダブルクリックして メニュー項目の選択時に実行されるイベントハンドラを以下の様に記述する Private Sub MenuItem1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MenuItem1.Click NotifyIcon1.Visible = False ' アイコンをトレイから取り除く Application.Exit() ' アプリケーションの終了 private void menuitem1_click(object sender, System.EventArgs e) notifyicon1.visible = false; // アイコンをトレイから取り除く Application.Exit(); // アプリケーションの終了 通常 Windows フォームを終了させる時には Close メソッドを呼び出すが 今回の場合では次の項目で述べて居る様に Close メソッド呼び出しに依り発生する Closing イベントをキャンセルして了うので 此処では Application.Exit メソッドに依りアプリケーションを強制的に終了させる 亦 アプリケーションの終了時にはシステムトレイにアイコンが残って了う事が有るので アイコン (NotifyIcon オブジェクト ) の Visible プロパティを false に設定して 明示的にシステムトレイから消して置く -2-
システムトレイアイコンを利用したアプリケーションを作成して居る場合には アプリケーションが終了したにも拘らずアイコンが残って了い 其のアイコンをマウスカーソルでなぞると消えると謂う現象が偶に発生する事が有るが 其の様な場合には此の方法を試して欲しい フォームの [ 閉じる ] ボタンクリックに依るフォームの非表示 システムトレイアイコンを表示する様な 所謂常駐型のアプリケーションでは フォームの右上隅に有る [ 閉じる ] ボタンがクリックされてもアプリケーションを終了させずに フォームを非表示にする丈の場合が多い 此の動作を実装するには フォームを閉じようとした時に発生する Closing イベントのイベントハンドラをフォームに追加し 次の様に記述する Private Sub Form1_Closing(ByVal sender As Object, _ ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing e.cancel = True ' 終了処理のキャンセル Me.Visible = False ' フォームの非表示 private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) e.cancel = true; // 終了処理のキャンセル this.visible = false; // フォームの非表示 此のイベントハンドラでは パラメータで渡される CancelEventArgs オブジェクトの Cancel プロパティに true を設定する事に依り フォームの終了処理をキャンセル出来る 亦 此処では フォームの Visible プロパティに false を設定する事に依り フォームを非表示にする アイコンのダブルクリックに依るフォームの表示 最後に フォームの [ 閉じる ] ボタンに依り非表示に成ったフォームを システムトレイのアイコンをダブルクリックする事に依り再度表示される様にする 此れには NotifyIcon コンポーネントに DoubleClick イベントハンドラを追加し 次の様に記述する Private Sub NotifyIcon1_DoubleClick(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles NotifyIcon1.DoubleClick Me.Visible = True ' フォームの表示 If Me.WindowState = FormWindowState.Minimized Then Me.WindowState = FormWindowState.Normal ' 最小化を止める End If Me.Activate() ' フォームをアクティブにする private void notifyicon1_doubleclick(object sender, System.EventArgs e) this.visible = true; // フォームの表示 if (this.windowstate == FormWindowState.Minimized) this.windowstate = FormWindowState.Normal; // 最小化を止める this.activate(); // フォームをアクティブにする -3-
此処では フォームが最小化されて居る場合には フォームの WindowState プロパティに FormWindowState.Normal を設定する事に依り フォームの通常の状態に戻して居る 亦 フォームの Activate メソッドを呼び出してフォームをアクティブにして居る 此れに依り フォームが他のウィンドウに隠れていた場合にも 最前面に表示される様に成る -4-
起動時にタスクトレイのアイコンのみを表示する 前項では Windows アプリケーションでタスクトレイアイコンを表示する方法に付いて解説したが 常駐型のアプリケーションでは 起動時からフォームを表示せずにアイコン而巳を表示したい場合が有る 本稿では此の方法に付いて解説する Application.Run メソッドの呼び出し部分の変更 アプリケーションの起動時にフォームが表示されるのは 通常 Main メソッドで実行される Application.Run メソッドに依る物で有る 此の Application.Run メソッドは パラメータで指定されたフォームを表示し メッセージループを開始する 其の為 起動時にフォームを表示させない様にするには Application.Run メソッドの呼び出し部分を以下の様に変更すれば良い ( 此の変更は前項で作成したアプリケーションに対して行う ) 先ず の場合には 自動生成されたコードを次の様に変更する public class Form1 : System.Windows.Forms.Form static void Main() new Form1(); Application.Run(); // Application.Run(new Form1()); // 自動生成される元のコード VB の場合には Application.Run メソッドの呼び出しが明示的には実装されない為 以下の様な Main メソッドを追加し プロジェクトのプロパティで [ スタートアップの設定 ] を変更して 此の Main メソッドをアプリケーション起動時に呼び出される様にする Public Class Form1 Inherits System.Windows.Forms.Form Shared Sub Main() Dim f As New Form1 Application.Run() 以上の修正に依り フォームは生成されるが 表示はされない状態 ( 非表示の状態 ) としてアプリケーションは実行される 猶 前項で既に解説して居るが 此のアプリケーションを終了させる場合には Application.Exit メソッドを呼び出す必要が有る -5-
システムトレイ ( タスクトレイ ) にアイコンを表示する 2 本記事は前記の システムトレイ ( タスクトレイ ) にアイコンを表示する に加筆 修正し.NET Framework 2.0 以降に対応させた物で有る Outlook や Windows Live Messenger 等の様に Windows アプリケーションではシステムトレイ ( タスクトレイ ステータス領域等とも呼ばれる ) にアイコンを表示して アプリケーションの状態を示したり アプリケーションのフォームを表示したりする為のショートカットとして利用する事が出来る.NET Framework のクラスライブラリには システムトレイにアイコンを表示する為の NotifyIcon コンポーネントが用意されて居り 此れを使用する事に依り 上記の様なアプリケーションを簡単に作成出来る 本稿では 以下の様な仕様のアプリケーションを作成し乍 NotifyIcon コンポーネントの基本的な利用方法に付いて纏める 起動時にフォームと同時にシステムトレイにアイコンを表示する アイコンを右クリックして表示されるコンテキストメニューの [ 終了 ] で アプリケーションを終了出来る フォームの右上隅に有る [ 閉じる ] ボタンのクリックで フォームを非表示にする ( アプリケーションは終了しない ) アイコンのダブルクリックでフォームを表示し 且つアクティブにする システムトレイへのアイコンの表示 先ずアプリケーションの起動時に システムトレイにアイコンが表示される様にする Visual Studio(Visual Studio 2005 や 2008) で Windows アプリケーションのプロジェクトを新規作成し [ ツールボックス ] ウィンドウから NotifyIcon コンポーネントをフォーム上にドラッグ & ドロップする 次に [ プロパティ ] ウィンドウにて Icon プロパティに適当なアイコンファイル (.ico ファイル ) を選択する 此処で指定したアイコンがシステムトレイに表示されるアイコンと成る 此の設定を行わなければ アプリケーションを実行してもシステムトレイにアイコンは表示されない 亦 NotifyIcon コンポーネントの Text プロパティに文字列を設定して置けば 其れがアイコンのツールヒントテキストとして使用される 此れはマウスカーソルをシステムトレイのアイコン上に移動させた時に表示される システムトレイアイコンに於けるコンテキストメニューの表示 続いては アイコンの右クリックに依り [ 終了 ] メニューを表示し 其の選択に依りアプリケーションを終了出来る様にする 此れには先ず ContextMenuStrip コンポーネントをフォーム上にドラッグ & ドロップし [ 終了 ] メニュー項目を追加する 然して [ プロパティ ] ウィンドウにて NotifyIcon コンポーネントの ContextMenuStrip プロパティで 今作成した ContextMenuStrip コンポーネントを設定する -6-
[ 終了 ] メニューの項目を追加した ContextMenu コンポーネント画面は Visual Studio 2008 を使用した場合 此処ではフォームのメニューとしてデザインするが メニュー ( 此の画面では contextmenustrip1) を NotifyIcon コンポーネントの ContextMenuStrip プロパティに設定する事に依り アイコンを右クリックした時に表示される様に成る アイコンの [ 終了 ] メニューに依るアプリケーションの終了 次に 今追加した [ 終了 ] メニュー項目をダブルクリックし メニュー項目の選択時に実行されるイベントハンドラ (Click イベントのハンドラ ) する 然して以下の様にコードを記述する Private Sub 終了 ToolStripMenuItem_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles 終了 ToolStripMenuItem.Click NotifyIcon1.Visible = False ' アイコンをトレイから取り除く Application.Exit() ' アプリケーションの終了 private void 終了 ToolStripMenuItem_Click(object sender, EventArgs e) notifyicon1.visible = false; // アイコンをトレイから取り除く Application.Exit(); // アプリケーションの終了 通常 Windows フォームを終了させる時には Close メソッドを呼び出すが 今回の場合では次の項目で述べて居る様に Close メソッド呼び出しに依り発生する FormClosing イベント *1 をキャンセルして了うので 此処では Application.Exit メソッドに依りアプリケーションを強制的に終了させる 1.NET Framework 2.0 以前では FormClosing イベントの代わりに Closing イベントが発生していたが.NET Framework 2.0 以降では Closing イベントは発生しない -7-
亦 アプリケーションの終了時にはシステムトレイにアイコンが残って了う事が有るので アイコン (NotifyIcon オブジェクト ) の Visible プロパティを false に設定して 明示的にシステムトレイから消して置く システムトレイアイコンを利用したアプリケーションを作成して居る場合には アプリケーションが終了したにも拘らずシステムトレイにアイコンが残って了い 其のアイコンをマウスカーソルでなぞると消えると謂う現象が偶に発生する事が有るが 其の様な場合には此の方法を試して欲しい フォームの [ 閉じる ] ボタンクリックに依るフォームの非表示 システムトレイアイコンを表示する様な 所謂常駐型のアプリケーションでは フォームの右上隅に有る [ 閉じる ] ボタンがクリックされてもアプリケーションを終了させずに フォームを非表示にする丈の場合が多い 此の動作を実装するには フォームを閉じようとした時に発生する FormClosing イベントのイベントハンドラをフォームに追加し 次の様に記述する Private Sub Form1_FormClosing(ByVal sender As Object, _ ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing If e.closereason <> CloseReason.ApplicationExitCall Then e.cancel = True ' フォームが閉じるのをキャンセル Me.Visible = False ' フォームの非表示 End If private void Form1_FormClosing(object sender, FormClosingEventArgs e) if (e.closereason!= CloseReason.ApplicationExitCall) e.cancel = true; // フォームが閉じるのをキャンセル this.visible = false; // フォームの非表示 此の FormClosing イベント ハンドラでは Application.Exit メソッド以外でフォームが閉じられようとした場合 其れをキャンセルして居る *2 2.NET Framework 2.0 以前では Application.Exit メソッド呼び出し時には Closing イベントは発生しなかった.NET Framework 2.0 以降では フォームの Close メソッドや Application.Exit メソッド呼び出しで FormClosing イベントが発生する様になって居る 此の様に FormClosing イベント ハンドラでは パラメータで渡される FormClosingEventArgs オブジェクトの CloseReason プロパティに依り 何の様な理由でフォームが閉じられようとして居るのかを知る事が出来る様に成って居る 此のプロパティの値は CloseReason 列挙体で定義された孰れかの値と成る 因みに ユーザーがフォーム右上の [ 閉じる ] ボタンを押した場合には CloseReason プロパティの値は CloseReason.UserClosing に成るが プログラムでフォームの Close メソッドを呼び出した場合にも其の値と成るので注意が必要だ -8-
フォームの終了処理のキャンセルは FormClosingEventArgs オブジェクトの Cancel プロパティに true を設定すれば良い 亦此処では フォームの Visible プロパティに false を設定する事に依り フォームを非表示にして居る アイコンのダブルクリックに依るフォームの表示 最後に フォームの [ 閉じる ] ボタンのクリックに依り非表示に成ったフォームを システムトレイのアイコンのダブルクリックに依り再度表示される様にしよう 此れには NotifyIcon コンポーネントに DoubleClick イベントハンドラを追加し 次の様に記述する Private Sub NotifyIcon1_MouseDoubleClick(ByVal sender As System.Object, _ ByVal e As System.Windows.Forms.MouseEventArgs) Handles NotifyIcon1.MouseDoubleClick Me.Visible = True ' フォームの表示 If Me.WindowState = FormWindowState.Minimized Then Me.WindowState = FormWindowState.Normal ' 最小化を止める End If Me.Activate()' フォームをアクティブにする private void notifyicon1_doubleclick(object sender, EventArgs e) this.visible = true; // フォームの表示 if (this.windowstate == FormWindowState.Minimized) this.windowstate = FormWindowState.Normal; // 最小化を止める this.activate(); // フォームをアクティブにする 此処では フォームが最小化されて居る場合には フォームの WindowState プロパティに FormWindowState.Normal を設定する事に依り フォームを通常の状態に戻して居る 亦 最後の行ではフォームの Activate メソッドを呼び出してフォームをアクティブにして居る 此れに依り フォームが他のウィンドウに隠れていた場合にも 最前面に表示される様に成る -9-