在无边框WPF窗口上启用Vista玻璃效果

我写了一个附加的属性,我可以在一个窗口上设置扩展到客户区(使用DwmExtendFrameIntoClientArea API)的玻璃框架。 它在大多数情况下工作正常。 现在我希望我的窗口是无边界的,所以我在窗口中设置了以下属性:

  WindowStyle="None" ResizeMode="NoResize" Background="Transparent" u:WinUtil.EnableGlass="True" ShowInTaskbar="False" 

但是有了这些属性,玻璃根本不显示:我的窗户只是透明的背景。 如果我将ResizeMode设置为CanResize ,则会显示玻璃,但我不希望窗口可以resize。

我怀疑这是由于玻璃效果是通过将非客户端框架扩展到客户端区域获得的:使用WindowStyle = NoneResizeMode = NoResize ,没有非客户端框架,所以没有任何扩展。 当我启用大小调整时,它会在窗口周围创build一个框架,所以框架可以被扩展。

我想应该可以创build一个窗口,有一个薄边框,没有标题栏,并且不能resize,通过设置适当的WS_ *位,但我不知道哪一个确切

所以我的问题是:

  1. 应该设置或取消设置哪些样式位以获得所需的外观和行为?
  2. 我怎样才能初始化窗口的风格位? Window类似乎没有像Windows窗体CreateParams属性的东西…可以设置这些位创build句柄后?
  3. 我发现HwndSource类可能是问题2的答案,但如果您不是Win32专家,使用起来似乎有点复杂…这是否是我的问题的明智解决scheme?

任何build议是受欢迎的

Solutions Collecting From Web of "在无边框WPF窗口上启用Vista玻璃效果"

你有没有尝试过使用DwmEnableBlurBehindWindow ? 这使您可以使窗口的客户区域的特定部分透明。

我有一个窗口,我只想给一个玻璃边界(没有标题栏和不可调整大小),并遇到同样的问题。 你只能通过设置窗口的样式来完成这个任务。 我的解决方案是设置ResizeMode =“CanResize”和WindowStyle =“None”,然后处理WM_NCHITTEST事件将可调整大小的边界点击转换为不可调整大小的边界点击。 还有必要修改窗口的样式来禁用最大化和最小化(使用Windows快捷键)和系统菜单:

 private void Window_SourceInitialized(object sender, EventArgs e) { System.Windows.Interop.HwndSource source = (System.Windows.Interop.HwndSource)PresentationSource.FromVisual(this); source.AddHook(new System.Windows.Interop.HwndSourceHook(HwndSourceHook)); IntPtr hWnd = new System.Windows.Interop.WindowInteropHelper(this).Handle; IntPtr flags = GetWindowLongPtr(hWnd, -16 /*GWL_STYLE*/); SetWindowLongPtr(hWnd, -16 /*GWL_STYLE*/, new IntPtr(flags.ToInt64() & ~(0x00010000L /*WS_MAXIMIZEBOX*/ | 0x00020000L /*WS_MINIMIZEBOX*/ | 0x00080000L /*WS_SYSMENU*/))); } private static IntPtr HwndSourceHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { switch (msg) { case 0x0084 /*WM_NCHITTEST*/: IntPtr result = DefWindowProc(hwnd, msg, wParam, lParam); if (result.ToInt32() >= 10 /*HTLEFT*/ && result.ToInt32() <= 17 /*HTBOTTOMRIGHT*/ ) { handled = true; return new IntPtr(18 /*HTBORDER*/); } break; } return IntPtr.Zero; } [System.Runtime.InteropServices.DllImport("user32.dll")] private static extern IntPtr DefWindowProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)] private static extern IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong); [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)] private static extern IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex); 

这为Windows 7提供了适用于通知区域弹出窗口(例如时钟或音量弹出窗口)的窗口。 顺便说一句,您可以通过创建高度控制44并设置其背景来重现弹出底部的阴影:

 <Control.Background> <LinearGradientBrush StartPoint="0,0" EndPoint="0,1"> <GradientStop Color="{x:Static SystemColors.GradientActiveCaptionColor}" Offset="0"/> <GradientStop Color="{x:Static SystemColors.InactiveBorderColor}" Offset="0.1"/> </LinearGradientBrush> </Control.Background>