一个体验好的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 攻击的原理和防范措施
一个体验好的Windows 任务栏缩略图开发心得的更多相关文章
- 利用C# Winform做Windows系统任务栏
最近公司做一个考试系统,需要一个答题栏,要求:占用屏幕上方一部分区域,而且始终置顶,当其他窗口最大化时"答题栏"始终置前并且不遮挡最大化窗口的任何部分!就像windows任务栏一样 ...
- Windows Phone 8初学者开发—第16部分:使用应用程序栏
原文 Windows Phone 8初学者开发—第16部分:使用应用程序栏 原文地址: http://channel9.msdn.com/Series/Windows-Phone-8-Develop ...
- .NET Core多平台开发体验[3]: Linux (Windows Linux子系统)
如果想体验Linux环境下开发和运行.NET Core应用,我们有多种选择.一种就是在一台物理机上安装原生的Linux,我们可以根据自身的喜好选择某种Linux Distribution,目前来说像R ...
- [转帖]第二个显示屏上禁用Windows任务栏
http://os.51cto.com/art/201812/589207.htm 这个过程非常简单,你可以在一分钟内摆脱第二个屏幕上的任务栏. 您需要做的就是按照以下步骤操作: --打开设置,然后转 ...
- 隐藏windows任务栏中的窗口显示
在实际应用中遇到类似下列需要: 隐藏windows窗口,在windows任务栏中窗口不可见,但应用程序在后台运行. windows应用程序的窗口默认会在任务栏中添加一个可见的窗口项,方便用户操作和在不 ...
- 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
今年微软Build 2016大会最让开发人员兴奋的消息之一,就是在Windows上可以原生运行Linux bash,对开发人员来说,这是一个喜闻乐见的消息. 1 安装 你必须安装开发者预览版本,才能使 ...
- C#制作Windows service服务系列二:演示一个定期执行的windows服务及调试(windows service)
系列一: 制作一个可安装.可启动.可停止.可卸载的Windows service(downmoon原创) 系列二:演示一个定期执行的windows服务及调试(windows service)(down ...
- windows任务栏消失
windows任务栏消失,快捷键打开任务管理器,新建任务explorer.exe
- [置顶] 如何把你的笔记本电脑变成一个Wi-Fi路由器在Windows 7 & 8?
翻译自:http://www.hakanakdag.net/windows/how-to-create-wireless-ad-hoc-internet-connection-in-windows-8 ...
随机推荐
- mybatis插入返回主键
useGeneratedKeys="true" keyProperty="id" <insert id="insertReturnPrimar ...
- 一.在Linux中for和cat遍历文件内容出现no space
以前使用for var in file方式逐行读取文件内容的时候,都没有出现问题,但是今天使用如下代码,会出现“no space” ,目标数据文件内容为6.8M, # 写入临时文件,第一行不能写入 f ...
- PHP----练习------球队列表
题目:页面上有一个ul球队列表当鼠标移动到某个li上的时候改行背景颜色变红,当点击某个li的时候,让该li之前的所有li背景色变黄,之后的所有li背景色变蓝.自己不变色. <!DOCTYPE h ...
- sublime text 插件及快捷键的使用
安装插件准备步骤: 1.先安装管理插件,插件必备:package control 1.按ctrl+` 调出console 2.在底部代码行粘贴以下代码并回车: import urllib2,os;pf ...
- 学习openGL一——配置环境
openGL支持很多语言,C#, Java, Python, 和Lua.如果你没有使用C/C++,你必须下载和安装一个openGL包或库. 如果你使用了C/C++,你必须先建立一个编译环境,visua ...
- 图片左右滚动控件(带倒影)——重写Gallery
转http://blog.csdn.net/ryantang03/article/details/8053643 今天在网上找了些资料,做了一个图片左右滚动的Demo,类似幻灯片播放,同时,图片带倒影 ...
- HDU4825 Xor Sum
题意 给定一个集合后, 求一组查询中每个数和集合中任一元素异或的最大值. 题解 异或的规律是这样的 1 ^ 1 = 0, 0 ^ 0 = 0, 1 ^ 0 = 1, 0 ^ 1 = 1, 而最大值即是 ...
- 10 OCP知识点讲解 之 什么是Buffer Cache?
OCP知识点讲解 之 什么是Buffer Cache? 分类: Oracle 2012-06-22 17:36:54 一.Buffer cache作用: Buffer cache是Oracle建立 ...
- ios之coredata(一)
下面开始学习一下CoreData. Core Data不是一个关系型数据库,也不是关系型数据库管理系统(RDBMS).Core Data 为数据变更管理.对象存储.对象读取恢复的功能提供了支持. 它可 ...
- angular动态绑定样式以及改变UI框架样式的方法
一:angular动态绑定样式 举个栗子: <tr *ngFor="let dataTr of tableData;let i = index" [formGroupName ...