“配方”使其看起来好像是XAML本身实现的,而不是暴露给更广泛的系统。
有一篇相关的SO问题证实了这一点(它缺乏具体的技术答案,但意味着亚克力不像玻璃那样可以通过WinAPI获得。)
如何在普通的Win32应用程序中模仿这个效果?使用玻璃和混合吗?(使用哪些API,以及Win10秋季更新的玻璃API中有哪些Win7中没有的功能?)如果应用程序是使用Win32创建的,但使用DirectX表面进行渲染,是否会开启更多的可能性?
有一篇相关的SO问题证实了这一点(它缺乏具体的技术答案,但意味着亚克力不像玻璃那样可以通过WinAPI获得。)
如何在普通的Win32应用程序中模仿这个效果?使用玻璃和混合吗?(使用哪些API,以及Win10秋季更新的玻璃API中有哪些Win7中没有的功能?)如果应用程序是使用Win32创建的,但使用DirectX表面进行渲染,是否会开启更多的可能性?
正如 @zett42 回答的那样,我认为它是使用 DirectComposition 实现的。
一点历史:在 Vista 中,微软推出了桌面窗口管理器 DWM,它是桌面的合成引擎。使用 DWM,窗口绘制到纹理上,然后在 DWM 中组合。好处是你可以获得花哨的效果,如 3D 动画、透明度等,并且所有内容都是双缓冲的,因此没有渲染伪影。
DWM 最初基于 MIL(媒体集成层),我认为这是一个场景图 API。有趣的是,在那个时候引入的 WPF 也使用了 MIL。这真的很酷,因为 DWM 可以看到 WPF 窗口的场景图,当它产生效果时,例如缩放窗口,它会将其视为向量而不是位图,因此可以缩放而无伪影。然而,在某个时刻微软分叉了在 WPF 中使用的 MIL 版本,这种集成失去了。
快进几年到 Windows 8。微软推出了新的“Metro”应用程序(后来是“Modern”,现在是“UWP”)。在幕后,这些现代应用程序使用了一个新的合成 API,即 DirectComposition。该 API 也可用于 Win32 应用程序,现在 DWM 本身也使用了它。如果您查看公共的 DWM 函数,则一些与 MIL 相关的函数已被弃用,因此支持我的理论,即 MS 转向了 DC 而不是 MIL。因此,现在我们处于初始情况,应用程序以及 DWM 使用相同的基础设施,我们可以轻松地添加一些有趣的效果。
在某个时刻,微软推出了由 IDCompositionDevice3 接口提供的 DirectComposition 的新混合效果。其中包括高斯模糊效果,但也包括噪音、色调和其他必要的效果。我找到了一种方法可以在我的窗口中应用这些效果,但我不知道如何将它们应用到我的窗口上。不幸的是,我现在无法访问我的代码,等我可以时我会更新我的答案。
我基于这篇文章进行了探索:DirectComposition高效Alpha混合窗口。基本上,你有一个与屏幕对应的“设备”,以及与你的窗口内容相对应的“可视化”。你需要更改的是:QueryInterface
将其转换为IDCompositionDevice3
。IDCompositionVisual3
上调用SetEffect
了。但是,正如我所说的,这只适用于窗口的内容。我认为必须有一种秘密API可以从DWM获取当前窗口的父级可视化对象,之后只需在该可视化对象上调用SetEffect
即可获得效果。如果有人熟练使用调试器,应该可以通过跟踪使用Acyllic效果的UWP应用程序来找到该API。
作为尝试,我会看看GetWindowCompositionAttribute
函数。它最近增加了一些听起来很有趣的标志,比如WCA_VISUAL_OWNER。
CreateHostBackdropBrush
-- 它似乎确实围绕着dcomp.dll浮动 -- 但遗憾的是微软没有立即计划将HostBackdropBrush添加到DirectComposition API集中。 :( - melak47DwmSetWindowAttribute()
,它与未记录的 SetWindowCompositionAttribute()
相同,只是参数传递方式不同。示例的相关代码可以在 MainWindow.xaml.cs 中找到。 - zett42ACCENT_ENABLE_ACRYLICBLURBEHIND
的模糊半径比使用ACCENT_ENABLE_BLURBEHIND
更大,但与UWP中的亚克力画笔不完全相同。(UWP仍具有更大的模糊半径和其他组件) - Grant HowardSetWindowCompositionAttribute()
实现,您已经提供了链接。该功能必须由DWM提供,即使对于XAML实现也是如此。WS_EX_NOREDIRECTIONBITMAP
结合使用,如文章"使用Windows合成引擎进行高性能窗口分层"所述。我尚未使用过这项技术,但文章指出XAML基于Direct Composition,应该开启所有可能性。IDComposition
可视化对象中,并将其用于创建亚克力背景。IDCompositionGaussianBlurEffect
来模糊背景。