■ システムトレイ(タスクトレイ)にアイコンを表示する ■ ※ .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 コンポーネントを設定する。
N
N
o
o
t
t
i
i
f
f
y
y
I
I
c
c
o
o
n
n
コ
コ
ン
ン
ト
ト
ロ
ロ
ー
ー
ル
ル
[終了]メニューの項目を追加したContextMenu コンポーネント 此処ではフォームのメニューとしてデザインするが、メニュー(此の画面では contextMenu1)を NotifyIcon コンポーネントの ContextMenu プロパティに設定する事に依り、アイコンを右クリックし た時に表示される様に成る。 ■ アイコンの[終了]メニューに依るアプリケーションの終了 次に、今追加した[終了]メニュー項目をダブルクリックして、メニュー項目の選択時に実行されるイ ベントハンドラを以下の様に記述する。 Visual Basic
Private Sub MenuItem1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MenuItem1.Click NotifyIcon1.Visible = False ' アイコンをトレイから取り除く Application.Exit() ' アプリケーションの終了
End Sub
C#
private void menuItem1_Click(object sender, System.EventArgs e) { notifyIcon1.Visible = false; // アイコンをトレイから取り除く Application.Exit(); // アプリケーションの終了 } 通常、Windows フォームを終了させる時には Close メソッドを呼び出すが、今回の場合では次の項目 で述べて居る様にClose メソッド呼び出しに依り発生する Closing イベントをキャンセルして了うので、 此処ではApplication.Exit メソッドに依りアプリケーションを強制的に終了させる。 亦、アプリケーションの終了時にはシステムトレイにアイコンが残って了う事が有るので、アイコン (NotifyIcon オブジェクト)の Visible プロパティを false に設定して、明示的にシステムトレイから 消して置く。
システムトレイアイコンを利用したアプリケーションを作成して居る場合には、アプリケーションが終 了したにも拘らずアイコンが残って了い、其のアイコンをマウスカーソルでなぞると消えると謂う現象 が偶に発生する事が有るが、其の様な場合には此の方法を試して欲しい。 ■ フォームの[閉じる]ボタンクリックに依るフォームの非表示 システムトレイアイコンを表示する様な、所謂常駐型のアプリケーションでは、フォームの右上隅に有 る[閉じる]ボタンがクリックされてもアプリケーションを終了させずに、フォームを非表示にする丈 の場合が多い。 此の動作を実装するには、フォームを閉じようとした時に発生するClosing イベントのイベントハンド ラをフォームに追加し、次の様に記述する。 Visual Basic
Private Sub Form1_Closing(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing e.Cancel = True ' 終了処理のキャンセル
Me.Visible = False ' フォームの非表示 End Sub
C#
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) { e.Cancel = true; // 終了処理のキャンセル this.Visible = false; // フォームの非表示 } 此のイベントハンドラでは、パラメータで渡されるCancelEventArgs オブジェクトの Cancel プロパテ ィにtrue を設定する事に依り、フォームの終了処理をキャンセル出来る。 亦、此処では、フォームのVisible プロパティに false を設定する事に依り、フォームを非表示にする。 ■ アイコンのダブルクリックに依るフォームの表示 最後に、フォームの[閉じる]ボタンに依り非表示に成ったフォームを、システムトレイのアイコンを ダブルクリックする事に依り再度表示される様にする。 此れにはNotifyIcon コンポーネントに DoubleClick イベントハンドラを追加し、次の様に記述する。 Visual Basic
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() ' フォームをアクティブにする End Sub
C#
private void notifyIcon1_DoubleClick(object sender, System.EventArgs e) { this.Visible = true; // フォームの表示 if (this.WindowState == FormWindowState.Minimized) this.WindowState = FormWindowState.Normal; // 最小化を止める this.Activate(); // フォームをアクティブにする }
此 処 で は 、 フ ォ ー ム が 最 小 化 さ れ て 居 る 場 合 に は 、 フ ォ ー ム の WindowState プ ロ パ テ ィ に FormWindowState.Normal を設定する事に依り、フォームの通常の状態に戻して居る。
亦、フォームのActivate メソッドを呼び出してフォームをアクティブにして居る。此れに依り、フォー ムが他のウィンドウに隠れていた場合にも、最前面に表示される様に成る。
■ 起動時にタスクトレイのアイコンのみを表示する ■ 前項では、Windows アプリケーションでタスクトレイアイコンを表示する方法に付いて解説したが、 常駐型のアプリケーションでは、起動時からフォームを表示せずにアイコン而巳を表示したい場合が有 る。本稿では此の方法に付いて解説する。 ■ Application.Run メソッドの呼び出し部分の変更 ア プ リ ケ ー シ ョ ン の 起 動 時 に フ ォ ー ム が 表 示 さ れ る の は 、 通 常 Main メソッドで実行される Application.Run メソッドに依る物で有る。此の Application.Run メソッドは、パラメータで指定され たフォームを表示し、メッセージループを開始する。 其の為、起動時にフォームを表示させない様にするには、Application.Run メソッドの呼び出し部分を 以下の様に変更すれば良い(此の変更は前項で作成したアプリケーションに対して行う)。 先ずC#の場合には、自動生成されたコードを次の様に変更する。 C#
public class Form1 : System.Windows.Forms.Form {
……
static void Main() { new Form1(); Application.Run(); // Application.Run(new Form1()); // 自動生成される元のコード } …… VB の場合には、Application.Run メソッドの呼び出しが明示的には実装されない為、以下の様な Main メソッドを追加し、プロジェクトのプロパティで[スタートアップの設定]を変更して、此のMain メ ソッドをアプリケーション起動時に呼び出される様にする。 Visual Basic
Public Class Form1
Inherits System.Windows.Forms.Form ……
Shared Sub Main() Dim f As New Form1 Application.Run() End Sub …… 以上の修正に依り、フォームは生成されるが、表示はされない状態(非表示の状態)としてアプリケー ションは実行される。 猶、前項で既に解説して居るが、此のアプリケーションを終了させる場合には、Application.Exit メソ ッドを呼び出す必要が有る。
■ システムトレイ(タスクトレイ)にアイコンを表示する 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 コンポーネントを設定する。
[終了]メニューの項目を追加したContextMenu コンポーネント
画面はVisual Studio 2008 を使用した場合。此処ではフォームのメニューとしてデザインするが、メニ ュー(此の画面ではcontextMenuStrip1)を NotifyIcon コンポーネントの ContextMenuStrip プロパ ティに設定する事に依り、アイコンを右クリックした時に表示される様に成る。
■ アイコンの[終了]メニューに依るアプリケーションの終了
次に、今追加した[終了]メニュー項目をダブルクリックし、メニュー項目の選択時に実行されるイベ ントハンドラ(Click イベントのハンドラ)する。然して以下の様にコードを記述する。
Visual Basic
Private Sub 終了 ToolStripMenuItem_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles 終了 ToolStripMenuItem.Click NotifyIcon1.Visible = False ' アイコンをトレイから取り除く
Application.Exit() ' アプリケーションの終了 End Sub
C#
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 イベントが発生してい
亦、アプリケーションの終了時にはシステムトレイにアイコンが残って了う事が有るので、アイコン (NotifyIcon オブジェクト)の Visible プロパティを false に設定して、明示的にシステムトレイから 消して置く。 システムトレイアイコンを利用したアプリケーションを作成して居る場合には、アプリケーションが終 了したにも拘らずシステムトレイにアイコンが残って了い、其のアイコンをマウスカーソルでなぞると 消えると謂う現象が偶に発生する事が有るが、其の様な場合には此の方法を試して欲しい。 ■ フォームの[閉じる]ボタンクリックに依るフォームの非表示 システムトレイアイコンを表示する様な、所謂常駐型のアプリケーションでは、フォームの右上隅に有 る[閉じる]ボタンがクリックされてもアプリケーションを終了させずに、フォームを非表示にする丈 の場合が多い。 此の動作を実装するには、フォームを閉じようとした時に発生する FormClosing イベントのイベント ハンドラをフォームに追加し、次の様に記述する。 Visual Basic
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 End Sub
C#
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 メソッドを呼び出した場合にも 其の値と成るので注意が必要だ。
フォームの終了処理のキャンセルは、FormClosingEventArgs オブジェクトの Cancel プロパティに true を設定すれば良い。亦此処では、フォームの Visible プロパティに false を設定する事に依り、フ ォームを非表示にして居る。 ■ アイコンのダブルクリックに依るフォームの表示 最後に、フォームの[閉じる]ボタンのクリックに依り非表示に成ったフォームを、システムトレイの アイコンのダブルクリックに依り再度表示される様にしよう。 此れにはNotifyIcon コンポーネントに DoubleClick イベントハンドラを追加し、次の様に記述する。 Visual Basic
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()' フォームをアクティブにする End Sub
C#
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 メソッドを呼び出してフォームをアクティブにして居る。此れに 依り、フォームが他のウィンドウに隠れていた場合にも、最前面に表示される様に成る。