通知と通知領域

通知領域は、通知と状態の一時的なソースを提供するタスク バーの一部です。 また、バッテリ レベル、ボリューム制御、ネットワーク状態など、デスクトップ上に存在しないシステム機能やプログラム機能のアイコンを表示するためにも使用できます。 通知領域は、従来、システム トレイまたはステータス領域と呼ばれています。

このトピックは、次のセクションで構成されています。

通知領域と通知領域のガイドライン

通知と通知領域使用に関するベスト プラクティスについては、「Windows ユーザー エクスペリエンスの相互作用ガイドライン」の「通知と通知領域」セクションを参照してください。 目標は、迷惑または気を散らすことなく、通知を適切に使用することでユーザーの利益を提供することです。

通知領域は、すぐに操作する必要がある重要な情報用ではありません。 また、プログラムやコマンドにすばやくアクセスするためのものではありません。 Windows 7 の時点で、その機能の多くは、アプリケーションのタスク バー ボタンを使用して行うのが最適です。

Windows 7 では、ユーザーが選択した場合にアプリケーションからのすべての通知を抑制できるため、思慮深い通知の設計と使用により、ユーザーはアプリケーションで引き続き表示できるようになります。 通知は中断です。価値があることを確認します。

Windows 7 では、"静かな時間" という概念が導入されています。 サイレント時間は、新しいユーザーが初めて、またはオペレーティング システムのアップグレード後またはインストール後に初めて自分のアカウントにログインした後の最初の 1 時間として定義クリーン。 今回は、ユーザーが通知を気を散らすことなく、新しい環境を探索して理解できるように設定されています。 この期間中は、ほとんどの通知を送信したり表示したりしないでください。 例外には、USB デバイスを接続したり、ドキュメントを印刷したりする場合など、ユーザーの操作に応じてユーザーが表示すると予想されるフィードバックが含まれます。 静かな時間に関する API の詳細については、このトピックの後半で説明します。

通知の作成と表示

このトピックの残りのセクションでは、アプリケーションからユーザーへの通知を表示するために従う基本的な手順について説明します。

  1. 通知アイコンを追加する
  2. NOTIFYICONDATA バージョンを定義する
  3. 通知の外観と内容を定義する
  4. ユーザーの状態を確認する
  5. 通知を表示する
  6. アイコンの削除

通知アイコンを追加する

通知を表示するには、通知領域にアイコンが必要です。 Microsoft Communicator やバッテリー レベルなど、特定の場合、そのアイコンは既に存在します。 ただし、他の多くの場合は、通知を表示するために必要な限り、通知領域にアイコンを追加します。 どちらの場合も、 これは Shell_NotifyIcon 関数を使用して実現されます。 Shell_NotifyIcon では、通知領域のアイコンを追加、変更、または削除できます。

3 つのアイコンを含む通知領域

アイコンが Windows 7 の通知領域に追加されると、既定では通知領域のオーバーフロー セクションに追加されます。 この領域には、アクティブな通知領域のアイコンが含まれていますが、通知領域には表示されません。 オーバーフローから通知領域にアイコンを昇格できるのはユーザーだけですが、特定の状況では、システムは短いプレビュー (1 分以内) としてアイコンを通知領域に一時的に昇格させることができます。

注意

ユーザーは、通知領域に表示するアイコンを最終的に確認する必要があります。 通知領域に一時的でないアイコンをインストールする前に、ユーザーにアクセス許可を求める必要があります。 また、通知領域からアイコンを削除するオプション (通常はショートカット メニュー) も指定する必要があります。

 

Shell_NotifyIconの呼び出しで送信される NOTIFYICONDATA 構造体には、通知領域アイコンと通知自体の両方を指定する情報が含まれています。 NOTIFYICONDATA を使用して設定できる通知領域アイコン自体に固有の項目を次に示します。

  • アイコンの取得元のリソース。
  • アイコンの一意識別子。
  • アイコンのツールヒントのスタイル。
  • 通知領域のアイコンの状態 (非表示、共有、またはその両方)。
  • アイコンに関連付けられているアプリケーション ウィンドウのハンドル。
  • アイコンの外接する四角形内で発生するイベントと、関連付けられたアプリケーション ウィンドウとのバルーン通知をアイコンが通信できるようにするコールバック メッセージ識別子。 アイコンの外接する四角形は、 Shell_NotifyIconGetRectを通じて取得できます。

通知領域の各アイコンは、次の 2 つの方法で識別できます。

  • レジストリでアイコンが宣言されている GUID。 これは、Windows 7 以降で推奨される方法です。
  • 通知領域アイコンに関連付けられているウィンドウのハンドルと、アプリケーション定義のアイコン識別子。 このメソッドは、Windows Vista 以前で使用されています。

通知領域のアイコンにはヒントを含めることができます。 ツールヒントには、標準のツールヒント (推奨) またはアプリケーション描画のポップアップ UI のいずれかを指定できます。 ツールヒントは必要ありませんが、推奨されます。

通知領域のアイコンは、高 DPI に対応している必要があります。 アプリケーションでは、リソース ファイルに 16 x 16 ピクセル のアイコンと 32 x 32 アイコンの両方を提供し、 LoadIconMetric を使用して、正しいアイコンが適切に読み込まれ、スケーリングされるようにする必要があります。

通知領域アイコンを担当するアプリケーションは、そのアイコンのマウス クリックを処理する必要があります。 ユーザーがアイコンを右クリックすると、通常のショートカット メニューが表示されます。 ただし、マウスの左ボタンを使用した 1 回のクリックの結果は、アイコンの機能によって異なります。 ポップアップ ウィンドウ、ダイアログ ボックス、プログラム ウィンドウ自体など、そのコンテンツに最適な形式で、ユーザーが期待する内容が表示されます。 たとえば、状態アイコンの状態テキストや、ボリューム コントロールのスライダーを表示できます。

クリックによって発生するポップアップ ウィンドウまたはダイアログ ボックスの配置は、通知領域のクリックの座標の近くに配置する必要があります。 CalculatePopupWindowPosition を使用して、その場所を確認します。

通知を表示せずに通知領域にアイコンを追加するには、 NOTIFYICONDATA のアイコン固有のメンバー (前述) のみを定義し、次に示すように Shell_NotifyIcon を呼び出します。

NOTIFYICONDATA nid = {};
// Do NOT set the NIF_INFO flag.
...                    
Shell_NotifyIcon(NIM_ADD, &nid);

通知領域にアイコンを追加し、 Shell_NotifyIconへの 1 回の呼び出しですべての通知を表示することもできます。 これを行うには、このトピックの手順に進んでください。

NOTIFYICONDATA バージョンを定義する

Windows が進むにつれて、 NOTIFYICONDATA 構造体が拡張され、より多くの機能を定義するためのメンバーが追加されました。 定数は、下位互換性を確保するために、通知領域アイコンで使用する NOTIFYICONDATA のバージョンを宣言するために使用されます。 他の方法で実行する説得力のある理由がない限り、Windows Vista で導入されたNOTIFYICON_VERSION_4バージョンを使用することを強くお勧めします。 このバージョンでは、登録された GUID を使用して通知領域アイコンを識別する推奨機能、優れたコールバック メカニズム、アクセシビリティの向上など、使用可能な機能をすべて提供します。

次の呼び出しでバージョンを設定します。

NOTIFYICONDATA nid = {};
... 
nid.uVersion = NOTIFYICON_VERSION_4;
// Add the icon
Shell_NotifyIcon(NIM_ADD, &nid);
// Set the version
Shell_NotifyIcon(NIM_SETVERSION, &nid);

このShell_NotifyIconの呼び出しでは通知が表示されないことに注意してください。

通知の外観と内容を定義する

通知は、特殊な種類のバルーン ヒント コントロールです。 タイトル、本文、アイコンが含まれています。 ウィンドウと同様に、右上隅に [閉じる] ボタンがあります。 また、コントロール パネルの [通知領域アイコン] 項目を開く [オプション] ボタンも含まれています。これにより、ユーザーはアイコンを表示または非表示にしたり、アイコンなしで通知のみを表示したりできます。

バッテリーの電力が低いことを示す通知バルーンのスクリーン ショット

Shell_NotifyIconへの呼び出しで送信される NOTIFYICONDATA 構造体には、通知領域アイコンと通知バルーン自体の両方を指定する情報が含まれています。 NOTIFYICONDATA を使用して設定できる通知に固有の項目を次に示します。

  • 通知吹き出しに表示するアイコン。通知の種類によって指定されます。 アイコンのサイズは、カスタム アイコンと同様に指定できます。
  • 通知タイトル。 このタイトルは、英語で最大 48 文字にする必要があります (ローカライズに対応するため)。 タイトルは通知の最初の行であり、フォント サイズ、色、および太さを使用して区別されます。
  • 通知の本文で使用するテキスト。 このテキストは、英語で最大 200 文字にする必要があります (ローカライズに対応するため)。
  • 通知をすぐに表示できない場合に破棄する必要があるかどうか。
  • 通知のタイムアウト。 この設定は、システム全体のアクセシビリティ タイムアウト設定を優先して、Windows Vista 以降のシステムでは無視されます。
  • 通知で静かな時間を考慮する必要があるかどうかは、 NIIF_RESPECT_QUIET_TIME フラグを使用して設定します。

注意

IUserNotification インターフェイスと IUserNotification2 インターフェイスは、Shell_NotifyIconのコンポーネント オブジェクト モデル (COM) ラッパーです。 ただし、現時点では、通知領域アイコンを識別するための GUID の使用など、 Shell_NotifyIcon を介して直接使用できる完全なNOTIFYICON_VERSION_4機能は提供されていません。

 

ユーザーの状態を確認する

システムは SHQueryUserNotificationState 関数を使用して、ユーザーがコンピューターから離れているか、プレゼンテーション モードなどの中断できない状態にあるかをチェックします。 システムが通知を表示するかどうかは、この状態によって異なります。

注意

アプリケーションで、Shell_NotifyIconIUserNotification、または IUserNotification2 を使用しないカスタム通知メソッドを使用している場合は、常に SHQueryUserNotificationState を明示的に呼び出して、その時点で通知 UI を表示するかどうかを判断する必要があります。

 

ユーザーが不在時に送信された通知は、表示のためにキューに入れられますが、ユーザーがいつ戻るか、その時点で通知がまだ有効になるのかを知ることができないため、後で通知を再送信することを検討できます。

静かな時間に送信された通知は、表示されていない状態で破棄されます。 設計ガイドラインでは、すべての通知を無視するように求められます。 ユーザーに対する即時の操作は必要ありません。 したがって、通知は重要でないため、静かな時間をオーバーライドする必要があります。

通知を表示する

NOTIFYICONDATA バージョンを設定し、 NOTIFYICONDATA構造体で 通知を定義したら、 Shell_NotifyIcon を呼び出してアイコンを表示します。

  • 通知領域アイコンが存在しない場合は、 Shell_NotifyIcon を呼び出してアイコンを追加します。 これは、一時的なアイコンと一時的でないアイコンの両方に対して行います。

    NOTIFYICONDATA nid = {};
    ...                    
    Shell_NotifyIcon(NIM_ADD, &nid);
    
  • 通知領域アイコンが既に存在する場合は、 Shell_NotifyIcon を呼び出してアイコンを変更します。

    NOTIFYICONDATA nid = {};
    ...                    
    Shell_NotifyIcon(NIM_MODIFY, &nid);
    

次のコードは、 NOTIFYICONDATA データを設定し、 Shell_NotifyIcon経由で送信する例を示しています。 この例では、GUID を使用して通知アイコンを識別します (Windows 7 で推奨)。

// Declare NOTIFYICONDATA details. 
    // Error handling is omitted here for brevity. Do not omit it in your code.
    
    NOTIFYICONDATA nid = {};
    nid.cbSize = sizeof(nid);
    nid.hWnd = hWnd;
    nid.uFlags = NIF_ICON | NIF_TIP | NIF_GUID;
    
    // Note: This is an example GUID only and should not be used.
    // Normally, you should use a GUID-generating tool to provide the value to
    // assign to guidItem.
    static const GUID myGUID = 
    {0x23977b55, 0x10e0, 0x4041, {0xb8, 0x62, 0xb1, 0x95, 0x41, 0x96, 0x36, 0x69}};
    nid.guidItem = myGUID;
    
    // This text will be shown as the icon's tooltip.
    StringCchCopy(nid.szTip, ARRAYSIZE(nid.szTip), L"Test application");
    
    // Load the icon for high DPI.
    LoadIconMetric(hInst, MAKEINTRESOURCE(IDI_SMALL), LIM_SMALL, &(nid.hIcon));
    
    // Show the notification.
    Shell_NotifyIcon(NIM_ADD, &nid) ? S_OK : E_FAIL;

アイコンの削除

アイコンを削除するには (たとえば、通知をブロードキャストするためにアイコンを一時的に追加した場合)、次に示すように Shell_NotifyIconを呼び出します。 この呼び出しには、アイコンを識別する最小限の NOTIFYICONDATA 構造体のみが必要です。

NOTIFYICONDATA nid = {};
...                    
Shell_NotifyIcon(NIM_DELETE, &nid);

注意

アプリケーションをアンインストールしても、その通知領域アイコンは、コントロール パネルの [通知領域アイコン] ページのオプションとして最大 7 日間ユーザーに表示されます。 ただし、行われた変更は影響を受けなくなります。

 

SDK サンプル

Shell_NotifyIconの使用の完全な例については、Windows ソフトウェア開発キット (SDK) の NotificationIcon サンプル サンプルを参照してください。

Shell_NotifyIcon

Shell_NotifyIconGetRect

NOTIFYICONDATA

SHQueryUserNotificationState

IUserNotification

IUserNotification2

タスク バー

タスク バー拡張機能