一个体验好的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+款云产品! 

更多网易研发、产品、运营经验分享请访问网易云社区


相关文章:
【推荐】 Android TV 开发(4)
【推荐】 反射型 DDoS 攻击的原理和防范措施

posted @ 2018-09-27 10:47  网易数帆  阅读(969)  评论(0编辑  收藏  举报