用戶可透過桌面右鍵 →「活動桌面」→「按 Web 頁查看」啟用/停用活動桌面。如何在程式中:
重要警示:修改用戶桌面設定屬敏感操作,務必經用戶明確同意,以醒目提示確認(如「確定要啟用活動桌面嗎?」),尊重用戶偏好。
IActiveDesktop主要方法:
| 方法 | 功能 |
|---|---|
SetDesktopItemOptions | 啟用/停用活動桌面 (需配合 ApplyChanges) |
GetDesktopItemOptions | 取得當前選項狀態 |
ApplyChanges | 套用變更 (AD_APPLY_REFRESH) |
GetWallpaper/SetWallpaper | 取得/設定牆紙 (僅活動桌面模式) |
AddDesktopItem/RemoveDesktopItem | 管理桌面項目 (HTML、圖片、ActiveX 等) |
GetDesktopItemOptions | 檢查活動桌面開關狀態 |
IActiveDesktop* pAD;
HRESULT hr = ::CoCreateInstance(
CLSID_ActiveDesktop,
NULL, // 不支援聚合
CLSCTX_INPROC_SERVER,
IID_IActiveDesktop,
(void**)&pAD
);
// 記得在啟動代碼 (如 InitInstance) 中呼叫 CoInitialize(NULL)
COMPONENTSOPT opt;
opt.dwSize = sizeof(opt);
opt.fActiveDesktop = TRUE;
opt.fEnableComponents = TRUE;
HRESULT hr = pAD->SetDesktopItemOptions(&opt, 0);
// 關鍵:必須套用變更!
pAD->ApplyChanges(AD_APPLY_REFRESH);
文檔未明確說明需呼叫 ApplyChanges,導致設定不生效的常見坑。
IActiveDesktop::GetDesktopItemOptions
COMPONENTSOPT opt;
opt.dwSize = sizeof(opt);
pAD->GetDesktopItemOptions(&opt);
BOOL bEnabled = opt.fActiveDesktop;
SHGetSettings (推薦,更可靠)
SHELLFLAGSTATE shfs;
SHGetSettings(&shfs, SSF_DESKTOPHTML);
BOOL bADEnabled = shfs.fDesktopHTML;
SHGetSettings 無需 COM 初始化,直接讀取 Shell 狀態旗標。對應旗標:
| 旗標 | 含義 | 掩碼 |
|---|---|---|
fDesktopHTML | 活動桌面已啟用 | SSF_DESKTOPHTML (0x00000200) |
fShowAllObjects | 顯示所有檔案 | SSF_SHOWALLOBJECTS (0x00000001) |
fShowExtensions | 顯示副檔名 | SSF_SHOWEXTENSIONS (0x00000002) |
fWin95Classic | 經典視圖 | SSF_WIN95CLASSIC (0x00000400) |

WM_SETTINGCHANGE用戶透過桌面選單或屬性對話框切換活動桌面時,Windows 廣播 WM_SETTINGCHANGE:
wParam = 0
lParam = "ShellState" (字串指標)
視窗程序處理:
void CMainFrame::OnSettingChange(UINT uFlags, LPCTSTR pszSection) {
if (pszSection && _tcscmp(pszSection, _T("ShellState")) == 0) {
// 活動桌面狀態已變更,執行回應邏輯
}
CFrameWnd::OnSettingChange(uFlags, pszSection);
}
註冊表鍵:HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\ShellState。廣播機制同 WM_WININICHANGE (兩者 #define 值相同)。

CActiveDesktop隱藏 COM 細節,使用 CComQIPtr 智慧指標確保正確性:
CActiveDesktop ad;
if (!ad.IsEnabled())
ad.Enable(TRUE); // 啟用
原始碼簡潔,未封裝所有 IActiveDesktop 功能,可自行擴展。
IActiveDesktop 同步 Bug現象:呼叫 SetDesktopItemOptions + ApplyChanges 後,立即用 GetDesktopItemOptions 讀取,回傳舊狀態 (開讀關、關讀開)。
原因分析:ApplyChanges 更新註冊表 → 廣播 WM_SETTINGCHANGE → 之後 才更新內部狀態。訊息處理時讀取仍為舊值。
解決方案:改用 SHGetSettings,實測其回傳狀態即時正確,不受此 Bug 影響。

功能:接收 WM_SETTINGCHANGE 顯示提示、透過 CActiveDesktop 切換狀態、即時顯示當前狀態 (採 SHGetSettings)。
IActiveDesktop::SetDesktopItemOptions + ApplyChanges(AD_APPLY_REFRESH)。SHGetSettings(&shfs, SSF_DESKTOPHTML),避開 IActiveDesktop 同步 Bug。WM_SETTINGCHANGE,檢查 lParam == "ShellState"。