透明WPF窗口后面模糊

nbewdwxp  于 2023-03-13  发布在  其他
关注(0)|答案(4)|浏览(240)

我正在尝试创建一个WPF应用程序,它带有一个半透明的无边框窗口,使其后面的背景变得模糊。
下面是我想做的一个例子:

我试过使用**DwmEnableBlurBehindWindow**,它只适用于Windows Vista/7。
我正试图找到一个解决方案,将工作在Windows 7,8和10。

p8h8hvxi

p8h8hvxi1#

对于任何感兴趣的人,我已经找到了一个解决方案的Windows 10。它看起来好像是不可能的Windows 8虽然;正如大卫Heffernan提到的,Windows 8中删除了DwmEnableBlurBehindWindow。但是,微软在Windows 10中重新引入了一个解决方案来实现这一效果。

q35jwt9p

q35jwt9p2#

我希望我没有迟到。你可以使用SetWindowCompositionAttribute,但是你必须将WindowStyle设置为“None”,并且实现你自己的本地窗口函数和句柄。另外,从自定义控件继承是相当复杂的。但是,长话短说,还有BlurryControls。
你可以通过NuGet浏览“BlurryControls”找到它,或者自己在**GitHub**上查看代码。无论如何,我希望这对你有帮助。
在GitHub上,您还可以找到一个示例应用程序。

mzsu5hc0

mzsu5hc03#

** windows 8**

就像一个死胡同,最好是完全忘记,我们可能需要确保我们的程序在不同版本之间的行为一致。如果不需要动态背景,特别是如果窗口相对较小(主要候选者是我们自己的应用程序窗口上的消息框或类似物),捕获窗口后面的屏幕并手动使其模糊的解决方案可能有效。在Loaded事件处理程序中:

var screen = window.Owner.PointToScreen(new System.Windows.Point((window.Owner.ActualWidth - window.ActualWidth) / 2, (window.Owner.ActualHeight - window.ActualHeight) / 2));
var rect = new Rectangle((int)screen.X, (int)screen.Y, (int)window.ActualWidth, (int)window.ActualHeight);
var bitmap = new Bitmap(rect.Width, rect.Height);
using (var graphics = Graphics.FromImage(bitmap))
  graphics.CopyFromScreen(rect.Left, rect.Top, 0, 0, rect.Size);
border.Background = new ImageBrush(ApplyGaussianBlur(bitmap.ToBitmapImage())) {
  TileMode = TileMode.None,
  Stretch = Stretch.None,
  AlignmentX = AlignmentX.Center,
  AlignmentY = AlignmentY.Center,
};

其中border是最外面的Border,通常完全为空,仅在Windows 8上使用。
helper函数是通常的位图转换:

public static BitmapSource ToBitmapImage(this System.Drawing.Bitmap image) {
  var hBitmap = image.GetHbitmap();
  var bitmap = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
  DeleteObject(hBitmap);
  return bitmap;
}

ApplyGaussianBlur()最好使用WriteableBitmapEx之类的直接位图操作包以及必要的modifications.来解决

mkh04yzy

mkh04yzy4#

微软从Windows 8开始移除了玻璃效果。这就解释了为什么你所期待的模糊效果在Windows 8和更高版本上没有观察到。你必须学会在那些操作系统上没有它的生活。

相关问题