.NET TIPS

システムトレイ(タスクトレイ)にアイコンを表示するには?[2.0、C#、VB]

デジタルアドバンテージ 遠藤 孝信
2008/05/08

本記事は「TIPS:システムトレイ(タスクトレイ)にアイコンを表示するには?」に加筆・修正し、.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イベントのハンドラ)する。そして以下のようにコードを記述する。

private void 終了ToolStripMenuItem_Click(object sender, EventArgs e)
{
  notifyIcon1.Visible = false; // アイコンをトレイから取り除く
  Application.Exit(); // アプリケーションの終了
}
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#、下:VB)

 通常、Windowsフォームを終了させるときにはCloseメソッドを呼び出すが、今回の場合では次の項目で述べているように、Closeメソッド呼び出しにより発生するFormClosingイベント*1をキャンセルしてしまうので、ここではApplication.Exitメソッドによりアプリケーションを強制的に終了させる。

*1 .NET Framework 2.0以前では、FormClosingイベントの代わりにClosingイベントが発生していたが、.NET Framework 2.0以降ではClosingイベントは発生しない。

 また、アプリケーションの終了時にはシステムトレイにアイコンが残ってしまうことがあるので、アイコン(NotifyIconオブジェクト)のVisibleプロパティをfalseに設定して、明示的にシステムトレイから消しておく。

 システムトレイ・アイコンを利用したアプリケーションを作成している場合には、アプリケーションが終了したにもかかわらずシステムトレイにアイコンが残ってしまい、そのアイコンをマウス・カーソルでなぞってやると消えるという現象がたまに発生することがあるが、そのような場合にはこの方法を試していただきたい。

フォームの[閉じる]ボタン・クリックによるフォームの非表示

 システムトレイ・アイコンを表示するような、いわゆる常駐型のアプリケーションでは、フォームの右上隅にある[閉じる]ボタンがクリックされてもアプリケーションを終了させずに、フォームを非表示にするだけの場合が多い。

 この動作を実装するには、フォームを閉じようとしたときに発生するFormClosingイベントのイベント・ハンドラをフォームに追加し、次のように記述する。

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
  if (e.CloseReason != CloseReason.ApplicationExitCall)
  {
    e.Cancel = true; // フォームが閉じるのをキャンセル
    this.Visible = false; // フォームの非表示
  }
}
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
フォームのFormClosingイベント・ハンドラの記述(上:C#、下:VB)

 このFormClosingイベント・ハンドラでは、Application.Exitメソッド以外でフォームが閉じられようとした場合、それをキャンセルしている*2

*2 .NET Framework 2.0以前では、Application.Exitメソッド呼び出し時にはClosingイベントは発生しなかった。.NET Framework 2.0以降では、フォームのCloseメソッドやApplication.Exitメソッド呼び出しでFormClosingイベントが発生するようになっている。

 このように、FormClosingイベント・ハンドラでは、パラメータで渡されるFormClosingEventArgsオブジェクトのCloseReasonプロパティにより、どのような理由でフォームが閉じられようとしているのかを知ることができるようになっている。このプロパティの値は、CloseReason列挙体(System.Windows.Forms名前空間)で定義されたいずれかの値となる。

 ちなみに、ユーザーがフォーム右上の[閉じる]ボタンを押した場合には、CloseReasonプロパティの値はCloseReason.UserClosingになるが、プログラムでフォームのCloseメソッドを呼び出した場合にもその値となるので注意が必要だ。

 フォームの終了処理のキャンセルは、FormClosingEventArgsオブジェクトのCancelプロパティにtrueを設定すればよい。またここでは、フォームのVisibleプロパティにfalseを設定することにより、フォームを非表示にしている。

アイコンのダブルクリックによるフォームの表示

 最後に、フォームの[閉じる]ボタンのクリックにより非表示になったフォームを、システムトレイのアイコンのダブルクリックにより再度表示されるようにしよう。

 これにはNotifyIconコンポーネントにDoubleClickイベント・ハンドラを追加し、次のように記述する。

private void notifyIcon1_DoubleClick(object sender, EventArgs e)
{
  this.Visible = true; // フォームの表示
  if (this.WindowState == FormWindowState.Minimized) {
    this.WindowState = FormWindowState.Normal; // 最小化をやめる
  }
  this.Activate(); // フォームをアクティブにする
}
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
アイコン(NotifyIconコンポーネント)のDoubleClickイベント・ハンドラの記述(上:C#、下:VB)

 ここでは、フォームが最小化されている場合には、フォームのWindowStateプロパティにFormWindowState.Normalを設定することにより、フォームを通常の状態に戻している。

 また、最後の行ではフォームのActivateメソッドを呼び出してフォームをアクティブにしている。これにより、フォームがほかのウィンドウに隠れていた場合にも、最前面に表示されるようになる。End of Article

利用可能バージョン:.NET Framework 2.0以降
カテゴリ:Windowsフォーム 処理対象:NotifyIconコンポーネント
カテゴリ:Windowsフォーム 処理対象:システムトレイ
使用ライブラリ:NotifyIconクラス(System.Windows.Forms名前空間)
使用ライブラリ:Applicationクラス(System.Windows.Forms名前空間)
使用ライブラリ:FormClosingEventArgsクラス(System.Windows.Forms名前空間)
使用ライブラリ:CloseReason列挙体(System.Windows.Forms名前空間)
使用ライブラリ:FormWindowState列挙体(System.Windows.Forms名前空間)
関連TIPS:システムトレイ(タスクトレイ)にアイコンを表示するには?

この記事と関連性の高い別の.NET TIPS
システムトレイ(タスクトレイ)にアイコンを表示するには?
起動時にタスクトレイのアイコンのみを表示するには?
タスクバーにアイコンを表示させないようにするには?
Windowsアプリケーションの位置やサイズを保存するには?
Windowsアプリケーション終了時に確認ダイアログを表示するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH