一個體驗好的Windows 任務欄縮略圖開發心得

本文來自網易雲社區web

做者:孫有軍windows


前言:動畫

對於一個追求極致體驗的軟件來講,利用好系統的每一點優秀的特性,將會大大提升軟件的品質。 Windows vista以來任務欄縮略圖,及Win + TAB的程序切換預覽圖的定製也是對軟件體驗的一個巨大提高,這裏我對雲音樂中使用到的任務欄縮率圖顯示專輯封面,而且控制播放歌曲操做的開發作下簡單的分享。spa


縮略圖的顯示圖片和按鈕定製:code

Windows對縮略圖的操做,主要會涉及到DWM  (Desktop Window Manager 桌面窗口管理器)的相關知識,有興趣的能夠詳細研究下。 
orm

1)打開縮略圖顯示圖片的屬性設置:blog

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)實際設置圖片:ci

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+款雲產品! 

更多網易研發、產品、運營經驗分享請訪問網易雲社區


相關文章:
【推薦】 Android TV 開發(4)
【推薦】 反射型 DDoS 攻擊的原理和防範措施

相關文章
相關標籤/搜索