最近項目需要做個工作列快速啟動的工具列,查了一下資料並不多,所以記錄了一些東西,供參考。
用過 Thinkpad 筆記本都會發現它有個電源指標,你可以通過右鍵點擊工作列 -> 工具列 -> 電源管理器來切換,這個東西又叫 Desk Band,屬於工作列擴充,事實上,微軟官方已經不建議在 Windows 7 中使用此特性,微軟推薦使用 Thumbnail Toolbars 來替換他,Windows 7 工作列新特性,參考:http://msdn.microsoft.com/en-us/library/windows/desktop/dd378460%28v=vs.85%29.aspx,但事實上這個東西很多時候其實還是很有用的。
Desk Band 在 Windows XP 上,需要實現
IDeskBand 介面,Windows Vista 及 Windows 7則需要實現
IDeskBand2 介面,以及實現相應的視窗顯示。
Code Project 有幾篇不錯的文章:
.Net 實現的,這個在 Windows7 上有問題,具體我沒有深入研究。
Extending Explorer with Band Objects using .NET and Windows Forms
http://www.codeproject.com/Articles/2219/Extending-Explorer-with-Band-Objects-using-NET-and
ATL COM的,這個不錯:
Shell Extensibility - Explorer Desk Band, Tray Notification Icon et al.
http://www.codeproject.com/Articles/39189/Shell-Extensibility-Explorer-Desk-Band-Tray-Notifi
大致步驟如下:
1. 建立一個新的 ATL Project Solution;
2. 添加一個新的 ATL Object,並實現 IDeskBand2 介面;
3. 實現一個視窗類別用於工具列的顯示,並在相應的介面實現中進行視窗的建立、顯示、隱藏等處理;
4. 通過 BEGIN_CATEGORY_MAP 宏註冊 CATID_DeskBand 組件類別。
5. 編譯註冊。
關於註冊以及顯示:
1. 註冊方法在所有 Windows 版本上都是一樣的,但通過代碼在工作列添加 Desk Band 在 Windows XP 和 Vista及Windows 7上是有區別的;
2. 可以在程式中實現添加和移除 Desk Band,但宿主程式不能關閉,因為視窗是在宿主程式建立的;
3. 如果想實現脫離應用程式獨立出現,在 Windows7上就有警告,我看到有朋友用 Windows Hook 自動點彈出框上的按鈕,也有朋友通過寫註冊表的方法(Desk Band 註冊表是二進位的,Windows升級後也不見得相容),總之是沒有官方的方法,不知道Thinkpad 電源管理器怎麼做的;
4. 具體方法上面的樣本中都有代碼。
其他一些 COM ATL 相關的參考資料:
1. COM 物件模型:
2. Component Categories
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686630%28v=vs.85%29.aspx
3. Registering Shell Extension Handlers
http://msdn.microsoft.com/en-us/library/windows/desktop/cc144110%28v=vs.85%29.aspx
4. IMPLEMENTED_CATEGORY
http://msdn.microsoft.com/en-us/library/z4z0at8a%28v=vs.80%29.aspx
5. ShellExView v1.68 - Shell Extensions Manager
http://www.nirsoft.net/utils/shexview.html
6. RGS
The ATL Registry Component (Registrar)
http://msdn.microsoft.com/en-us/library/49tet6k7%28VS.80%29.aspx
Registry Map for RGS files
http://www.codeproject.com/Articles/6319/Registry-Map-for-RGS-files
7. IDL
MIDL Language Reference
http://msdn.microsoft.com/en-us/library/aa367088.aspx
Basics of an IDL file
http://www.codeproject.com/Articles/19605/Basics-of-an-IDL-file
IDL 詳解
http://blog.csdn.net/weiqubo/article/details/6990697
COM 代理與存根
http://www.cnblogs.com/zhy113/archive/2010/10/29/1864156.html