通知和通知區域
通知區域是任務列的一部分,可提供通知和狀態的暫存來源。 它也可以用來顯示桌面上沒有狀態的系統和程式功能的圖示,例如電池電量、音量控制及網路狀態。 通知區域歷來稱為系統匣或狀態區域。
本主題包含下列幾節:
通知和通知區域指導方針
如需使用通知和通知區域的最佳做法,請參閱 Windows 用戶體驗互動指導方針的通知和通知區域一節。 目標是透過適當使用通知來提供用戶權益,而不會令人惱火或分心。
通知區域不適用於必須立即採取行動的重要資訊。 它也不適用於快速程式或命令存取。 從 Windows 7 開始,大部分功能都是透過應用程式的任務欄按鈕來完成。
Windows 7 可讓使用者在選擇時隱藏應用程式的所有通知,因此深思熟慮的通知設計和使用會傾斜使用者,讓使用者繼續顯示應用程式。 通知是中斷;確保它們值得。
Windows 7 引進「安靜時間」的概念。 在新的使用者第一次登入其帳戶或操作系統升級或全新安裝之後,第一次或第一次登入帳戶之後,系統會將無訊息時間定義為第一小時。 這次會放在一邊,讓用戶能夠探索並熟悉新的環境,而不會干擾通知。 在此期間,不應該傳送或顯示大部分的通知。 例外狀況包括用戶預期會看到以回應使用者動作的意見反應,例如,當使用者插入USB裝置或列印檔時。 本主題稍後會討論有關安靜時間的 API 細節。
建立和顯示通知
本主題的其餘各節概述要遵循的基本程式,以向用戶顯示應用程式通知。
新增通知圖示
若要顯示通知,您必須在通知區域中有圖示。 在某些情況下,例如Microsoft Communicator 或電池電量,該圖示將已經存在。 不過,在許多其他情況下,只要需要顯示通知,您才會將圖示新增至通知區域。 不論是哪一種情況,都是使用 Shell_NotifyIcon 函式來完成。 Shell_NotifyIcon可讓您在通知區域中新增、修改或刪除圖示。
當圖示新增至 Windows 7 上的通知區域時,預設會新增至通知區域的溢位區段。 此區域包含作用中但未顯示在通知區域中的通知區域圖示。 只有使用者可以將圖示從溢位升階到通知區域,但在某些情況下,系統可以暫時將圖示升階到通知區域做為簡短預覽(不到一分鐘)。
注意
用戶應該有他們想要在其通知區域中看到哪些圖標的最終決定權。 在通知區域中安裝非暫時性圖示之前,應該要求使用者取得許可權。 也應該提供選項(通常是雖然其快捷方式功能表),以從通知區域移除圖示。
呼叫中傳送給 Shell_NotifyIcon的NOTIFYICONDATA結構包含指定通知區域圖示和通知本身的資訊。 以下是可透過 NOTIFYICONDATA 設定之通知區域圖示本身的特定專案。
- 從中擷取圖標的資源。
- 圖示的唯一標識碼。
- 圖示工具提示的樣式。
- 通知區域中圖示的狀態(隱藏、共用或兩者)。
- 與圖示相關聯的應用程式視窗句柄。
- 回呼訊息標識碼,可讓圖示與相關聯的應用程式視窗傳達圖示周框和氣球通知內發生的事件。 圖示的周框可以透過 Shell_NotifyIconGetRect擷取。
通知區域中的每個圖示都可以透過兩種方式來識別:
- 在登錄中宣告圖示的 GUID。 這是 Windows 7 和更新版本上慣用的方法。
- 與通知區域圖示相關聯的視窗句柄,加上應用程式定義的圖示標識碼。 此方法用於 Windows Vista 和更早版本。
通知區域中的圖示可以有工具提示。 工具提示可以是標準工具提示(慣用)或應用程式繪製的快顯UI。 雖然不需要工具提示,但建議使用。
通知區域圖示應該是高 DPI 感知。 應用程式應該在其資源檔中同時提供 16x16 像素圖示和 32x32 圖示,然後使用 LoadIconMetric 確保正確載入並調整正確的圖示。
負責通知區域圖示的應用程式應該處理該圖示的滑鼠按一下。 當使用者以滑鼠右鍵按下圖示時,應該會顯示一般的快捷方式功能表。 不過,使用滑鼠左鍵按兩下的結果會隨著圖示的功能而有所不同。 它應該會顯示使用者預期在最適合該內容的形式中看到的內容:彈出視窗、對話框或程序視窗本身。 例如,它可以顯示狀態圖示的狀態文字,或音量控件的滑桿。
彈出視窗或對話框的位置,應該放在通知區域中按兩下的座標附近。 使用 CalculatePopupWindowPosition 來判斷其位置。
圖示可以新增至通知區域,而不顯示通知,方法是只定義 NOTIFYICONDATA 的圖示特定成員(如上所述)和呼叫Shell_NotifyIcon,如下所示:
NOTIFYICONDATA nid = {};
// Do NOT set the NIF_INFO flag.
...
Shell_NotifyIcon(NIM_ADD, &nid);
您也可以將圖示新增至通知區域,並在一次呼叫中顯示通知,Shell_NotifyIcon。 若要這樣做,請繼續進行本主題中的指示。
定義 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) 包裝函式。 不過,目前,它們不會提供透過 直接Shell_NotifyIcon 取得的完整NOTIFYICON_VERSION_4功能,包括使用 GUID 來識別通知區域圖示。
檢查用戶狀態
系統會使用 SHQueryUserNotificationState 函式來檢查使用者是否在無訊息時間、遠離計算機,或處於不中斷狀態,例如簡報模式。 系統是否顯示您的通知取決於此狀態。
注意
如果您的應用程式使用不使用 Shell_NotifyIcon、IUserNotification 或 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);
注意
卸載應用程式時,其通知區域圖示仍可向用戶顯示為 控制台 [通知區域圖示] 頁面的 [通知區域圖示] 頁面,最多七天。 不過,所做的任何變更都不會有任何作用。
SDK 範例
如需使用Shell_NotifyIcon的完整範例,請參閱 Windows 軟體開發工具包 (SDK) 中的 NotificationIcon 範例。
相關主題