(view source code of printwindow.cs as plain text)
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
namespace RobvanderWoude
{
class PrintWindow
{
static readonly string progver = "1.01";
static bool debug = false;
static string matchingtitle = string.Empty;
static int Main( string[] args )
{
string windowtitle = string.Empty;
string outputfile = string.Empty;
string exact = "partial ";
bool exacttitle = false;
bool openscreenshot = false;
int correctionBottom = 0;
int correctionLeft = 0;
int correctionRight = 0;
int correctionTop = 0;
#region Parse and Validate Command Line
foreach ( string arg in args )
{
if ( arg[0] == '/' )
{
switch ( arg.ToUpper( ) )
{
case "/?":
return ShowHelp( );
case "/D":
case "/DEBUG":
if ( debug )
{
return ShowHelp( "Duplicate switch /D" );
}
debug = true;
break;
case "/O":
case "/OPEN":
if ( openscreenshot )
{
return ShowHelp( "Duplicate switch /O" );
}
openscreenshot = true;
break;
case "/X":
case "/EXACT":
if ( exacttitle )
{
return ShowHelp( "Duplicate switch /X" );
}
exacttitle = true;
exact = "exact ";
break;
default:
if ( arg.ToUpper( ).Substring( 0, 3 ) == "/C:" )
{
if ( correctionBottom != 0 || correctionLeft != 0 || correctionRight != 0 || correctionTop != 0 )
{
return ShowHelp( "Duplicate switch /C" );
}
string pattern = @"""?-?\d+,-?\d+,-?\d+,-?\d+""?";
Regex regex = new Regex( pattern );
if ( regex.IsMatch( arg.ToUpper( ).Substring( 3, arg.Length - 3 ) ) )
{
string[] corrections = arg.Substring( 3 ).Replace( "\"", "" ).Split( ",".ToCharArray( ) );
if ( !Int32.TryParse( corrections[0], out correctionTop ) || !Int32.TryParse( corrections[1], out correctionRight ) || !Int32.TryParse( corrections[2], out correctionBottom ) || !Int32.TryParse( corrections[3], out correctionLeft ) )
{
return ShowHelp( "Invalid values for /C switch" );
}
}
else
{
return ShowHelp( "Invalid values for /C switch" );
}
break;
}
else
{
return ShowHelp( "Invalid switch \"{0}\"", arg );
}
}
}
else
{
if ( string.IsNullOrWhiteSpace( windowtitle ) )
{
// First unnamed argument is title
windowtitle = arg;
}
else if ( string.IsNullOrWhiteSpace( outputfile ) )
{
// Second unnamed argument is output file
outputfile = arg;
}
else
{
// No third unnamed argument allowed
return ShowHelp( "Invalid unnamed argument \"{0}\"", arg );
}
}
}
if ( string.IsNullOrWhiteSpace( outputfile ) )
{
return ShowHelp( "Please specify an output file" );
}
if ( !Directory.Exists( Directory.GetParent( outputfile ).FullName ) )
{
return ShowHelp( "Parent folder of specified output file not found" );
}
#if DEBUG
debug = true;
#endif
#endregion Parse and validate Command Line
// Delete the specified output file if it already exists
if ( File.Exists( outputfile ) )
{
File.Delete( outputfile );
}
// Find the window with the specified title
IntPtr handle = FindWindow( windowtitle, exacttitle );
if ( handle == IntPtr.Zero )
{
return ShowHelp( "No window was found with {0}title \"{1}\"", exact, windowtitle );
}
else
{
if ( debug && !exacttitle )
{
Console.WriteLine( "Specified title : \"{0}\"\nMatching title : \"{1}\"\n", windowtitle, matchingtitle );
}
// If found, make it the foreground window
if ( SetForegroundWindow( handle ) )
{
// First find the required correction values for the GetWindowRect function
// Get a single system metric value
int rectXcorrection = 8;
int rectYcorrection = 8;
rectXcorrection = GetSystemMetricByName( "SM_CXFRAME", rectXcorrection );
rectYcorrection = GetSystemMetricByName( "SM_CYFRAME", rectYcorrection );
if ( debug )
{
Console.WriteLine( "Window size correction X,Y: {0},{1}", rectXcorrection, rectYcorrection );
}
// Get the window position and size
SetProcessDPIAware( );
GetWindowRect( handle, out Rectangle rect );
// Returned coordinates of lower right window corner relative to upper left corner of
// screen, so subtract coordinates of upper left window corner to get width and height
rect.Width -= rect.X - 2 - correctionRight + correctionLeft;
rect.Height -= rect.Y - 1 - correctionBottom + correctionTop;
rect.X += correctionLeft;
rect.Y += correctionTop;
if ( debug )
{
Console.WriteLine( "X = {0}\nY = {1}\nWidth = {2}\nHeight = {3}\n", rect.X, rect.Y, rect.Width, rect.Height );
}
// Subtract another 16 to correct for an error in Windows 7 and later
//rect.Width -= 16;
rect.Width -= 2 * rectXcorrection;
// Likewise for Height, though Y of upper left window corner is correct so we only need to correct by 8 instead of 16
//rect.Height -= 8;
rect.Height -= rectYcorrection;
if ( debug )
{
Console.WriteLine( "X = {0}\nY = {1}\nWidth = {2}\nHeight = {3}\n", rect.X, rect.Y, rect.Width, rect.Height );
}
// Based on code by Ali Hamdar (http://alihamdar.com/)
// http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/79efecc4-fa6d-4078-afe4-bb1379bb968b
using ( Bitmap printscreen = new Bitmap( rect.Width, rect.Height ) )
{
Graphics graphics = Graphics.FromImage( (Image) printscreen );
if ( debug )
{
Console.WriteLine( "graphics.CopyFromScreen( {0}, {1}, {2}, {3}, {4} )", rect.X, rect.Y, 0, 0, printscreen.Size );
}
// Real Width is measured Width - 2 * rectXcorrection, shift X of left window position by rectXcorrection
graphics.CopyFromScreen( rect.X + rectXcorrection - 1, rect.Y, 0, 0, printscreen.Size );
printscreen.Save( outputfile, ImageFormat.Jpeg );
}
if ( debug || openscreenshot )
{
Process.Start( outputfile );
}
}
else
{
return ShowHelp( "Unable to move the specified window to the foreground" );
}
}
return 0;
}
static IntPtr FindWindow( string title, bool exacttitlematch = false )
{
foreach ( Process process in Process.GetProcesses( ) )
{
if ( process.MainWindowTitle.Equals( title ) )
{
return process.MainWindowHandle; // Return the FIRST matching window
}
else if ( !exacttitlematch )
{
if ( process.MainWindowTitle.Contains( title ) )
{
matchingtitle = process.MainWindowTitle;
return process.MainWindowHandle; // Return the FIRST matching window
}
}
}
return IntPtr.Zero; // In case no matching title was found
}
static int GetSystemMetricByName( string systemmetricname, int defaultvalue = 0 )
{
int systemmetricvalue = defaultvalue;
if ( Enum.TryParse<SystemMetric>( systemmetricname, true, out SystemMetric systemmetric ) )
{
systemmetricvalue = GetSystemMetrics( systemmetric );
}
return systemmetricvalue;
}
#region DLL Imports
[DllImport( "user32.dll" )]
private static extern bool SetProcessDPIAware( );
[DllImport( "user32.dll", SetLastError = true )]
[return: MarshalAs( UnmanagedType.Bool )]
//static extern bool GetWindowRect( HandleRef hWnd, out Rectangle lpRect );
static extern bool GetWindowRect( IntPtr hWnd, out Rectangle lpRect );
[DllImport( "user32.dll" )]
[return: MarshalAs( UnmanagedType.Bool )]
static extern bool SetForegroundWindow( IntPtr hWnd );
[DllImport( "user32.dll" )]
static extern int GetSystemMetrics( SystemMetric smIndex );
#endregion DLL Imports
#region Error handling
static int ShowHelp( params string[] errmsg )
{
#region Error Message
if ( errmsg.Length > 0 )
{
List<string> errargs = new List<string>( errmsg );
errargs.RemoveAt( 0 );
Console.Error.WriteLine( );
Console.ForegroundColor = ConsoleColor.Red;
Console.Error.Write( "ERROR:\t" );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.WriteLine( errmsg[0], errargs.ToArray( ) );
Console.ResetColor( );
}
#endregion Error Message
#region Help Text
/*
PrintWindow.exe, Version 1.01
Take a screenshot of the specified window
Usage: PrintWindow.exe title outputfile [ options ]
Where: title is the window title
outputfile is the file to contain the screenshot
Options: /C:"T,R,B,L" Correct screenshot dimensions for Top, Right,
Bottom, Left in pixels, e.g. /C:"-1,1,1,-1" to
add 1 pixel at each side (note the minus sign)
/D Debug mode: show the screen coordinates used
/O Open the resulting output file (implied with /D)
/X window title and specified title must match eXactly
(default: window title contains specified title)
Credits: Get window position and size
https://stackoverflow.com/a/1434577
Screenshot based on code by Ali Hamdar (http://alihamdar.com/)
http://social.msdn.microsoft.com/Forums/en/csharpgeneral
/thread/79efecc4-fa6d-4078-afe4-bb1379bb968b
SystemMetric enumeration published by Gabriel T. Sharp on PInvoke.net
http://pinvoke.net/default.aspx/Enums/SystemMetric.html
Note: Return code -1 in case of errors, otherwise 0.
Written by Rob van der Woude
https://www.robvanderwoude.com
*/
#endregion Help Text
#region Display Help Text
Console.Error.WriteLine( );
Console.Error.WriteLine( "PrintWindow.exe, Version {0}", progver );
Console.Error.WriteLine( "Take a screenshot of the specified window" );
Console.Error.WriteLine( );
Console.Error.Write( "Usage: " );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.WriteLine( "PrintWindow.exe title outputfile [ options ]" );
Console.ResetColor( );
Console.Error.WriteLine( );
Console.Write( "Where: " );
Console.ForegroundColor = ConsoleColor.White;
Console.Write( "title " );
Console.ResetColor( );
Console.WriteLine( "is the window title" );
Console.ForegroundColor = ConsoleColor.White;
Console.Write( " outputfile " );
Console.ResetColor( );
Console.WriteLine( "is the file to contain the screenshot" );
Console.Error.WriteLine( );
Console.Error.Write( "Options: " );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( "/C:\"T,R,B,L\" C" );
Console.ResetColor( );
Console.Error.Write( "orrect screenshot dimensions for " );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( "T" );
Console.ResetColor( );
Console.Error.Write( "op, " );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( "R" );
Console.ResetColor( );
Console.Error.WriteLine( "ight," );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( " B" );
Console.ResetColor( );
Console.Error.Write( "ottom, " );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( "L" );
Console.ResetColor( );
Console.Error.Write( "eft in pixels, e.g. " );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( "/C:\"-1,1,1,-1\" " );
Console.ResetColor( );
Console.Error.WriteLine( "to" );
Console.Error.WriteLine( " add 1 pixel at each side (note the minus sign)" );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( " /D D" );
Console.ResetColor( );
Console.Error.WriteLine( "ebug mode: show the screen coordinates used" );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( " /O O" );
Console.ResetColor( );
Console.Error.Write( "pen the resulting output file (implied with " );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( "/D" );
Console.ResetColor( );
Console.Error.WriteLine( ")" );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( " /X " );
Console.ResetColor( );
Console.Error.Write( "window title and specified title must match e" );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( "X" );
Console.ResetColor( );
Console.Error.WriteLine( "actly" );
Console.Error.Write( " (default: window title " );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( "contains " );
Console.ResetColor( );
Console.Error.WriteLine( "specified title)" );
Console.Error.WriteLine( );
Console.Error.WriteLine( "Credits: Get window position and size" );
Console.ForegroundColor = ConsoleColor.DarkGray;
Console.Error.WriteLine( " https://stackoverflow.com/a/1434577" );
Console.ResetColor( );
Console.Error.Write( " Screenshot based on code by Ali Hamdar (" );
Console.ForegroundColor = ConsoleColor.DarkGray;
Console.Error.Write( "http://alihamdar.com/" );
Console.ResetColor( );
Console.Error.WriteLine( ")" );
Console.ForegroundColor = ConsoleColor.DarkGray;
Console.Error.WriteLine( " http://social.msdn.microsoft.com/Forums/en/csharpgeneral" );
Console.Error.WriteLine( " /thread/79efecc4-fa6d-4078-afe4-bb1379bb968b" );
Console.ResetColor( );
Console.Error.WriteLine( " SystemMetric enumeration published by Gabriel T. Sharp on PInvoke.net" );
Console.ForegroundColor = ConsoleColor.DarkGray;
Console.Error.WriteLine( " http://pinvoke.net/default.aspx/Enums/SystemMetric.html" );
Console.ResetColor( );
Console.Error.WriteLine( );
Console.Error.WriteLine( "Note: Return code -1 in case of errors, otherwise 0." );
Console.Error.WriteLine( );
Console.Error.WriteLine( "Written by Rob van der Woude" );
Console.Error.WriteLine( "https://www.robvanderwoude.com" );
#endregion Display Help Text
return -1;
}
#endregion Error handling
/// <summary>
/// Flags used with the Windows API (User32.dll):GetSystemMetrics(SystemMetric smIndex)
///
/// This Enum and declaration signature was written by Gabriel T. Sharp
/// ai_productions@verizon.net or osirisgothra@hotmail.com
/// Obtained on pinvoke.net, please contribute your code to support the wiki!
/// </summary>
public enum SystemMetric : int
{
/// <summary>
/// The flags that specify how the system arranged minimized windows. For more information, see the Remarks section in this topic.
/// </summary>
SM_ARRANGE = 56,
/// <summary>
/// The value that specifies how the system is started:
/// 0 Normal boot
/// 1 Fail-safe boot
/// 2 Fail-safe with network boot
/// A fail-safe boot (also called SafeBoot, Safe Mode, or Clean Boot) bypasses the user startup files.
/// </summary>
SM_CLEANBOOT = 67,
/// <summary>
/// The number of display monitors on a desktop. For more information, see the Remarks section in this topic.
/// </summary>
SM_CMONITORS = 80,
/// <summary>
/// The number of buttons on a mouse, or zero if no mouse is installed.
/// </summary>
SM_CMOUSEBUTTONS = 43,
/// <summary>
/// The width of a window border, in pixels. This is equivalent to the SM_CXEDGE value for windows with the 3-D look.
/// </summary>
SM_CXBORDER = 5,
/// <summary>
/// The width of a cursor, in pixels. The system cannot create cursors of other sizes.
/// </summary>
SM_CXCURSOR = 13,
/// <summary>
/// This value is the same as SM_CXFIXEDFRAME.
/// </summary>
SM_CXDLGFRAME = 7,
/// <summary>
/// The width of the rectangle around the location of a first click in a double-click sequence, in pixels. ,
/// The second click must occur within the rectangle that is defined by SM_CXDOUBLECLK and SM_CYDOUBLECLK for the system
/// to consider the two clicks a double-click. The two clicks must also occur within a specified time.
/// To set the width of the double-click rectangle, call SystemParametersInfo with SPI_SETDOUBLECLKWIDTH.
/// </summary>
SM_CXDOUBLECLK = 36,
/// <summary>
/// The number of pixels on either side of a mouse-down point that the mouse pointer can move before a drag operation begins.
/// This allows the user to click and release the mouse button easily without unintentionally starting a drag operation.
/// If this value is negative, it is subtracted from the left of the mouse-down point and added to the right of it.
/// </summary>
SM_CXDRAG = 68,
/// <summary>
/// The width of a 3-D border, in pixels. This metric is the 3-D counterpart of SM_CXBORDER.
/// </summary>
SM_CXEDGE = 45,
/// <summary>
/// The thickness of the frame around the perimeter of a window that has a caption but is not sizable, in pixels.
/// SM_CXFIXEDFRAME is the height of the horizontal border, and SM_CYFIXEDFRAME is the width of the vertical border.
/// This value is the same as SM_CXDLGFRAME.
/// </summary>
SM_CXFIXEDFRAME = 7,
/// <summary>
/// The width of the left and right edges of the focus rectangle that the DrawFocusRectdraws.
/// This value is in pixels.
/// Windows 2000: This value is not supported.
/// </summary>
SM_CXFOCUSBORDER = 83,
/// <summary>
/// This value is the same as SM_CXSIZEFRAME.
/// </summary>
SM_CXFRAME = 32,
/// <summary>
/// The width of the client area for a full-screen window on the primary display monitor, in pixels.
/// To get the coordinates of the portion of the screen that is not obscured by the system taskbar or by application desktop toolbars,
/// call the SystemParametersInfofunction with the SPI_GETWORKAREA value.
/// </summary>
SM_CXFULLSCREEN = 16,
/// <summary>
/// The width of the arrow bitmap on a horizontal scroll bar, in pixels.
/// </summary>
SM_CXHSCROLL = 21,
/// <summary>
/// The width of the thumb box in a horizontal scroll bar, in pixels.
/// </summary>
SM_CXHTHUMB = 10,
/// <summary>
/// The default width of an icon, in pixels. The LoadIcon function can load only icons with the dimensions
/// that SM_CXICON and SM_CYICON specifies.
/// </summary>
SM_CXICON = 11,
/// <summary>
/// The width of a grid cell for items in large icon view, in pixels. Each item fits into a rectangle of size
/// SM_CXICONSPACING by SM_CYICONSPACING when arranged. This value is always greater than or equal to SM_CXICON.
/// </summary>
SM_CXICONSPACING = 38,
/// <summary>
/// The default width, in pixels, of a maximized top-level window on the primary display monitor.
/// </summary>
SM_CXMAXIMIZED = 61,
/// <summary>
/// The default maximum width of a window that has a caption and sizing borders, in pixels.
/// This metric refers to the entire desktop. The user cannot drag the window frame to a size larger than these dimensions.
/// A window can override this value by processing the WM_GETMINMAXINFO message.
/// </summary>
SM_CXMAXTRACK = 59,
/// <summary>
/// The width of the default menu check-mark bitmap, in pixels.
/// </summary>
SM_CXMENUCHECK = 71,
/// <summary>
/// The width of menu bar buttons, such as the child window close button that is used in the multiple document interface, in pixels.
/// </summary>
SM_CXMENUSIZE = 54,
/// <summary>
/// The minimum width of a window, in pixels.
/// </summary>
SM_CXMIN = 28,
/// <summary>
/// The width of a minimized window, in pixels.
/// </summary>
SM_CXMINIMIZED = 57,
/// <summary>
/// The width of a grid cell for a minimized window, in pixels. Each minimized window fits into a rectangle this size when arranged.
/// This value is always greater than or equal to SM_CXMINIMIZED.
/// </summary>
SM_CXMINSPACING = 47,
/// <summary>
/// The minimum tracking width of a window, in pixels. The user cannot drag the window frame to a size smaller than these dimensions.
/// A window can override this value by processing the WM_GETMINMAXINFO message.
/// </summary>
SM_CXMINTRACK = 34,
/// <summary>
/// The amount of border padding for captioned windows, in pixels. Windows XP/2000: This value is not supported.
/// </summary>
SM_CXPADDEDBORDER = 92,
/// <summary>
/// The width of the screen of the primary display monitor, in pixels. This is the same value obtained by calling
/// GetDeviceCaps as follows: GetDeviceCaps( hdcPrimaryMonitor, HORZRES).
/// </summary>
SM_CXSCREEN = 0,
/// <summary>
/// The width of a button in a window caption or title bar, in pixels.
/// </summary>
SM_CXSIZE = 30,
/// <summary>
/// The thickness of the sizing border around the perimeter of a window that can be resized, in pixels.
/// SM_CXSIZEFRAME is the width of the horizontal border, and SM_CYSIZEFRAME is the height of the vertical border.
/// This value is the same as SM_CXFRAME.
/// </summary>
SM_CXSIZEFRAME = 32,
/// <summary>
/// The recommended width of a small icon, in pixels. Small icons typically appear in window captions and in small icon view.
/// </summary>
SM_CXSMICON = 49,
/// <summary>
/// The width of small caption buttons, in pixels.
/// </summary>
SM_CXSMSIZE = 52,
/// <summary>
/// The width of the virtual screen, in pixels. The virtual screen is the bounding rectangle of all display monitors.
/// The SM_XVIRTUALSCREEN metric is the coordinates for the left side of the virtual screen.
/// </summary>
SM_CXVIRTUALSCREEN = 78,
/// <summary>
/// The width of a vertical scroll bar, in pixels.
/// </summary>
SM_CXVSCROLL = 2,
/// <summary>
/// The height of a window border, in pixels. This is equivalent to the SM_CYEDGE value for windows with the 3-D look.
/// </summary>
SM_CYBORDER = 6,
/// <summary>
/// The height of a caption area, in pixels.
/// </summary>
SM_CYCAPTION = 4,
/// <summary>
/// The height of a cursor, in pixels. The system cannot create cursors of other sizes.
/// </summary>
SM_CYCURSOR = 14,
/// <summary>
/// This value is the same as SM_CYFIXEDFRAME.
/// </summary>
SM_CYDLGFRAME = 8,
/// <summary>
/// The height of the rectangle around the location of a first click in a double-click sequence, in pixels.
/// The second click must occur within the rectangle defined by SM_CXDOUBLECLK and SM_CYDOUBLECLK for the system to consider
/// the two clicks a double-click. The two clicks must also occur within a specified time. To set the height of the double-click
/// rectangle, call SystemParametersInfo with SPI_SETDOUBLECLKHEIGHT.
/// </summary>
SM_CYDOUBLECLK = 37,
/// <summary>
/// The number of pixels above and below a mouse-down point that the mouse pointer can move before a drag operation begins.
/// This allows the user to click and release the mouse button easily without unintentionally starting a drag operation.
/// If this value is negative, it is subtracted from above the mouse-down point and added below it.
/// </summary>
SM_CYDRAG = 69,
/// <summary>
/// The height of a 3-D border, in pixels. This is the 3-D counterpart of SM_CYBORDER.
/// </summary>
SM_CYEDGE = 46,
/// <summary>
/// The thickness of the frame around the perimeter of a window that has a caption but is not sizable, in pixels.
/// SM_CXFIXEDFRAME is the height of the horizontal border, and SM_CYFIXEDFRAME is the width of the vertical border.
/// This value is the same as SM_CYDLGFRAME.
/// </summary>
SM_CYFIXEDFRAME = 8,
/// <summary>
/// The height of the top and bottom edges of the focus rectangle drawn byDrawFocusRect.
/// This value is in pixels.
/// Windows 2000: This value is not supported.
/// </summary>
SM_CYFOCUSBORDER = 84,
/// <summary>
/// This value is the same as SM_CYSIZEFRAME.
/// </summary>
SM_CYFRAME = 33,
/// <summary>
/// The height of the client area for a full-screen window on the primary display monitor, in pixels.
/// To get the coordinates of the portion of the screen not obscured by the system taskbar or by application desktop toolbars,
/// call the SystemParametersInfo function with the SPI_GETWORKAREA value.
/// </summary>
SM_CYFULLSCREEN = 17,
/// <summary>
/// The height of a horizontal scroll bar, in pixels.
/// </summary>
SM_CYHSCROLL = 3,
/// <summary>
/// The default height of an icon, in pixels. The LoadIcon function can load only icons with the dimensions SM_CXICON and SM_CYICON.
/// </summary>
SM_CYICON = 12,
/// <summary>
/// The height of a grid cell for items in large icon view, in pixels. Each item fits into a rectangle of size
/// SM_CXICONSPACING by SM_CYICONSPACING when arranged. This value is always greater than or equal to SM_CYICON.
/// </summary>
SM_CYICONSPACING = 39,
/// <summary>
/// For double byte character set versions of the system, this is the height of the Kanji window at the bottom of the screen, in pixels.
/// </summary>
SM_CYKANJIWINDOW = 18,
/// <summary>
/// The default height, in pixels, of a maximized top-level window on the primary display monitor.
/// </summary>
SM_CYMAXIMIZED = 62,
/// <summary>
/// The default maximum height of a window that has a caption and sizing borders, in pixels. This metric refers to the entire desktop.
/// The user cannot drag the window frame to a size larger than these dimensions. A window can override this value by processing
/// the WM_GETMINMAXINFO message.
/// </summary>
SM_CYMAXTRACK = 60,
/// <summary>
/// The height of a single-line menu bar, in pixels.
/// </summary>
SM_CYMENU = 15,
/// <summary>
/// The height of the default menu check-mark bitmap, in pixels.
/// </summary>
SM_CYMENUCHECK = 72,
/// <summary>
/// The height of menu bar buttons, such as the child window close button that is used in the multiple document interface, in pixels.
/// </summary>
SM_CYMENUSIZE = 55,
/// <summary>
/// The minimum height of a window, in pixels.
/// </summary>
SM_CYMIN = 29,
/// <summary>
/// The height of a minimized window, in pixels.
/// </summary>
SM_CYMINIMIZED = 58,
/// <summary>
/// The height of a grid cell for a minimized window, in pixels. Each minimized window fits into a rectangle this size when arranged.
/// This value is always greater than or equal to SM_CYMINIMIZED.
/// </summary>
SM_CYMINSPACING = 48,
/// <summary>
/// The minimum tracking height of a window, in pixels. The user cannot drag the window frame to a size smaller than these dimensions.
/// A window can override this value by processing the WM_GETMINMAXINFO message.
/// </summary>
SM_CYMINTRACK = 35,
/// <summary>
/// The height of the screen of the primary display monitor, in pixels. This is the same value obtained by calling
/// GetDeviceCaps as follows: GetDeviceCaps( hdcPrimaryMonitor, VERTRES).
/// </summary>
SM_CYSCREEN = 1,
/// <summary>
/// The height of a button in a window caption or title bar, in pixels.
/// </summary>
SM_CYSIZE = 31,
/// <summary>
/// The thickness of the sizing border around the perimeter of a window that can be resized, in pixels.
/// SM_CXSIZEFRAME is the width of the horizontal border, and SM_CYSIZEFRAME is the height of the vertical border.
/// This value is the same as SM_CYFRAME.
/// </summary>
SM_CYSIZEFRAME = 33,
/// <summary>
/// The height of a small caption, in pixels.
/// </summary>
SM_CYSMCAPTION = 51,
/// <summary>
/// The recommended height of a small icon, in pixels. Small icons typically appear in window captions and in small icon view.
/// </summary>
SM_CYSMICON = 50,
/// <summary>
/// The height of small caption buttons, in pixels.
/// </summary>
SM_CYSMSIZE = 53,
/// <summary>
/// The height of the virtual screen, in pixels. The virtual screen is the bounding rectangle of all display monitors.
/// The SM_YVIRTUALSCREEN metric is the coordinates for the top of the virtual screen.
/// </summary>
SM_CYVIRTUALSCREEN = 79,
/// <summary>
/// The height of the arrow bitmap on a vertical scroll bar, in pixels.
/// </summary>
SM_CYVSCROLL = 20,
/// <summary>
/// The height of the thumb box in a vertical scroll bar, in pixels.
/// </summary>
SM_CYVTHUMB = 9,
/// <summary>
/// Nonzero if User32.dll supports DBCS; otherwise, 0.
/// </summary>
SM_DBCSENABLED = 42,
/// <summary>
/// Nonzero if the debug version of User.exe is installed; otherwise, 0.
/// </summary>
SM_DEBUG = 22,
/// <summary>
/// Nonzero if the current operating system is Windows 7 or Windows Server 2008 R2 and the Tablet PC Input
/// service is started; otherwise, 0. The return value is a bitmask that specifies the type of digitizer input supported by the device.
/// For more information, see Remarks.
/// Windows Server 2008, Windows Vista, and Windows XP/2000: This value is not supported.
/// </summary>
SM_DIGITIZER = 94,
/// <summary>
/// Nonzero if Input Method Manager/Input Method Editor features are enabled; otherwise, 0.
/// SM_IMMENABLED indicates whether the system is ready to use a Unicode-based IME on a Unicode application.
/// To ensure that a language-dependent IME works, check SM_DBCSENABLED and the system ANSI code page.
/// Otherwise the ANSI-to-Unicode conversion may not be performed correctly, or some components like fonts
/// or registry settings may not be present.
/// </summary>
SM_IMMENABLED = 82,
/// <summary>
/// Nonzero if there are digitizers in the system; otherwise, 0. SM_MAXIMUMTOUCHES returns the aggregate maximum of the
/// maximum number of contacts supported by every digitizer in the system. If the system has only single-touch digitizers,
/// the return value is 1. If the system has multi-touch digitizers, the return value is the number of simultaneous contacts
/// the hardware can provide. Windows Server 2008, Windows Vista, and Windows XP/2000: This value is not supported.
/// </summary>
SM_MAXIMUMTOUCHES = 95,
/// <summary>
/// Nonzero if the current operating system is the Windows XP, Media Center Edition, 0 if not.
/// </summary>
SM_MEDIACENTER = 87,
/// <summary>
/// Nonzero if drop-down menus are right-aligned with the corresponding menu-bar item; 0 if the menus are left-aligned.
/// </summary>
SM_MENUDROPALIGNMENT = 40,
/// <summary>
/// Nonzero if the system is enabled for Hebrew and Arabic languages, 0 if not.
/// </summary>
SM_MIDEASTENABLED = 74,
/// <summary>
/// Nonzero if a mouse is installed; otherwise, 0. This value is rarely zero, because of support for virtual mice and because
/// some systems detect the presence of the port instead of the presence of a mouse.
/// </summary>
SM_MOUSEPRESENT = 19,
/// <summary>
/// Nonzero if a mouse with a horizontal scroll wheel is installed; otherwise 0.
/// </summary>
SM_MOUSEHORIZONTALWHEELPRESENT = 91,
/// <summary>
/// Nonzero if a mouse with a vertical scroll wheel is installed; otherwise 0.
/// </summary>
SM_MOUSEWHEELPRESENT = 75,
/// <summary>
/// The least significant bit is set if a network is present; otherwise, it is cleared. The other bits are reserved for future use.
/// </summary>
SM_NETWORK = 63,
/// <summary>
/// Nonzero if the Microsoft Windows for Pen computing extensions are installed; zero otherwise.
/// </summary>
SM_PENWINDOWS = 41,
/// <summary>
/// This system metric is used in a Terminal Services environment to determine if the current Terminal Server session is
/// being remotely controlled. Its value is nonzero if the current session is remotely controlled; otherwise, 0.
/// You can use terminal services management tools such as Terminal Services Manager (tsadmin.msc) and shadow.exe to
/// control a remote session. When a session is being remotely controlled, another user can view the contents of that session
/// and potentially interact with it.
/// </summary>
SM_REMOTECONTROL = 0x2001,
/// <summary>
/// This system metric is used in a Terminal Services environment. If the calling process is associated with a Terminal Services
/// client session, the return value is nonzero. If the calling process is associated with the Terminal Services console session,
/// the return value is 0.
/// Windows Server 2003 and Windows XP: The console session is not necessarily the physical console.
/// For more information, seeWTSGetActiveConsoleSessionId.
/// </summary>
SM_REMOTESESSION = 0x1000,
/// <summary>
/// Nonzero if all the display monitors have the same color format, otherwise, 0. Two displays can have the same bit depth,
/// but different color formats. For example, the red, green, and blue pixels can be encoded with different numbers of bits,
/// or those bits can be located in different places in a pixel color value.
/// </summary>
SM_SAMEDISPLAYFORMAT = 81,
/// <summary>
/// This system metric should be ignored; it always returns 0.
/// </summary>
SM_SECURE = 44,
/// <summary>
/// The build number if the system is Windows Server 2003 R2; otherwise, 0.
/// </summary>
SM_SERVERR2 = 89,
/// <summary>
/// Nonzero if the user requires an application to present information visually in situations where it would otherwise present
/// the information only in audible form; otherwise, 0.
/// </summary>
SM_SHOWSOUNDS = 70,
/// <summary>
/// Nonzero if the current session is shutting down; otherwise, 0. Windows 2000: This value is not supported.
/// </summary>
SM_SHUTTINGDOWN = 0x2000,
/// <summary>
/// Nonzero if the computer has a low-end (slow) processor; otherwise, 0.
/// </summary>
SM_SLOWMACHINE = 73,
/// <summary>
/// Nonzero if the current operating system is Windows 7 Starter Edition, Windows Vista Starter, or Windows XP Starter Edition; otherwise, 0.
/// </summary>
SM_STARTER = 88,
/// <summary>
/// Nonzero if the meanings of the left and right mouse buttons are swapped; otherwise, 0.
/// </summary>
SM_SWAPBUTTON = 23,
/// <summary>
/// Nonzero if the current operating system is the Windows XP Tablet PC edition or if the current operating system is Windows Vista
/// or Windows 7 and the Tablet PC Input service is started; otherwise, 0. The SM_DIGITIZER setting indicates the type of digitizer
/// input supported by a device running Windows 7 or Windows Server 2008 R2. For more information, see Remarks.
/// </summary>
SM_TABLETPC = 86,
/// <summary>
/// The coordinates for the left side of the virtual screen. The virtual screen is the bounding rectangle of all display monitors.
/// The SM_CXVIRTUALSCREEN metric is the width of the virtual screen.
/// </summary>
SM_XVIRTUALSCREEN = 76,
/// <summary>
/// The coordinates for the top of the virtual screen. The virtual screen is the bounding rectangle of all display monitors.
/// The SM_CYVIRTUALSCREEN metric is the height of the virtual screen.
/// </summary>
SM_YVIRTUALSCREEN = 77,
}
}
}
page last modified: 2024-04-16; loaded in 0.0176 seconds