添加 自定义菜单图标
This commit is contained in:
175
Util/AeroGlassHelper.cs
Normal file
175
Util/AeroGlassHelper.cs
Normal file
@@ -0,0 +1,175 @@
|
||||
/*
|
||||
* 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 GeekDesk.Util
|
||||
{
|
||||
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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user