首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

系統托盤程式設計完全指南 (2):TaskbarCreated 自動重建托盤圖示

     編輯:關於VC++

前一篇建立了基本托盤功能,但存在嚴重缺陷:Windows Explorer 異常終止後重啟,托盤圖示消失不見,使用者必須重啟應用程式才能恢復。本文解決此問題,核心在於攔截 TaskbarCreated 廣播訊息並重新註冊圖示。

問題根源

Explorer 管理工作列(含通知區域)。當 Explorer 進程終止(使用者在工作管理員「結束程序」、或系統更新重啟),所有托盤圖示隨之消失。Explorer 重啟後,會向所有最上層視窗廣播已註冊訊息 TaskbarCreated。應用程式若處理此訊息並再次呼叫 Shell_NotifyIcon(NIM_ADD, ...),圖示即可自動恢復。

MFC 實作:註冊訊息與 ON_REGISTERED_MESSAGE


// 全域/靜態變數保存訊息 ID
const UINT WM_TASKBARCREATED = ::RegisterWindowMessage(_T("TaskbarCreated"));

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    ON_REGISTERED_MESSAGE(WM_TASKBARCREATED, OnTaskBarCreated)
END_MESSAGE_MAP()

LRESULT CMainFrame::OnTaskBarCreated(WPARAM, LPARAM)
{
    VERIFY(InstallIcons()); // 重新安裝圖示
    return 0;
}

InstallIcons() 需獨立實作(而非直接在 OnCreate 內寫死),因啟動時與重建時均需呼叫。

CTrayIcon 類別增強:自動攔截 TaskbarCreated

為免每個專案重複撰寫攔截碼,CTrayIcon 內建處理:

  • 使用 CSubclassWnd(視窗程序子類化工具類)掛鉤最上層父視窗程序。
  • 收到 TaskbarCreated 時自動呼叫虛擬函式 OnTaskBarCreate(),預設實作為重新安裝圖示。
  • 開發者只需在 CMainFrame::OnCreate 中:

m_trayIcon.SetNotificationWnd(this, WM_MY_TRAY_NOTIFICATION);
m_trayIcon.SetIcon(IDI_MYICON); // 內部自動啟動子類化攔截

CSubclassWnd 運作原理

CSubclassWnd 透過 SetWindowLong(GWL_WNDPROC) 替換視窗程序,先於 MFC 訊息映射處理訊息。流程:

  1. CTrayIcon::SetNotificationWnd 呼叫 GetTopLevelParent() 取得框架視窗。
  2. 安裝 CSubclassWnd Hook,攔截所有訊息。
  3. 收到 WM_TASKBARCREATED → 呼叫 CTrayIcon::OnTaskBarCreate() → 重建圖示。
  4. 其他訊息傳遞原視窗程序(MFC 繼續處理)。

此技巧極為通用,亦可用於攔截 WM_QUERYNEWPALETTE、WM_SYSCOLORCHANGE 等僅送往最上層視窗的系統廣播。

測試方法:模擬 Explorer 異常重啟

  1. 啟動範例程式 TrayTest2.exe,確認托盤有圖示。
  2. 開啟工作管理員(Ctrl+Alt+Del)→ 程序頁籤 → 選取「explorer.exe」→ 「結束程序」。
  3. 出現關機對話框時按「取消」。
  4. 等待數秒,再次「結束程序」強制終止 Explorer。
  5. Explorer 自動重啟(或從「執行」輸入 explorer)。
  6. 觀察:本文範例程式托盤圖示自動恢復;第 1 篇範例則永久消失。

同樣適用於 WinNT/2000/XP(需安裝 IE4+)。

原始碼關鍵點

  • CTrayIcon::CTrayHook::WindowProc — 子類化視窗程序,攔截 TaskbarCreated。
  • CTrayIcon::OnTaskBarCreate() — 虛擬函式,可覆寫自訂重建邏輯(如動態圖示、狀態恢復)。
  • CTrayIcon::SetNotificationWnd — 整合通知視窗設定與子類化安裝。

系列進度

  1. ✅ 基礎托盤、CTrayIcon 封裝、右鍵選單、雙擊預設命令
  2. ✅ TaskbarCreated 自動重建(本文)
  3. ⏭️ 下一篇:氣球提示 Balloon Tips (Win2000/XP)

掌握此機制,托盤程式即具備生產級穩健性。完整原始碼請下載附件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved