WPF实现Aero毛玻璃效果

源码摘自 http://virtualrouter.codeplex.com

这是一个 .net的wifi工具创建笔记本共享wifi

/*
* Virtual Router v1.0 - http://virtualrouter.codeplex.com
* Wifi Hot Spot for Windows 8, 7 and 2008 R2
* Copyright (c) 2013 Chris Pietschmann (http://pietschsoft.com)
* Licensed under the Microsoft Public License (Ms-PL)
* http://virtualrouter.codeplex.com/license
*/
using System;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Media;

namespace VirtualRouterClient.AeroGlass
{
    public static class AeroGlassHelper
    {
        #region "Generic Static Methods"

        public static void ExtendGlass(IntPtr windowHandle)
        {
            ExtendGlass(windowHandle, -1, -1, -1, -1);
        }

        public static void ExtendGlass(IntPtr windowHandle, int left, int right, int top, int bottom)
        {
            internalExtendGlass(windowHandle, left, right, top, bottom);
        }

        private static int internalExtendGlass(IntPtr windowHandle, int left, int right, int top, int bottom)
        {
            var retVal = -1; // Returning less than zero will indicate that Aero Glass could not be extended

            // Calculate the Aero Glass Margins
            Win32.Margins margins = Win32.GetDpiAdjustedMargins(windowHandle, left, right, top, bottom);

            try
            {
                // Actually Enable Aero Glass
                retVal = Win32.DwmExtendFrameIntoClientArea(windowHandle, ref margins);
            }
            catch (Exception)
            {
                retVal = -1;
            }

            return retVal;
        }

        #endregion

        #region "WPF Static Methods"

        public static void ExtendGlass(Window win)
        {
            ExtendGlass(win, -1, -1, -1, -1);
        }

        public static void ExtendGlass(Window win, int left, int right, int top, int bottom)
        {
            Brush originalBackgroundBrush = win.Background;
            try
            {
                int retVal = -1;
                if (Win32.DwmIsCompositionEnabled())
                {
                    win.Background = Brushes.Transparent;

                    // Obtain the window handle for WPF application
                    WindowInteropHelper windowInterop = new WindowInteropHelper(win);
                    IntPtr windowHandle = windowInterop.Handle;

                    // Set the Window background to be Transparent so the Aero Glass will show through
                    HwndSource mainWindowSrc = HwndSource.FromHwnd(windowHandle);
                    mainWindowSrc.CompositionTarget.BackgroundColor = Colors.Transparent;

                    retVal = internalExtendGlass(windowHandle, left, right, top, bottom);
                }
                if (retVal < 0)
                {
                    throw new NotSupportedException("Operation Failed: Aero Glass Not Supported");
                }
            }
            catch
            {
                // If an error occurred then change the Window.Background back to what it was
                win.Background = originalBackgroundBrush;
            }
        }

        #endregion

        //#region "Windows.Forms Static Methods"

        //public static void ExtendGlass(Form form)
        //{
        //    ExtendGlass(form, -1, -1, -1, -1);
        //}

        //public static void ExtendGlass(Form form, int left, int right, int top, int bottom)
        //{
        //    System.Drawing.Color oldBackColor = form.BackColor;
        //    System.Drawing.Color oldTransparencyKey = form.TransparencyKey;

        //    int retVal = -1;

        //    try
        //    {
        //        form.TransparencyKey = System.Drawing.Color.Beige;
        //        form.BackColor = form.TransparencyKey;

        //        retVal = internalExtendGlass(form.Handle, left, right, top, bottom);
        //    }
        //    catch (Exception)
        //    {
        //        retVal = -1;
        //    }

        //    if (retVal < 0)
        //    {
        //        form.BackColor = oldBackColor;
        //        form.TransparencyKey = oldTransparencyKey;
        //    }
        //}

        //#endregion

        #region "Win32 / pinvoke"
        
        private static class Win32
        {
            [DllImport("DwmApi.dll")]
            public static extern int DwmExtendFrameIntoClientArea(IntPtr hwnd, ref Margins margins);

            [DllImport("dwmapi.dll", PreserveSig = false)]
            public static extern bool DwmIsCompositionEnabled();


            [StructLayout(LayoutKind.Sequential)]
            public struct Margins
            {
                public int Left;    // width of left border that retains its size
                public int Right;   // width of right border that retains its size
                public int Top;     // height of top border that retains its size
                public int Bottom;  // height of bottom border that retains its size
            }

            public static Win32.Margins GetDpiAdjustedMargins(IntPtr windowHandle, int left, int right, int top, int bottom)
            {
                float DesktopDpiX;
                float DesktopDpiY;
                // Get System Dpi
                using (System.Drawing.Graphics desktop = System.Drawing.Graphics.FromHwnd(windowHandle))
                {
                    DesktopDpiX = desktop.DpiX;
                    DesktopDpiY = desktop.DpiY;
                }

                // Set Margins
                Win32.Margins margins = new Win32.Margins();
                
                // Note that the default desktop Dpi is 96dpi. The  margins are
                // adjusted for the system Dpi.
                margins.Left = Convert.ToInt32(left * (DesktopDpiX / 96));
                margins.Right = Convert.ToInt32(right * (DesktopDpiX / 96));
                margins.Top = Convert.ToInt32(top * (DesktopDpiX / 96));
                margins.Bottom = Convert.ToInt32(bottom * (DesktopDpiX / 96));

                return margins;
            }
        }

        #endregion
    }
}

使用方法

在 window_Loaded 里 

AeroGlassHelper.ExtendGlass(this);
//或
AeroGlassHelper.ExtendGlass(this, (int)windowContent.Margin.Left, (int)windowContent.Margin.Right, (int)windowContent.Margin.Top, (int)windowContent.Margin.Bottom);


 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值