1. 程式人生 > >一個體驗好的Windows 任務欄縮略圖開發心得

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

-a 然而 問題: ant rar lag mar n) normal

本文來自網易雲社區

作者:孫有軍


前言:

對於一個追求極致體驗的軟件來說,利用好系統的每一點優秀的特性,將會大大提高軟件的品質。 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 任務欄縮略圖開發心得