/************************************************************************************* Extended WPF Toolkit Copyright (C) 2007-2013 Xceed Software Inc. This program is provided to you under the terms of the Microsoft Public License (Ms-PL) as published at http://wpftoolkit.codeplex.com/license For more features, controls, and fast professional support, pick up the Plus Edition at http://xceed.com/wpf_toolkit Stay informed: follow @datagrid on Twitter or Like http://facebook.com/datagrids ***********************************************************************************/ namespace Microsoft.Windows.Shell { using System; using System.Windows; 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 ) ); } 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 ); } public static void CloseWindow( Window window ) { Verify.IsNotNull( window, "window" ); _PostSystemCommand( window, SC.CLOSE ); } public static void MaximizeWindow( Window window ) { Verify.IsNotNull( window, "window" ); _PostSystemCommand( window, SC.MAXIMIZE ); } public static void MinimizeWindow( Window window ) { Verify.IsNotNull( window, "window" ); _PostSystemCommand( window, SC.MINIMIZE ); } public static void RestoreWindow( Window window ) { Verify.IsNotNull( window, "window" ); _PostSystemCommand( window, SC.RESTORE ); } /// Display the system menu at a specified location. /// The location to display the system menu, in logical screen coordinates. public static void ShowSystemMenu( Window window, Point screenLocation ) { Verify.IsNotNull( window, "window" ); ShowSystemMenuPhysicalCoordinates( window, DpiHelper.LogicalPixelsToDevice( screenLocation ) ); } 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 ); } } } }