WPF中,如何将Vista Aero效果扩展到整个窗口

原文:WPF中,如何将Vista Aero效果扩展到整个窗口

  WPF中,如何将Vista Aero效果扩展到整个窗口
                                                                                           
周银辉
效果图:
WPF中,如何将Vista Aero效果扩展到整个窗口

有不少示例介绍了如何将Vista Aero效果扩展到整个窗口,但大都是针对Windows Form应用程序,而不是WPF(即前者针对的是Form类,后者是针对的Window类),比如http://www.cnblogs.com/zhouyinhui/archive/2007/05/30/765416.html
其实与其类似,都是调用dwmapi,只不过Window类没有直接给我们提供句柄,我们需要这样的代码来找到其句柄:

WPF中,如何将Vista Aero效果扩展到整个窗口IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(window).Handle;

然后将窗口的背景设置为透明:

WPF中,如何将Vista Aero效果扩展到整个窗口window.Background = Brushes.Transparent;
WPF中,如何将Vista Aero效果扩展到整个窗口            HwndSource.FromHwnd(hwnd).CompositionTarget.BackgroundColor = Colors.Transparent;

最后调用

WPF中,如何将Vista Aero效果扩展到整个窗口 DwmApi.DwmExtendFrameIntoClientArea(hwnd, margins);

注意,我们应该在窗口被显示之后(SourceInitialized之后)再调用我们的函数否则会引发异常。

参考代码:

WPF中,如何将Vista Aero效果扩展到整个窗口 public partial class Window1 : System.Windows.Window
WPF中,如何将Vista Aero效果扩展到整个窗口WPF中,如何将Vista Aero效果扩展到整个窗口    WPF中,如何将Vista Aero效果扩展到整个窗口{
WPF中,如何将Vista Aero效果扩展到整个窗口
WPF中,如何将Vista Aero效果扩展到整个窗口        public Window1()
WPF中,如何将Vista Aero效果扩展到整个窗口WPF中,如何将Vista Aero效果扩展到整个窗口        WPF中,如何将Vista Aero效果扩展到整个窗口{
WPF中,如何将Vista Aero效果扩展到整个窗口            InitializeComponent();
WPF中,如何将Vista Aero效果扩展到整个窗口
WPF中,如何将Vista Aero效果扩展到整个窗口        }
WPF中,如何将Vista Aero效果扩展到整个窗口
WPF中,如何将Vista Aero效果扩展到整个窗口        protected override void OnSourceInitialized(EventArgs e)
WPF中,如何将Vista Aero效果扩展到整个窗口WPF中,如何将Vista Aero效果扩展到整个窗口        WPF中,如何将Vista Aero效果扩展到整个窗口{
WPF中,如何将Vista Aero效果扩展到整个窗口            base.OnSourceInitialized(e);
WPF中,如何将Vista Aero效果扩展到整个窗口            DWMLib.AeroHelper.ExtendGlassFrame(this, new Thickness(-1));
WPF中,如何将Vista Aero效果扩展到整个窗口
WPF中,如何将Vista Aero效果扩展到整个窗口        }
WPF中,如何将Vista Aero效果扩展到整个窗口
WPF中,如何将Vista Aero效果扩展到整个窗口    }
WPF中,如何将Vista Aero效果扩展到整个窗口public class AeroHelper
WPF中,如何将Vista Aero效果扩展到整个窗口WPF中,如何将Vista Aero效果扩展到整个窗口    WPF中,如何将Vista Aero效果扩展到整个窗口{
WPF中,如何将Vista Aero效果扩展到整个窗口        public static bool ExtendGlassFrame(Window window, Thickness margin)
WPF中,如何将Vista Aero效果扩展到整个窗口WPF中,如何将Vista Aero效果扩展到整个窗口        WPF中,如何将Vista Aero效果扩展到整个窗口{
WPF中,如何将Vista Aero效果扩展到整个窗口            if (!DwmApi.DwmIsCompositionEnabled())
WPF中,如何将Vista Aero效果扩展到整个窗口                return false;
WPF中,如何将Vista Aero效果扩展到整个窗口
WPF中,如何将Vista Aero效果扩展到整个窗口            IntPtr hwnd = new WindowInteropHelper(window).Handle;
WPF中,如何将Vista Aero效果扩展到整个窗口            if (hwnd == IntPtr.Zero)
WPF中,如何将Vista Aero效果扩展到整个窗口                throw new InvalidOperationException("The Window must be shown before extending glass.");
WPF中,如何将Vista Aero效果扩展到整个窗口
WPF中,如何将Vista Aero效果扩展到整个窗口            // Set the background to transparent from both the WPF and Win32 perspectives
WPF中,如何将Vista Aero效果扩展到整个窗口            window.Background = Brushes.Transparent;
WPF中,如何将Vista Aero效果扩展到整个窗口            HwndSource.FromHwnd(hwnd).CompositionTarget.BackgroundColor = Colors.Transparent;
WPF中,如何将Vista Aero效果扩展到整个窗口
WPF中,如何将Vista Aero效果扩展到整个窗口            DWMLib.DwmApi.MARGINS margins = new DWMLib.DwmApi.MARGINS((int)margin.Left, (int)margin.Top, (int)margin.Right, (int)margin.Bottom);
WPF中,如何将Vista Aero效果扩展到整个窗口            DwmApi.DwmExtendFrameIntoClientArea(hwnd, margins);
WPF中,如何将Vista Aero效果扩展到整个窗口
WPF中,如何将Vista Aero效果扩展到整个窗口            return true;
WPF中,如何将Vista Aero效果扩展到整个窗口        }
WPF中,如何将Vista Aero效果扩展到整个窗口
WPF中,如何将Vista Aero效果扩展到整个窗口public class DwmApi
WPF中,如何将Vista Aero效果扩展到整个窗口WPF中,如何将Vista Aero效果扩展到整个窗口    WPF中,如何将Vista Aero效果扩展到整个窗口{
WPF中,如何将Vista Aero效果扩展到整个窗口        [DllImport("dwmapi.dll", PreserveSig = false)]
WPF中,如何将Vista Aero效果扩展到整个窗口        public static extern void DwmEnableBlurBehindWindow(IntPtr hWnd, DWM_BLURBEHIND pBlurBehind);
WPF中,如何将Vista Aero效果扩展到整个窗口
WPF中,如何将Vista Aero效果扩展到整个窗口        [DllImport("dwmapi.dll", PreserveSig = false)]
WPF中,如何将Vista Aero效果扩展到整个窗口        public static extern void DwmExtendFrameIntoClientArea(IntPtr hWnd, MARGINS pMargins);
WPF中,如何将Vista Aero效果扩展到整个窗口
WPF中,如何将Vista Aero效果扩展到整个窗口        [DllImport("dwmapi.dll", PreserveSig = false)]
WPF中,如何将Vista Aero效果扩展到整个窗口        public static extern bool DwmIsCompositionEnabled();
WPF中,如何将Vista Aero效果扩展到整个窗口
WPF中,如何将Vista Aero效果扩展到整个窗口        [DllImport("dwmapi.dll", PreserveSig = false)]
WPF中,如何将Vista Aero效果扩展到整个窗口        public static extern void DwmGetColorizationColor(
WPF中,如何将Vista Aero效果扩展到整个窗口            out int pcrColorization,
WPF中,如何将Vista Aero效果扩展到整个窗口            [MarshalAs(UnmanagedType.Bool)]out bool pfOpaqueBlend);
WPF中,如何将Vista Aero效果扩展到整个窗口
WPF中,如何将Vista Aero效果扩展到整个窗口        [DllImport("dwmapi.dll", PreserveSig = false)]
WPF中,如何将Vista Aero效果扩展到整个窗口        public static extern void DwmEnableComposition(bool bEnable);
WPF中,如何将Vista Aero效果扩展到整个窗口
WPF中,如何将Vista Aero效果扩展到整个窗口        [DllImport("dwmapi.dll", PreserveSig = false)]
WPF中,如何将Vista Aero效果扩展到整个窗口        public static extern IntPtr DwmRegisterThumbnail(IntPtr dest, IntPtr source);
WPF中,如何将Vista Aero效果扩展到整个窗口
WPF中,如何将Vista Aero效果扩展到整个窗口        [DllImport("dwmapi.dll", PreserveSig = false)]
WPF中,如何将Vista Aero效果扩展到整个窗口        public static extern void DwmUnregisterThumbnail(IntPtr hThumbnail);
WPF中,如何将Vista Aero效果扩展到整个窗口
WPF中,如何将Vista Aero效果扩展到整个窗口        [DllImport("dwmapi.dll", PreserveSig = false)]
WPF中,如何将Vista Aero效果扩展到整个窗口        public static extern void DwmUpdateThumbnailProperties(IntPtr hThumbnail, DWM_THUMBNAIL_PROPERTIES props);
WPF中,如何将Vista Aero效果扩展到整个窗口
WPF中,如何将Vista Aero效果扩展到整个窗口        [DllImport("dwmapi.dll", PreserveSig = false)]
WPF中,如何将Vista Aero效果扩展到整个窗口        public static extern void DwmQueryThumbnailSourceSize(IntPtr hThumbnail, out Size size);
WPF中,如何将Vista Aero效果扩展到整个窗口
WPF中,如何将Vista Aero效果扩展到整个窗口        [StructLayout(LayoutKind.Sequential)]
WPF中,如何将Vista Aero效果扩展到整个窗口        public class DWM_THUMBNAIL_PROPERTIES
WPF中,如何将Vista Aero效果扩展到整个窗口WPF中,如何将Vista Aero效果扩展到整个窗口        WPF中,如何将Vista Aero效果扩展到整个窗口{
WPF中,如何将Vista Aero效果扩展到整个窗口            public uint dwFlags;
WPF中,如何将Vista Aero效果扩展到整个窗口            public RECT rcDestination;
WPF中,如何将Vista Aero效果扩展到整个窗口            public RECT rcSource;
WPF中,如何将Vista Aero效果扩展到整个窗口            public byte opacity;
WPF中,如何将Vista Aero效果扩展到整个窗口            [MarshalAs(UnmanagedType.Bool)]
WPF中,如何将Vista Aero效果扩展到整个窗口            public bool fVisible;
WPF中,如何将Vista Aero效果扩展到整个窗口            [MarshalAs(UnmanagedType.Bool)]
WPF中,如何将Vista Aero效果扩展到整个窗口            public bool fSourceClientAreaOnly;
WPF中,如何将Vista Aero效果扩展到整个窗口
WPF中,如何将Vista Aero效果扩展到整个窗口            public const uint DWM_TNP_RECTDESTINATION = 0x00000001;
WPF中,如何将Vista Aero效果扩展到整个窗口            public const uint DWM_TNP_RECTSOURCE = 0x00000002;
WPF中,如何将Vista Aero效果扩展到整个窗口            public const uint DWM_TNP_OPACITY = 0x00000004;
WPF中,如何将Vista Aero效果扩展到整个窗口            public const uint DWM_TNP_VISIBLE = 0x00000008;
WPF中,如何将Vista Aero效果扩展到整个窗口            public const uint DWM_TNP_SOURCECLIENTAREAONLY = 0x00000010;
WPF中,如何将Vista Aero效果扩展到整个窗口        }
WPF中,如何将Vista Aero效果扩展到整个窗口
WPF中,如何将Vista Aero效果扩展到整个窗口        [StructLayout(LayoutKind.Sequential)]
WPF中,如何将Vista Aero效果扩展到整个窗口        public class MARGINS
WPF中,如何将Vista Aero效果扩展到整个窗口WPF中,如何将Vista Aero效果扩展到整个窗口        WPF中,如何将Vista Aero效果扩展到整个窗口{
WPF中,如何将Vista Aero效果扩展到整个窗口            public int cxLeftWidth, cxRightWidth, cyTopHeight, cyBottomHeight;
WPF中,如何将Vista Aero效果扩展到整个窗口
WPF中,如何将Vista Aero效果扩展到整个窗口            public MARGINS(int left, int top, int right, int bottom)
WPF中,如何将Vista Aero效果扩展到整个窗口WPF中,如何将Vista Aero效果扩展到整个窗口            WPF中,如何将Vista Aero效果扩展到整个窗口{
WPF中,如何将Vista Aero效果扩展到整个窗口                cxLeftWidth = left;
WPF中,如何将Vista Aero效果扩展到整个窗口                cyTopHeight = top;
WPF中,如何将Vista Aero效果扩展到整个窗口                cxRightWidth = right;
WPF中,如何将Vista Aero效果扩展到整个窗口                cyBottomHeight = bottom;
WPF中,如何将Vista Aero效果扩展到整个窗口            }
WPF中,如何将Vista Aero效果扩展到整个窗口        }
WPF中,如何将Vista Aero效果扩展到整个窗口
WPF中,如何将Vista Aero效果扩展到整个窗口        [StructLayout(LayoutKind.Sequential)]
WPF中,如何将Vista Aero效果扩展到整个窗口        public class DWM_BLURBEHIND
WPF中,如何将Vista Aero效果扩展到整个窗口WPF中,如何将Vista Aero效果扩展到整个窗口        WPF中,如何将Vista Aero效果扩展到整个窗口{
WPF中,如何将Vista Aero效果扩展到整个窗口            public uint dwFlags;
WPF中,如何将Vista Aero效果扩展到整个窗口            [MarshalAs(UnmanagedType.Bool)]
WPF中,如何将Vista Aero效果扩展到整个窗口            public bool fEnable;
WPF中,如何将Vista Aero效果扩展到整个窗口            public IntPtr hRegionBlur;
WPF中,如何将Vista Aero效果扩展到整个窗口            [MarshalAs(UnmanagedType.Bool)]
WPF中,如何将Vista Aero效果扩展到整个窗口            public bool fTransitionOnMaximized;
WPF中,如何将Vista Aero效果扩展到整个窗口
WPF中,如何将Vista Aero效果扩展到整个窗口            public const uint DWM_BB_ENABLE = 0x00000001;
WPF中,如何将Vista Aero效果扩展到整个窗口            public const uint DWM_BB_BLURREGION = 0x00000002;
WPF中,如何将Vista Aero效果扩展到整个窗口            public const uint DWM_BB_TRANSITIONONMAXIMIZED = 0x00000004;
WPF中,如何将Vista Aero效果扩展到整个窗口        }
WPF中,如何将Vista Aero效果扩展到整个窗口
WPF中,如何将Vista Aero效果扩展到整个窗口        [StructLayout(LayoutKind.Sequential)]
WPF中,如何将Vista Aero效果扩展到整个窗口        public struct RECT
WPF中,如何将Vista Aero效果扩展到整个窗口WPF中,如何将Vista Aero效果扩展到整个窗口        WPF中,如何将Vista Aero效果扩展到整个窗口{
WPF中,如何将Vista Aero效果扩展到整个窗口            public int left, top, right, bottom;
WPF中,如何将Vista Aero效果扩展到整个窗口
WPF中,如何将Vista Aero效果扩展到整个窗口            public RECT(int left, int top, int right, int bottom)
WPF中,如何将Vista Aero效果扩展到整个窗口WPF中,如何将Vista Aero效果扩展到整个窗口            WPF中,如何将Vista Aero效果扩展到整个窗口{
WPF中,如何将Vista Aero效果扩展到整个窗口                this.left = left;
WPF中,如何将Vista Aero效果扩展到整个窗口                this.top = top;
WPF中,如何将Vista Aero效果扩展到整个窗口                this.right = right;
WPF中,如何将Vista Aero效果扩展到整个窗口                this.bottom = bottom;
WPF中,如何将Vista Aero效果扩展到整个窗口            }
WPF中,如何将Vista Aero效果扩展到整个窗口        }
WPF中,如何将Vista Aero效果扩展到整个窗口    }

Demo, 要正确运行Demo,你应该使用开启Aero效果的Vista版本

上一篇:WPF中如何选择合适的元数据标记?(英文)


下一篇:a little about hashtable vs dictionary