一个体验好的Windows 任务栏缩略图开发心得

摘要:
自Windowsvista以来,Win+TAB的任务栏缩略图和程序切换预览的定制也大大改善了软件体验。在这里,我简单地分享了云音乐中用于显示专辑封面和控制歌曲播放的任务栏缩略图的开发。1) 打开缩略图显示图片的属性设置:HRESULTWINAPIDwmSetWindowAttribute;指定当窗口缩略图显示图片时必须打开的窗口的DWMWA。Win+选项卡将获得系统显示的窗口预览,任务栏将显示显示程序中的设置。

本文来自网易云社区

作者:孙有军


前言:

对于一个追求极致体验的软件来说,利用好系统的每一点优秀的特性,将会大大提高软件的品质。 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);

这样简单的缩略图预览就成型了:

一个体验好的Windows 任务栏缩略图开发心得第1张              

然而文章到这里并未结束,当我们用win+tab切换程序时 你会看到切换动画里面的图片竟然就是一张图片, 让我们看看我们的程序有多么的突兀,如果在众多的窗口里面那么久显的更加怪异了:

一个体验好的Windows 任务栏缩略图开发心得第2张  

之所以会造成这样的问题是指定使用图片进行开关的时候,系统会自动把设置的图片作为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上

那么就完成了现在这种效果

一个体验好的Windows 任务栏缩略图开发心得第3张              
个人感觉比之前的好多了。

可能的问题当窗口都隐藏是,再显示缩略图窗口的一些按钮会丢失,需要重新进行设置 


后记:

实现以上方式,可能有多重途径,欢迎探讨或者指出错误



网易云免费体验馆,0成本体验20+款云产品! 

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


相关文章:
【推荐】 【大数据之数据仓库】HAWQ versus GreenPlum

免责声明:文章转载自《一个体验好的Windows 任务栏缩略图开发心得》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇在asp.net webform中的 gridview 里面的一些基本操作记一次Hvv中遇到的API接口泄露而引起的一系列漏洞下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

照片上传(缩略图实现)

1.获取所有的提交到服务器的文件集合 HttpFileCollection fileColl= Request.Files; 2.取得一个文件(这里是一张照片)     HttpPostedFile pic = fileColl[0]; 3.判断文件是否为空     1.获取服务器存放图片的物理路径(Server.MapPath)        strin...

微信分享连接个别手机、ios转发不显示图片的,缩略图不出来

像上面这种,微信分享后,打开是这样的。显示不了缩略图 解决方法: 在我们的网站网页 html代码中的<body>之后(也就是网站的第一张图片)增加<img src="http://singrr.com/wm/img/logo.jpg" /> 在body下面加 后缀名为jpg的 <img src="https://www.sh...

倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-T_AmsNetID是什么

该参数是包含六个数字类似于IP地址的字符串形式,例如"1.1.1.2.7.1",如果为空字符串,则默认使用本机的AmsNetID 你可以右击贝福的图标,然后点击About查看当前本机的ID   TC3修改TwinCAT AMS NET地址: 右击任务栏中TwinCAT图标,Router,Change AMS NetId,然后重新输入  ...

QT窗口置顶/真透明/背景模糊/非矩形/跳过任务栏分页器/无边框/无焦点点击/焦点穿透

qt 窗口置顶/真透明/背景模糊/非矩形/跳过任务栏分页器/无边框/无焦点点击/焦点穿透窗口置顶qt 里是 setWindowFlags(Qt::WindowStaysOnTopHint)kde 里是 KWindowSystem::setState(winId(), NET::KeepAbove)这样的置顶窗口不会处于全屏窗口的上方,如果需要真正的置顶,s...

C++隐藏任务栏图标

在VC编程中,有时候我们需要将我们的程序在任务栏上的显示隐藏起来,我试过几种方法,下面我介绍一下我知道的三种方法。   第一种方法是设置窗口WS_EX_TOOLWINDOW扩展样式,通过在OnInitDialog函数中添加如下代码:   ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);   ModifySty...

Win10系统,怎样将文件夹固定到开始屏幕/任务栏?

转载自百度经验:Win10系统,怎样将文件夹固定到开始屏幕/任务栏-百度经验 (baidu.com) 当我们将软件快捷方式、文件夹、文件等一股脑放在电脑桌面上时,桌面就会变得凌乱而不美观,从而影响上网的心情和做事的效率,其实我们可以将常用的文件夹、软件等放到“开始”屏幕或任务栏上,这样既保证了打开的便捷性,又使电脑桌面变得干净美观。 工具/原料...