博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个体验好的Windows 任务栏缩略图开发心得
阅读量:5226 次
发布时间:2019-06-14

本文共 2066 字,大约阅读时间需要 6 分钟。

本文来自网易云社区

作者:孙有军

前言:

对于一个追求极致体验的软件来说,利用好系统的每一点优秀的特性,将会大大提高软件的品质。 Windows vista以来任务栏缩略图,及Win + TAB的程序切换预览图的定制也是对软件体验的一个巨大提升,这里我对云音乐中使用到的任务栏缩率图显示专辑封面,并且控制播放歌曲操作的开发做下简单的分享。

缩略图的显示图片和按钮定制:

Windows对缩略图的操作,主要会涉及到DWM  的相关知识,有兴趣的可以详细研究下。 

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);

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

201809271020500ac3c211-7c09-41b2-8dab-238e571891c7.png              

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

20180927102117b8629d73-b069-4e0b-b8ae-38a11dda459e.png  

之所以会造成这样的问题是指定使用图片进行开关的时候,系统会自动把设置的图片作为win+tab程序切换的预览图,并且通过修改其余的参数无法改正。

下面是解决的一种途径:

WIN+TAB 程序预览图定制:

原理是利用  ITaskbarList3可以注册  组成   tabgroup的方式,并且调整  SetTabOrder调整顺序。 win+tab会获取系统已显示的窗口预览图,任务栏显示的则是显示程序中设置。 具体的步骤是:

1. 创建一个窗口用于显示任务栏的缩略图和按钮自定义 hIconWindow,并且设置为隐藏

2. taskbar_list->RegisterTab(  hIconWindow  , hMainWindow); 注册为同一组(如果不隐藏的话,仍是显示两个任务栏图标)

3. taskbar_list->SetTabOrder(  hIconWindow,   hMainWindow  ); 设置tab的顺序, 任务栏预览图是那组内第一个窗口的设置的预览图的, 如果顺序不调整的话,将会出现不可测的情况

4. 设置窗口任务栏缩略图是设置在  hIconWindow上

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

20180927102137c53d20c9-1994-463c-b1be-a80be13366a1.png              

个人感觉比之前的好多了。

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

后记:

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

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

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

相关文章:

【推荐】 
【推荐】 

转载于:https://www.cnblogs.com/163yun/p/9711867.html

你可能感兴趣的文章
js 模拟滚动条
查看>>
PHP 导出 Excell
查看>>
关于springmvc json交互产生的406错误
查看>>
python之-框架
查看>>
Gradle多项目构建
查看>>
Java基础教程——网络基础知识
查看>>
c++文件的读写
查看>>
[Web] 如何实现Web服务器和应用服务器的负载均衡?
查看>>
创建文件夹命令
查看>>
自己到底要的是什么
查看>>
this 指向
查看>>
Kruskal基础最小生成树
查看>>
【RabbitMQ】 Java简单的实现RabbitMQ
查看>>
BZOJ.4819.[SDOI2017]新生舞会(01分数规划 费用流SPFA)
查看>>
ubuntu 14.04 安装搜狗拼音输入法
查看>>
c#中 uint--byte[]--char[]--string相互转换汇总
查看>>
- C#编程大幅提高OUTLOOK的邮件搜索能力!
查看>>
InstallShield Limited Edition for Visual Studio 2013 图文教程(教你如何打包.NET程序)
查看>>
浅谈算法和数据结构: 一 栈和队列
查看>>
[WebMatrix] 如何将SQL Compact 4.0 移转至SQL Server 2008 Express
查看>>