首页 > 代码库 > 玻璃效果

玻璃效果

封装好的帮助类,实现玻璃效果。

using System;using System.Collections.Generic;using System.Linq;using System.Runtime.InteropServices;using System.Text;using System.Windows;using System.Windows.Interop;using System.Windows.Media;namespace Test{    [StructLayout(LayoutKind.Sequential)]    public struct MARGINS    {        public int Left;        public int Right;        public int Top;        public int Bottom;        public MARGINS(Thickness t)        {            Left = (int)t.Left;            Right = (int)t.Right;            Top = (int)t.Top;            Bottom = (int)t.Bottom;        }    }    public class GlassHelper    {        [DllImport("dwmapi.dll", PreserveSig = false)]        static extern void DwmExtendFrameIntoClientArea(            IntPtr hWnd, ref MARGINS pMarInset);        [DllImport("dwmapi.dll", PreserveSig = false)]        static extern bool DwmIsCompositionEnabled();        public static bool ExtendGlassFrame(Window window, Thickness margin)        {            if (!DwmIsCompositionEnabled())                return false;            IntPtr hwnd = new WindowInteropHelper(window).Handle;            if (hwnd == IntPtr.Zero)                throw new InvalidOperationException(                    "The Window must be shown before extending glass");            //Set the backgroud to transparent from both the WPF and Win32 perspectives            window.Background = Brushes.Transparent;            HwndSource.FromHwnd(hwnd).CompositionTarget.BackgroundColor = Colors.Transparent;            MARGINS margins = new MARGINS(margin);            DwmExtendFrameIntoClientArea(hwnd, ref margins);            return true;        }    }}

 

这个方法不仅必须在初始化的时候调用,也必须在禁用或者重新启用桌面合成之后调用。用户操作或者由远程桌面这样的东西触发,都可能导致禁用或者重新启用桌面合成。为了能收到桌面合成事件,你需要截获一条Win32消息(WM_DWMCOMPOSITIONCHANGED)。

 

调用方法如下

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Interop;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;namespace Test_7_3_2{    /// <summary>    /// MainWindow.xaml 的交互逻辑    /// </summary>    public partial class MainWindow : Window    {        private const int WM_DWMCOMPOSITIONCHANGED = 0x031E;        public MainWindow()        {            InitializeComponent();        }        protected override void OnSourceInitialized(EventArgs e)        {            base.OnSourceInitialized(e);            //This can‘t be done any earlier than the SourceInitialized event            GlassHelper.ExtendGlassFrame(this, new Thickness(-1));            //Attach a window procedure in order to detect later enabling of desktop composition            IntPtr hwnd = new WindowInteropHelper(this).Handle;            HwndSource.FromHwnd(hwnd).AddHook(new HwndSourceHook(WndProc));        }        private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)        {            if(msg == WM_DWMCOMPOSITIONCHANGED)            {                //Reenable glass                GlassHelper.ExtendGlassFrame(this, new Thickness(-1));                handled = true;            }            return IntPtr.Zero;        }    }}