本文来自网易云社区

作者:孙有军

前言:

对于一个追求极致体验的软件来说,利用好系统的每一点优秀的特性,将会大大提高软件的品质。 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 任务栏缩略图开发心得的更多相关文章

  1. 利用C# Winform做Windows系统任务栏

    最近公司做一个考试系统,需要一个答题栏,要求:占用屏幕上方一部分区域,而且始终置顶,当其他窗口最大化时"答题栏"始终置前并且不遮挡最大化窗口的任何部分!就像windows任务栏一样 ...

  2. Windows Phone 8初学者开发—第16部分:使用应用程序栏

    原文 Windows Phone 8初学者开发—第16部分:使用应用程序栏 原文地址:  http://channel9.msdn.com/Series/Windows-Phone-8-Develop ...

  3. .NET Core多平台开发体验[3]: Linux (Windows Linux子系统)

    如果想体验Linux环境下开发和运行.NET Core应用,我们有多种选择.一种就是在一台物理机上安装原生的Linux,我们可以根据自身的喜好选择某种Linux Distribution,目前来说像R ...

  4. [转帖]第二个显示屏上禁用Windows任务栏

    http://os.51cto.com/art/201812/589207.htm 这个过程非常简单,你可以在一分钟内摆脱第二个屏幕上的任务栏. 您需要做的就是按照以下步骤操作: --打开设置,然后转 ...

  5. 隐藏windows任务栏中的窗口显示

    在实际应用中遇到类似下列需要: 隐藏windows窗口,在windows任务栏中窗口不可见,但应用程序在后台运行. windows应用程序的窗口默认会在任务栏中添加一个可见的窗口项,方便用户操作和在不 ...

  6. 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!

    今年微软Build 2016大会最让开发人员兴奋的消息之一,就是在Windows上可以原生运行Linux bash,对开发人员来说,这是一个喜闻乐见的消息. 1 安装 你必须安装开发者预览版本,才能使 ...

  7. C#制作Windows service服务系列二:演示一个定期执行的windows服务及调试(windows service)

    系列一: 制作一个可安装.可启动.可停止.可卸载的Windows service(downmoon原创) 系列二:演示一个定期执行的windows服务及调试(windows service)(down ...

  8. windows任务栏消失

    windows任务栏消失,快捷键打开任务管理器,新建任务explorer.exe

  9. [置顶] 如何把你的笔记本电脑变成一个Wi-Fi路由器在Windows 7 & 8?

    翻译自:http://www.hakanakdag.net/windows/how-to-create-wireless-ad-hoc-internet-connection-in-windows-8 ...

随机推荐

  1. OSMboxPost()

    1.向邮箱发送一则消息 2.原型:INT8U OSMboxPost(OS_EVENT *pevent, void *msg) 3. pevent: 消息邮箱指针(ECB指针) msg:   消息指针 ...

  2. 点击HTML页面问号出现提示框

    本demo的功能:点击页面按钮在其边缘出现提示信息,点击页面任何一处则消失. 如下图: 1.所需插件: jquery插件: layer插件: 2.HTML内容: ==注意==: class=" ...

  3. springBoot+mybatisPlus小demo

    项目介绍:采用restful api进行接口规范 / 项目框架SpringBoot+mybatis Plus / 采用mysql进行数据存储 / 采用swaggerUI进行前后端业务分离式开发. 开发 ...

  4. DQL-常见的函数

    一.概述功能:类似于java中的方法好处:提高重用性和隐藏实现细节调用:select 函数名(实参列表); 二:常用的函数: ① 单行函数 1.分组函数 1.sum(),avg(),max(),min ...

  5. Unity3D Errors And Fix

    Author Error: Shader warning in 'Custom/ShowAnimation': Not enough temporary registers, needs 9 (com ...

  6. iOS之safari调试iOS app web页面

    Overview 当下移动端开发过程中大量使用前段H5.js等等技术,而这些web页面的调试在Xcode控制台中不太明了,经常我们移动app运行了就是方法,但是不能显示响应的效果,这时候或许就是已经报 ...

  7. 执行上下文--变量、函数、this

    原文地址:https://www.xingkongbj.com/blog/js/execution-context.html JavaScript 中的执行上下文和调用栈 ES6 变量作用域与提升:变 ...

  8. 『C++』Temp_2018_12_06

    #include <iostream> #include <string> using namespace std; class Type{ public: string Na ...

  9. 简易坦克大战python版

      #! /usr/bin/env python # -*- coding:utf8 -*- ''' *author:wasua *purpose:学习python语言,其中的类以及pygame应用 ...

  10. Git 远程推送被拒绝的一种解决方案

    今天在推送的时候发生了如下错误信息: error: 无法推送一些引用到 'https://gitee.com/von_w/demo_app.git'提示:更新被拒绝,因为您当前分支的最新提交落后于其对 ...