在透明的WPF窗口后面模糊

时间:2015-08-03 00:43:47

标签: c# wpf winapi

我正在尝试使用半透明的无边框窗口创建一个WPF应用程序,该窗口模糊了它背后的背景。

以下是我想要做的一个例子。 Screenshot

我尝试使用仅适用于Windows Vista / 7的DwmEnableBlurBehindWindow

我正在尝试找到适用于Windows 7,8和10的解决方案。

4 个答案:

答案 0 :(得分:14)

对于任何有兴趣的人我已经找到了适用于Windows 10的解决方案,看起来好像在Windows 8上不可能,就像David Heffernan提到的那样,DwmEnableBlurBehindWindow已从Windows 8中删除,但微软重新推出了实现这一目标的解决方案Windows 10中的效果。

答案 1 :(得分:3)

I hope I am not late to the party. You can use the SetWindowCompositionAttribute, but you are then forced to set the WindowStyle to "None" and implement your own native Window funtionality and handles. Also inheriting from a custom control is quite complicated. However, long story short. There's BlurryControls.

You can find it via NuGet by browsing for "BlurryControls" or check out the code yourself on GitHub. Eitherway, I hope this is helpful.

On GitHub you will also find a sample application.

答案 2 :(得分:2)

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上使用。

辅助函数是通常的位图转换:

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.

答案 3 :(得分:0)

Microsoft从Windows 8开始删除了玻璃效果。这解释了为什么在Windows 8及更高版本中未观察到您期望的模糊效果。在这些操作系统上,你必须学会​​没有它。