一個體驗好的Windows 任務欄縮略圖開發心得
本文來自網易雲社區
作者:孫有軍
前言:
對於一個追求極致體驗的軟件來說,利用好系統的每一點優秀的特性,將會大大提高軟件的品質。 Windows vista以來任務欄縮略圖,及Win + TAB的程序切換預覽圖的定制也是對軟件體驗的一個巨大提升,這裏我對雲音樂中使用到的任務欄縮率圖顯示專輯封面,並且控制播放歌曲操作的開發做下簡單的分享。
縮略圖的顯示圖片和按鈕定制:
Windows對縮略圖的操作,主要會涉及到DWM (Desktop Window Manager 桌面窗口管理器)的相關知識,有興趣的可以詳細研究下。
1)打開縮略圖顯示圖片的屬性設置:
HRESULT WINAPI DwmSetWindowAttribute( HWND hwnd, DWORD dwAttribute, _In_ LPCVOID pvAttribute, DWORD cbAttribute );
指定窗口縮略圖顯示圖片時必須打開該窗口的 DWMWA_HAS_ICONIC_BITMAP,DWMWA_FORCE_ICONIC_REPRESENTATION的屬性設置,否則任務欄縮略圖將無法生效。簡單的示例代碼:
BOOL switch= TRUE;
DwmSetWindowAttribute(hwnd, DWMWA_HAS_ICONIC_BITMAP,
&switch, sizeof(truth));
DwmSetWindowAttribute(hwnd, DWMWA_FORCE_ICONIC_REPRESENTATION,
&switch, sizeof(truth));
DWMWA_HAS_ICONIC_BITMAP表示窗口提供bitmap
DWMWA_FORCE_ICONIC_REPRESENTATION表示窗口強制使用bitmap展示縮略圖。
2)實際設置圖片:
HRESULT WINAPI DwmSetIconicThumbnail( _In_ HWND hwnd, _In_ HBITMAP hbmp, _In_ DWORD dwSITFlags );
可以指定任意的圖片了。 但是要註意的是它是由圖片大小限制的,一般是小於等於120*120 WM_DWMSENDICONICTHUMBNAIL 這個的窗口消息回調用會回調預覽圖片的大小的。
註意可能的問題:設置超過限制大小的圖片就無法顯示。但是WM_DWMSENDICONICTHUMBNAIL 這個回調並不會一開始就進行回調的,可能需要多次嘗試,特別是win10的機器上,縮略圖設置需要多次嘗試
3)按鈕定制:
縮略圖上的按鈕是通過獲取COM組件 CLSID_TaskbarList得到ITaskbarList 實例 進行設置
taskbarlist->ThumbBarAddButtons(hwnd, btn_index, thumb_btn); taskbarlist ->ThumbBarUpdateButtons(hwnd, btn_index ,thumb_btn);
這樣簡單的縮略圖預覽就成型了:
然而文章到這裏並未結束,當我們用win+tab切換程序時 你會看到切換動畫裏面的圖片竟然就是一張圖片, 讓我們看看我們的程序有多麽的突兀,如果在眾多的窗口裏面那麽久顯的更加怪異了:
之所以會造成這樣的問題是指定使用圖片進行開關的時候,系統會自動把設置的圖片作為win+tab程序切換的預覽圖,並且通過修改其余的參數無法改正。
下面是解決的一種途徑:
WIN+TAB 程序預覽圖定制:
原理是利用 ITaskbarList3可以註冊 RegisterTab組成 tabgroup的方式,並且調整 SetTabOrder調整順序。 win+tab會獲取系統已顯示的窗口預覽圖,任務欄顯示的則是顯示程序中設置。 具體的步驟是:
1. 創建一個窗口用於顯示任務欄的縮略圖和按鈕自定義 hIconWindow,並且設置為隱藏
2. taskbar_list->RegisterTab( hIconWindow , hMainWindow); 註冊為同一組(如果不隱藏的話,仍是顯示兩個任務欄圖標)
3. taskbar_list->SetTabOrder( hIconWindow, hMainWindow ); 設置tab的順序, 任務欄預覽圖是那組內第一個窗口的設置的預覽圖的, 如果順序不調整的話,將會出現不可測的情況
4. 設置窗口任務欄縮略圖是設置在 hIconWindow上
那麽就完成了現在這種效果
個人感覺比之前的好多了。
可能的問題當窗口都隱藏是,再顯示縮略圖窗口的一些按鈕會丟失,需要重新進行設置
後記:
實現以上方式,可能有多重途徑,歡迎探討或者指出錯誤
網易雲免費體驗館,0成本體驗20+款雲產品!
更多網易研發、產品、運營經驗分享請訪問網易雲社區
相關文章:
【推薦】 【大數據之數據倉庫】HAWQ versus GreenPlum
一個體驗好的Windows 任務欄縮略圖開發心得