TrafficMonitor icon indicating copy to clipboard operation
TrafficMonitor copied to clipboard

提供了Direct2D渲染支持,大幅提升任务栏窗口透明渲染效果

Open BombaxCeiba opened this issue 3 years ago • 7 comments

下载

GitHub Action

兼容性

程序在Windows 11 22000.918上正常工作,但因为在Windows 7和Windows 8上任务栏窗口调用函数UpdateLayeredWindowIndirect更新窗口内容时会失败并得到错误87,所以这一功能暂不支持这两个系统版本。

D2D渲染实现说明

通过对原有的CDrawCommon类在CTaskBarDlg类的ShowInfo方法中用到的函数进行提取后,添加了apha参数后单独放到IDrawCommon类中定义为纯虚函数。再将ShowInfo中用到的CDrawCommon类全部替换为IDrawCommon来实现对老代码的兼容。之后,在CTaskBarDlgDrawCommon类中继承并实现这些接口。函数CTaskBarDlg::GetRenderType()会检查设置和系统,只有在具有D2D1和DWrite的系统上,同时只选择了 背景透明 而没有选择 根据任务栏色自动设置背景 的时候才会返回RenderType::D2D1,以启用Direct2D渲染支持。

D2D和GDI交互

为了兼容插件的GDI调用,所有插件的绘制会被重定向到一个临时的DIB上,并且插件(包括通过MFC间接)调用的User32.dll中的DrawText和DrawTextEx系列函数都会被hook到一个支持透明度的版本上。在插件绘制完成后,DIB会被上传到显卡。显卡会将透明度为1的值(对应未被GDI绘制过的部分)修改为0,将透明度为0的值修改为255(对应被GDI绘制过的部分),其余透明度的值保留,得到的结果再和程序绘制的部分相叠加以得到最终显示用的结果。

由于微软的神奇bug,IDXGISurface1::GetDC的调用会偶尔出现下面这种报错:

0x00007FFD8D73474C 处(位于 TrafficMonitor.exe 中)引发的异常: Microsoft C++ 异常: _com_error,位于内存位置 0x000000FDDC3AB6C8 处。

可以不用理会。

禁用D2D绘图

找到任务栏窗口设置,勾选这个(在最下面的)选项即可 image

D2D绘图和GDI绘图效果对比

D2D: image image

GDI: image image

*使用D2D渲染时,可以避免背景颜色变化导致的闪烁现象。 ~~并且D2D内存占用大一点~~

fix #955 fix #837 fix #1068

BombaxCeiba avatar Apr 29 '22 17:04 BombaxCeiba

使用@eritpchy构建的版本发现:

对于点阵字体,D2D渲染会导致程序直接崩溃,例如Terminal、Terminal Greek与Terminal Greek 869等系列点阵字体。 image

对于部分字体,D2D会出现 fallback 到默认字体的现象,如FOT-Aokane Std,GenSenMaruGothic TW TTF,Victor Mono等

经过检查发现,这些出现 fallback 问题所涉及到的字体,均没有使用“为所有用户安装”这一选项。 而MFC渲染则没有这个问题。

image

image

image

image

soloopooo avatar May 09 '22 09:05 soloopooo

使用@eritpchy构建的版本发现:

对于点阵字体,D2D渲染会导致程序直接崩溃,例如Terminal、Terminal Greek与Terminal Greek 869等系列点阵字体。 image

对于部分字体,D2D会出现 fallback 到默认字体的现象,如FOT-Aokane Std,GenSenMaruGothic TW TTF,Victor Mono等

经过检查发现,这些出现 fallback 问题所涉及到的字体,均没有使用“为所有用户安装”这一选项。 而MFC渲染则没有这个问题。

image

image

image

image

应该不会崩溃了,但是字体的问题还没解决。

BombaxCeiba avatar May 09 '22 16:05 BombaxCeiba

开启 Direct2D 渲染前,整块任务栏窗口都可以右键或双击。开启 Direct2D 渲染后,只有在渲染了文字的地方操作才会正确响应,在其它部分操作会变成任务栏右键。 8d1ea689-5cf5-412f-99e4-f53f4023278d

SpecterShell avatar May 31 '22 13:05 SpecterShell

开启 Direct2D 渲染前,整块任务栏窗口都可以右键或双击。开启 Direct2D 渲染后,只有在渲染了文字的地方操作才会正确响应,在其它部分操作会变成任务栏右键。 8d1ea689-5cf5-412f-99e4-f53f4023278d 8d1ea689-5cf5-412f-99e4-f53f4023278d

后续会给渲染的背景给个1的透明度,应该能解决问题

BombaxCeiba avatar Jun 01 '22 13:06 BombaxCeiba

@zhongyang219 目前PR的功能已经实现了,在我电脑上也没有测出什么bug,我觉得可以考虑合并了。

BombaxCeiba avatar Sep 06 '22 15:09 BombaxCeiba

非常感谢你为TrafficMonitor做出的改进。我近期计划更新TrafficMonitor1.74版本,以解决Windows11 22h2中任务栏显示的问题。为了保险起见,这个pr我打算在版本更新后再合并。

zhongyang219 avatar Oct 01 '22 04:10 zhongyang219

非常感谢你为TrafficMonitor做出的改进。我近期计划更新TrafficMonitor1.74版本,以解决Windows11 22h2中任务栏显示的问题。为了保险起见,这个pr我打算在版本更新后再合并。

BombaxCeiba avatar Oct 01 '22 05:10 BombaxCeiba

请问如何下载此PR中的 D2D 版本的软件?我不会编译。

NeoFantom avatar Jan 09 '23 01:01 NeoFantom

请问如何下载此PR中的 D2D 版本的软件?我不会编译。

我更新了PR的说明,添加了下载的教程,你可以再看看下载部分的内容。

BombaxCeiba avatar Jan 09 '23 03:01 BombaxCeiba

任务栏调至浅色后,任务栏窗口会出现白色不透明背景,重新关闭并打开“背景透明”选项无效。 image 勾选“禁用Direct2D渲染”后,背景颜色仍为白色,而前景文字颜色变成透明。同时任务栏无论是深色还是浅色,在任务栏窗口右键点击无法打开程序菜单,而是打开任务栏的菜单。 image

SpecterShell avatar Jan 10 '23 08:01 SpecterShell

任务栏调至浅色后,任务栏窗口会出现白色不透明背景,重新关闭并打开“背景透明”选项无效。 image 勾选“禁用Direct2D渲染”后,背景颜色仍为白色,而前景文字颜色变成透明。同时任务栏无论是深色还是浅色,在任务栏窗口右键点击无法打开程序菜单,而是打开任务栏的菜单。 image

试一下GitHub Action里面最新的版本,问题已经被修复了。

BombaxCeiba avatar Jan 11 '23 15:01 BombaxCeiba

代码已合并,感谢你为TrfficMonitor做出的改进

zhongyang219 avatar Feb 05 '23 09:02 zhongyang219

CI 版本已过期,请求新的下载方式

miyouzi avatar Jul 01 '23 06:07 miyouzi

CI 版本已过期,请求新的下载方式

见最新的版本 #1656

BombaxCeiba avatar Jul 18 '23 01:07 BombaxCeiba

下载

GitHub Action *下载方式:点击上面的 GitHub Action ,进入后选择带TransparentSupport标识的最新的一项点进去,拉到网页最下面,32位系统选择x86开头的文件下载,64位系统选择x64开头的文件下载即可。

系统兼容性

程序在Windows 11 22000.918上正常工作,但因为在Windows 7和Windows 8上任务栏窗口调用函数UpdateLayeredWindowIndirect更新窗口内容时会失败并得到错误87,所以这一功能暂不支持这两个系统版本。

对于Windows 8.1以及以上的系统版本,由于支持Direct Composition,在UpdateLayeredWindowIndirect失败后会使用Direct Composition对D2D渲染结果进行呈现。

在Windows Server 2022 20348.1366上,也会因为相同的原因使用Direct Composition进行呈现。

HDR兼容性

程序在Windows Server 2022 20348.1366上,在使用Direct Composition时可以正常呈现。

D2D渲染实现说明

通过对原有的CDrawCommon类在CTaskBarDlg类的ShowInfo方法中用到的函数进行提取后,添加了apha参数后单独放到IDrawCommon类中定义为纯虚函数。再将ShowInfo中用到的CDrawCommon类全部替换为IDrawCommon来实现对老代码的兼容。

D2D和GDI互操作

为了兼容插件的GDI调用,所有插件的绘制会被重定向到一个临时的DIB上,并且插件(包括通过MFC间接)调用的User32.dll中的DrawText和DrawTextEx系列函数都会被hook到一个支持透明度的版本上。在插件绘制完成后,DIB会被上传到显卡。显卡会将透明度为1的值(对应未被GDI绘制过的部分)修改为0,将透明度为0的值修改为255(对应被GDI绘制过的部分),其余透明度的值保留,得到的结果再和程序绘制的部分相叠加以得到最终显示用的结果。

由于微软的神奇bug,IDXGISurface1::GetDC的调用会偶尔出现下面这种报错:

0x00007FFD8D73474C 处(位于 TrafficMonitor.exe 中)引发的异常: Microsoft C++ 异常: _com_error,位于内存位置 0x000000FDDC3AB6C8 处。

可以不用理会。

禁用D2D绘图

找到任务栏窗口设置,勾选这个(在最下面的)选项即可 image

D2D绘图和GDI绘图效果对比

D2D: image image

GDI: image image

*使用D2D渲染时,可以避免背景颜色变化导致的闪烁现象。 ~并且D2D内存占用大一点~

fix #955 fix #837 fix #1068

This artifact has expired and you can no longer download it

IMLHF avatar Nov 29 '23 01:11 IMLHF