|
namespace System.Windows
{
using System;
using System.Security;
using System.Security.Permissions;
using System.Windows.Input;
using System.Windows.Interop;
using Standard;
public static class SystemCommands
{
public static RoutedCommand CloseWindowCommand { get; private set; }
public static RoutedCommand MaximizeWindowCommand { get; private set; }
public static RoutedCommand MinimizeWindowCommand { get; private set; }
public static RoutedCommand RestoreWindowCommand { get; private set; }
public static RoutedCommand ShowSystemMenuCommand { get; private set; }
static SystemCommands()
{
CloseWindowCommand = new RoutedCommand("CloseWindow", typeof(SystemCommands));
MaximizeWindowCommand = new RoutedCommand("MaximizeWindow", typeof(SystemCommands));
MinimizeWindowCommand = new RoutedCommand("MinimizeWindow", typeof(SystemCommands));
RestoreWindowCommand = new RoutedCommand("RestoreWindow", typeof(SystemCommands));
ShowSystemMenuCommand = new RoutedCommand("ShowSystemMenu", typeof(SystemCommands));
}
/// <SecurityNote>
/// Critical : Calls critical methods
/// <SecurityNote>
[SecurityCritical]
private static void _PostSystemCommand(Window window, SC command)
{
IntPtr hwnd = new WindowInteropHelper(window).Handle;
if (hwnd == IntPtr.Zero || !NativeMethods.IsWindow(hwnd))
{
return;
}
NativeMethods.PostMessage(hwnd, WM.SYSCOMMAND, new IntPtr((int)command), IntPtr.Zero);
}
/// <SecurityNote>
/// Critical : Calls critical methods
/// Safe : Demands full trust permissions
/// <SecurityNote>
[SecuritySafeCritical]
[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
public static void CloseWindow(Window window)
{
Verify.IsNotNull(window, "window");
_PostSystemCommand(window, SC.CLOSE);
}
/// <SecurityNote>
/// Critical : Calls critical methods
/// Safe : Demands full trust permissions
/// <SecurityNote>
[SecuritySafeCritical]
[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
public static void MaximizeWindow(Window window)
{
Verify.IsNotNull(window, "window");
_PostSystemCommand(window, SC.MAXIMIZE);
}
/// <SecurityNote>
/// Critical : Calls critical methods
/// Safe : Demands full trust permissions
/// <SecurityNote>
[SecuritySafeCritical]
[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
public static void MinimizeWindow(Window window)
{
Verify.IsNotNull(window, "window");
_PostSystemCommand(window, SC.MINIMIZE);
}
/// <SecurityNote>
/// Critical : Calls critical methods
/// Safe : Demands full trust permissions
/// <SecurityNote>
[SecuritySafeCritical]
[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
public static void RestoreWindow(Window window)
{
Verify.IsNotNull(window, "window");
_PostSystemCommand(window, SC.RESTORE);
}
/// <summary>Display the system menu at a specified location.</summary>
/// <param name="screenLocation">The location to display the system menu, in logical screen coordinates.</param>
/// <SecurityNote>
/// Critical : Calls critical methods
/// Safe : Demands full trust permissions
/// <SecurityNote>
[SecuritySafeCritical]
[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
public static void ShowSystemMenu(Window window, Point screenLocation)
{
Verify.IsNotNull(window, "window");
DpiScale dpi = window.GetDpi();
ShowSystemMenuPhysicalCoordinates(window, DpiHelper.LogicalPixelsToDevice(screenLocation, dpi.DpiScaleX, dpi.DpiScaleY));
}
/// <SecurityNote>
/// Critical : Calls critical methods
/// <SecurityNote>
[SecurityCritical]
internal static void ShowSystemMenuPhysicalCoordinates(Window window, Point physicalScreenLocation)
{
const uint TPM_RETURNCMD = 0x0100;
const uint TPM_LEFTBUTTON = 0x0;
Verify.IsNotNull(window, "window");
IntPtr hwnd = new WindowInteropHelper(window).Handle;
if (hwnd == IntPtr.Zero || !NativeMethods.IsWindow(hwnd))
{
return;
}
IntPtr hmenu = NativeMethods.GetSystemMenu(hwnd, false);
uint cmd = NativeMethods.TrackPopupMenuEx(hmenu, TPM_LEFTBUTTON | TPM_RETURNCMD, (int)physicalScreenLocation.X, (int)physicalScreenLocation.Y, hwnd, IntPtr.Zero);
if (0 != cmd)
{
NativeMethods.PostMessage(hwnd, WM.SYSCOMMAND, new IntPtr(cmd), IntPtr.Zero);
}
}
}
}
|