walterlv / BlogComments

3 stars 0 forks source link

post/set-window-composition-attribute #32

Open utterances-bot opened 4 years ago

utterances-bot commented 4 years ago

使用 SetWindowCompositionAttribute 来控制程序的窗口边框和背景(可以做 Acrylic 亚克力效果、模糊效果、主题色效果等) - walterlv

使用 SetWindowCompositionAttribute 来控制程序的窗口边框和背景(可以做 Acrylic 亚克力效果、模糊效果、主题色效果等)

https://blog.walterlv.com/post/set-window-composition-attribute.html

nocanstillbb commented 4 years ago

昨天围观了这篇文章, 今天想把我司项目的锁屏模糊窗口换成这个效果, win7 和win10 win10这部分我用了性能比较不好的ACCENT_ENABLE_BLURBEHIND ,因为我们的锁屏不需要很高的性能,当然是越靓仔越好 win7使用了此文中的方法来做毛玻璃, 于发现了一个问题: win10下是固定颜色的模糊效果 win7上用毛玻璃却跟随了主题.

经过查阅资料我发现win7下使用DwmEnableBlurBehindWindow代替SetWindowCompositionAttribute可以解决这个问题, win7下使用DwmEnableBlurBehindWindow的效果就像是永远失去焦点的SetWindowCompositionAttribute,所以它总是白色的 参考:https://stackoverflow.com/questions/17246206/wpf-glass-window-with-no-border-and-no-resize-out-of-focus

再次感谢带来精彩的博文

walterlv commented 4 years ago

@nocanstillbb 感谢带来 DwmEnableBlurBehindWindow API

dotnet9 commented 4 years ago

谢谢作者,已转载本文:https://dotnet9.com/?p=2890

ksharperd commented 3 years ago

早就围观了这篇文章,这两天我在.Net5的WPF项目里试了下,发现代码完全没有用,不管是设置ACCENT_ENABLE_BLURBEHIND还是ACCENT_ENABLE_ACRYLICBLURBEHIND,都只得到一个类似全透明的背景。不知道是不是我的系统问题,我的系统是2004
奇怪的是,我使用网上找来的2017年的方法(那时没有ACCENT_ENABLE_ACRYLICBLURBEHIND)开启ACCENT_ENABLE_BLURBEHIND,却有效果 不知道怎么回事

walterlv commented 3 years ago

@GodLeaveMe 表示跟你遇到的情况相同,正在寻找解决方法中……

AceLearnGit commented 3 years ago

您好,我遇到这样一个问题: 为了让我的窗体是亚克力背景的同时保持窗体阴影,我使用了windowchrome且GlassFrameThickness="1",但是亚克力效果在win10某些版本下会导致窗体移动时非常卡,于是我移动窗口时去掉了亚克力效果,移动结束后再恢复亚克力,但是发现移动完重新设置亚克力时窗体会有大约1像素的白边,而窗体移动前并没有. 另外经过测试,即使GlassFrameThickness的top设置为0,例如1,0,0,0 窗体的上边缘也会有白边,即窗体的左和上边缘有白边. 请问博主知道为什么会出现这种情况,以及该如何解决吗,谢谢

chenggj commented 3 years ago

@GodLeaveMe 我开始也是这样,后来跟代码,发现是我系统的版本号取的有错误。我的是win10, 通过Environment.OSVersion.Version取出来,确定为到了windowsservice。后来查到,可以添加manifest文件,并设置如下:

就能取到正确的版本号,然后获取到模糊效果了。

walterlv commented 3 years ago

您好,我遇到这样一个问题: 为了让我的窗体是亚克力背景的同时保持窗体阴影,我使用了windowchrome且GlassFrameThickness="1",但是亚克力效果在win10某些版本下会导致窗体移动时非常卡,于是我移动窗口时去掉了亚克力效果,移动结束后再恢复亚克力,但是发现移动完重新设置亚克力时窗体会有大约1像素的白边,而窗体移动前并没有. 另外经过测试,即使GlassFrameThickness的top设置为0,例如1,0,0,0 窗体的上边缘也会有白边,即窗体的左和上边缘有白边. 请问博主知道为什么会出现这种情况,以及该如何解决吗,谢谢

遇到相同的问题,并不知道如何处理。

pierre-primary commented 3 years ago

@AceLearnGit
试试移除亚克力效果时用ACCENT_INVALID_STATE,不要使用ACCENT_DISABLED。 使用ACCENT_DISABLED后恢复亚克力效果,Frame不会被参与模糊。1像素的边不模糊就会很明显。

我的Demo https://github.com/Pierre-Ybao/WindowAcrylicDemo

xbendan commented 3 years ago

SetWindowCompositionAttribute应该是系统用来绘制 任务栏和开始菜单 这些窗体的API,这些窗体不存在拖动的情况,所以用来绘制常规窗体确实可能有不兼容性,拖动时卡顿应该是API本身的问题。 我在TranslucentTB中找到了用此API绘制任务栏的代码,可以参考 https://github.com/TranslucentTB/TranslucentTB/blob/release/TranslucentTB/main.cpp 109~148行 在常规窗体中确实需要慎用这个API。目前暂时没有好的亚克力背景方案

SundayRX commented 3 years ago

亲身体验 亚力克效果卡的要命 鼠标根本就不能拖着走 虽然亚克力质感更好但是这绘制效率我还是屈服使用普通的模糊效果了