Vista下将Area效果应用到整个窗体
 

最近在找其它资源时,无意间发现了一个程序可以将Area效果应用到整个窗体。感觉挺有意思,看了一下代码还是挺简单的。
C# Vista下将Area效果应用到整个窗体_休闲

首先需要两个API,DwmIsCompositionEnabled和DwmExtendFrameIntoClientArea。
DwmIsCompositionEnabled是用来判断系统是否开启了Area效果,当为False时为没有开启,这时有两种情况一个是系统不支持,另外一种是用户手动关闭了效果。如果是用户手动关闭的,你仍然可以使你的程序具有Area效果。否则是不可以的。
DwmExtendFrameIntoClientArea是用来使你的窗体具有Area效果,可以是整个窗体,也可以是窗体的一部分。这个函数的第一个参数是需要应用Area效果窗体的Handle,第二个参数是一个MARGINS结构可以指定在窗体的什么部位应用Area效果,如果是全部可以设置为-1,如果取消Area效果可以设置为0。
下面看一下这两个API的声明。
1C# Vista下将Area效果应用到整个窗体_休闲_02         [DllImport("dwmapi.dll", PreserveSig =false)]
2C# Vista下将Area效果应用到整个窗体_休闲_02        staticexternvoid DwmExtendFrameIntoClientArea(IntPtr hwnd, ref MARGINS margins);
3C# Vista下将Area效果应用到整个窗体_休闲_02
4C# Vista下将Area效果应用到整个窗体_休闲_02         [DllImport("dwmapi.dll", PreserveSig =false)]
5C# Vista下将Area效果应用到整个窗体_休闲_02        staticexternbool DwmIsCompositionEnabled();
下面就是实现的代码了。
设置Area效果
1C# Vista下将Area效果应用到整个窗体_休闲_02        publicstaticbool Enable(Window window)
2C# Vista下将Area效果应用到整个窗体_休闲_08C# Vista下将Area效果应用到整个窗体_Area效果_09        C# Vista下将Area效果应用到整个窗体_C#_10{
3C# Vista下将Area效果应用到整个窗体_休闲_11            try
4C# Vista下将Area效果应用到整个窗体_Area效果_12C# Vista下将Area效果应用到整个窗体_C#_13            C# Vista下将Area效果应用到整个窗体_C#_10{
5C# Vista下将Area效果应用到整个窗体_休闲_11                if (!DwmIsCompositionEnabled())
6C# Vista下将Area效果应用到整个窗体_休闲_11                    returnfalse;
7C# Vista下将Area效果应用到整个窗体_休闲_11
8C# Vista下将Area效果应用到整个窗体_休闲_11                 IntPtr hwnd =new WindowInteropHelper(window).Handle;
9C# Vista下将Area效果应用到整个窗体_休闲_11                if (hwnd == IntPtr.Zero)
10C# Vista下将Area效果应用到整个窗体_休闲_11                    thrownew InvalidOperationException("The Window must be shown before extending glass.");
11C# Vista下将Area效果应用到整个窗体_休闲_11
12C# Vista下将Area效果应用到整个窗体_休闲_11                // Set the background to transparent from both the WPF and Win32 perspectives
13C# Vista下将Area效果应用到整个窗体_休闲_11                 window.Background = System.Windows.Media.Brushes.Transparent;
14C# Vista下将Area效果应用到整个窗体_休闲_11                 HwndSource.FromHwnd(hwnd).CompositionTarget.BackgroundColor = Colors.Transparent;
15C# Vista下将Area效果应用到整个窗体_休闲_11
16C# Vista下将Area效果应用到整个窗体_休闲_11                 MARGINS margins =new MARGINS(-1);
17C# Vista下将Area效果应用到整个窗体_休闲_11                 DwmExtendFrameIntoClientArea(hwnd, ref margins);
18C# Vista下将Area效果应用到整个窗体_休闲_11                returntrue;
19C# Vista下将Area效果应用到整个窗体_Area效果_29             }

20C# Vista下将Area效果应用到整个窗体_休闲_11            catch (Exception ex)
21C# Vista下将Area效果应用到整个窗体_Area效果_12C# Vista下将Area效果应用到整个窗体_C#_13            C# Vista下将Area效果应用到整个窗体_C#_10{
22C# Vista下将Area效果应用到整个窗体_休闲_11                // could not change glass, but continue                   
23C# Vista下将Area效果应用到整个窗体_休闲_11                 System.Diagnostics.Debug.WriteLine(ex.Message);
24C# Vista下将Area效果应用到整个窗体_休闲_11                returnfalse;
25C# Vista下将Area效果应用到整个窗体_Area效果_29             }

26C# Vista下将Area效果应用到整个窗体_Area效果_38         }

取消Area效果

1C# Vista下将Area效果应用到整个窗体_休闲_02        publicstaticbool Disable(Window window)
2C# Vista下将Area效果应用到整个窗体_休闲_08C# Vista下将Area效果应用到整个窗体_Area效果_09        C# Vista下将Area效果应用到整个窗体_C#_10{
3C# Vista下将Area效果应用到整个窗体_休闲_11            try
4C# Vista下将Area效果应用到整个窗体_Area效果_12C# Vista下将Area效果应用到整个窗体_C#_13            C# Vista下将Area效果应用到整个窗体_C#_10{
5C# Vista下将Area效果应用到整个窗体_休闲_11                if (!DwmIsCompositionEnabled())
6C# Vista下将Area效果应用到整个窗体_休闲_11                    returnfalse;
7C# Vista下将Area效果应用到整个窗体_休闲_11
8C# Vista下将Area效果应用到整个窗体_休闲_11                 IntPtr hwnd =new WindowInteropHelper(window).Handle;
9C# Vista下将Area效果应用到整个窗体_休闲_11                if (hwnd == IntPtr.Zero)
10C# Vista下将Area效果应用到整个窗体_休闲_11                    thrownew InvalidOperationException("The Window must be shown before extending glass.");
11C# Vista下将Area效果应用到整个窗体_休闲_11
12C# Vista下将Area效果应用到整个窗体_休闲_11                // Set the background to transparent from both the WPF and Win32 perspectives
13C# Vista下将Area效果应用到整个窗体_休闲_11                 window.Background =new SolidColorBrush(System.Windows.SystemColors.WindowColor);
14C# Vista下将Area效果应用到整个窗体_休闲_11                 HwndSource.FromHwnd(hwnd).CompositionTarget.BackgroundColor = System.Windows.SystemColors.WindowColor;
15C# Vista下将Area效果应用到整个窗体_休闲_11
16C# Vista下将Area效果应用到整个窗体_休闲_11                 MARGINS margins =new MARGINS(0);
17C# Vista下将Area效果应用到整个窗体_休闲_11                 DwmExtendFrameIntoClientArea(hwnd, ref margins);
18C# Vista下将Area效果应用到整个窗体_休闲_11                returntrue;
19C# Vista下将Area效果应用到整个窗体_Area效果_29             }

20C# Vista下将Area效果应用到整个窗体_休闲_11            catch (Exception ex)
21C# Vista下将Area效果应用到整个窗体_Area效果_12C# Vista下将Area效果应用到整个窗体_C#_13            C# Vista下将Area效果应用到整个窗体_C#_10{
22C# Vista下将Area效果应用到整个窗体_休闲_11                // could not change glass, but continue                   
23C# Vista下将Area效果应用到整个窗体_休闲_11                 System.Diagnostics.Debug.WriteLine(ex.Message);
24C# Vista下将Area效果应用到整个窗体_休闲_11                returnfalse;
25C# Vista下将Area效果应用到整个窗体_Area效果_29             }

26C# Vista下将Area效果应用到整个窗体_Area效果_38         }