.NET TIPS

システムトレイ(タスクトレイ)にアイコンを表示するには?

デジタルアドバンテージ 遠藤 孝信
2005/12/23

 OutlookやMSN Messengerなどのように、Windowsアプリケーションではシステムトレイ(タスクトレイ、ステータス領域などとも呼ばれる)にアイコンを表示して、アプリケーションの状態を示したり、アプリケーションのフォームを表示したりするためのショートカットとして利用することができる。

 .NET Frameworkのクラス・ライブラリには、システムトレイにアイコンを表示するためのNotifyIconコンポーネントが用意されており、これを使用することにより、上記のようなアプリケーションを簡単に作成できる。

 本稿では、以下のような仕様のアプリケーションを作成しながら、NotifyIconコンポーネントの基本的な利用方法についてまとめる。

  • 起動時にフォームと同時にシステムトレイにアイコンを表示する

  • アイコンを右クリックして表示されるコンテキスト・メニューの[終了]で、アプリケーションを終了できる。

  • フォームの右上隅にある[閉じる]ボタンのクリックで、フォームを非表示にする(アプリケーションは終了しない)。

  • アイコンのダブルクリックでフォームを表示し、かつアクティブにする。

システムトレイへのアイコンの表示

 まずアプリケーションの起動時に、システムトレイにアイコンが表示されるようにしよう。

 Visual Studio .NETでWindowsアプリケーションのプロジェクトを新規作成し、[ツールボックス]ウィンドウからNotifyIconコンポーネントをフォーム上にドラッグ&ドロップする。

 次に、[プロパティ]ウィンドウにて、Iconプロパティで適当なアイコン・ファイル(.icoファイル)を選択する。ここで指定したアイコンが、システムトレイに表示されるアイコンとなる。この設定を行わなければ、アプリケーションを実行してもシステムトレイにアイコンは表示されない。

 また、NotifyIconコンポーネントのTextプロパティに文字列を設定しておけば、それがアイコンのツール・ヒント・テキストとして使用される。これはマウス・カーソルをアイコン上に移動させたときに表示される。

システムトレイ・アイコンにおけるコンテキスト・メニューの表示

 続いては、アイコンの右クリックにより[終了]メニューを表示し、それを実行してアプリケーションを終了できるようにする。

 これには、ContextMenuコンポーネントをフォーム上にドラッグ&ドロップし、[終了]メニュー項目を追加する。そして[プロパティ]ウィンドウにて、NotifyIconコンポーネントのContextMenuプロパティに、いま作成したContextMenuコンポーネントを設定する。

[終了]メニューの項目を追加したContextMenuコンポーネント
ここではフォームのメニューとしてデザインするが、メニュー(この画面ではcontextMenu1)をNotifyIconコンポーネントのContextMenuプロパティに設定することにより、アイコンを右クリックしたときに表示されるようになる。□

アイコンの[終了]メニューによるアプリケーションの終了

 次に、いま追加した[終了]メニュー項目をダブルクリックして、メニュー項目の選択時に実行されるイベント・ハンドラを以下のように記述する。

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

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

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

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

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

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

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

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
  e.Cancel = true; // 終了処理のキャンセル
  this.Visible = false; // フォームの非表示
}
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
フォームのClosingイベント・ハンドラの記述(上:C#、下:VB.NET)

 このイベント・ハンドラでは、パラメータで渡されるCancelEventArgsオブジェクトのCancelプロパティにtrueを設定することにより、フォームの終了処理をキャンセルできる。

 またここでは、フォームのVisibleプロパティにfalseを設定することにより、フォームを非表示にする。

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

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

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

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

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

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

カテゴリ:Windowsフォーム 処理対象:NotifyIconコンポーネント
カテゴリ:Windowsフォーム 処理対象:システムトレイ
使用ライブラリ:NotifyIconクラス(System.Windows.Forms名前空間)
使用ライブラリ:Applicationクラス(System.Windows.Forms名前空間)
使用ライブラリ:CancelEventArgsクラス(System.ComponentModel名前空間)
使用ライブラリ:FormWindowState列挙体(System.Windows.Forms名前空間)

この記事と関連性の高い別の.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メールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間