zoukankan      html  css  js  c++  java
  • 一个体验好的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+款云产品! 

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


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

  • 相关阅读:
    get通配符
    常用正则表达式(合)
    2.A star
    1.序
    机器人运动规划04《规划算法》
    机器人运动规划03什么是运动规划
    6.2 性能优化
    6.1 内存机制及使用优化
    5.9 热修复技术
    5.8 反射机制
  • 原文地址:https://www.cnblogs.com/zyfd/p/9711869.html
Copyright © 2011-2022 走看看