/************************************************************************************* 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 ***********************************************************************************/ /**************************************************************************\ Copyright Microsoft Corporation. All Rights Reserved. \**************************************************************************/ namespace Standard { using System; using System.ComponentModel; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Runtime.ConstrainedExecution; using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; using System.Security.Permissions; using System.Text; using Microsoft.Win32.SafeHandles; // Some COM interfaces and Win32 structures are already declared in the framework. // Interesting ones to remember in System.Runtime.InteropServices.ComTypes are: using FILETIME = System.Runtime.InteropServices.ComTypes.FILETIME; using IPersistFile = System.Runtime.InteropServices.ComTypes.IPersistFile; using IStream = System.Runtime.InteropServices.ComTypes.IStream; #region Native Values internal static class Win32Value { public const uint MAX_PATH = 260; public const uint INFOTIPSIZE = 1024; public const uint TRUE = 1; public const uint FALSE = 0; public const uint sizeof_WCHAR = 2; public const uint sizeof_CHAR = 1; public const uint sizeof_BOOL = 4; } /// /// HIGHCONTRAST flags /// [Flags] internal enum HCF { HIGHCONTRASTON = 0x00000001, AVAILABLE = 0x00000002, HOTKEYACTIVE = 0x00000004, CONFIRMHOTKEY = 0x00000008, HOTKEYSOUND = 0x00000010, INDICATOR = 0x00000020, HOTKEYAVAILABLE = 0x00000040, } /// /// BITMAPINFOHEADER Compression type. BI_*. /// internal enum BI { RGB = 0, } /// /// CombingRgn flags. RGN_* /// internal enum RGN { /// /// Creates the intersection of the two combined regions. /// AND = 1, /// /// Creates the union of two combined regions. /// OR = 2, /// /// Creates the union of two combined regions except for any overlapping areas. /// XOR = 3, /// /// Combines the parts of hrgnSrc1 that are not part of hrgnSrc2. /// DIFF = 4, /// /// Creates a copy of the region identified by hrgnSrc1. /// COPY = 5, } internal enum CombineRgnResult { ERROR = 0, NULLREGION = 1, SIMPLEREGION = 2, COMPLEXREGION = 3, } /// /// For IWebBrowser2. OLECMDEXECOPT_* /// internal enum OLECMDEXECOPT { DODEFAULT = 0, PROMPTUSER = 1, DONTPROMPTUSER = 2, SHOWHELP = 3 } /// /// For IWebBrowser2. OLECMDF_* /// internal enum OLECMDF { SUPPORTED = 1, ENABLED = 2, LATCHED = 4, NINCHED = 8, INVISIBLE = 16, DEFHIDEONCTXTMENU = 32 } /// /// For IWebBrowser2. OLECMDID_* /// internal enum OLECMDID { OPEN = 1, NEW = 2, SAVE = 3, SAVEAS = 4, SAVECOPYAS = 5, PRINT = 6, PRINTPREVIEW = 7, PAGESETUP = 8, SPELL = 9, PROPERTIES = 10, CUT = 11, COPY = 12, PASTE = 13, PASTESPECIAL = 14, UNDO = 15, REDO = 16, SELECTALL = 17, CLEARSELECTION = 18, ZOOM = 19, GETZOOMRANGE = 20, UPDATECOMMANDS = 21, REFRESH = 22, STOP = 23, HIDETOOLBARS = 24, SETPROGRESSMAX = 25, SETPROGRESSPOS = 26, SETPROGRESSTEXT = 27, SETTITLE = 28, SETDOWNLOADSTATE = 29, STOPDOWNLOAD = 30, ONTOOLBARACTIVATED = 31, FIND = 32, DELETE = 33, HTTPEQUIV = 34, HTTPEQUIV_DONE = 35, ENABLE_INTERACTION = 36, ONUNLOAD = 37, PROPERTYBAG2 = 38, PREREFRESH = 39, SHOWSCRIPTERROR = 40, SHOWMESSAGE = 41, SHOWFIND = 42, SHOWPAGESETUP = 43, SHOWPRINT = 44, CLOSE = 45, ALLOWUILESSSAVEAS = 46, DONTDOWNLOADCSS = 47, UPDATEPAGESTATUS = 48, PRINT2 = 49, PRINTPREVIEW2 = 50, SETPRINTTEMPLATE = 51, GETPRINTTEMPLATE = 52, PAGEACTIONBLOCKED = 55, PAGEACTIONUIQUERY = 56, FOCUSVIEWCONTROLS = 57, FOCUSVIEWCONTROLSQUERY = 58, SHOWPAGEACTIONMENU = 59 } /// /// For IWebBrowser2. READYSTATE_* /// enum READYSTATE { UNINITIALIZED = 0, LOADING = 1, LOADED = 2, INTERACTIVE = 3, COMPLETE = 4 } /// /// DATAOBJ_GET_ITEM_FLAGS. DOGIF_*. /// internal enum DOGIF { DEFAULT = 0x0000, TRAVERSE_LINK = 0x0001, // if the item is a link get the target NO_HDROP = 0x0002, // don't fallback and use CF_HDROP clipboard format NO_URL = 0x0004, // don't fallback and use URL clipboard format ONLY_IF_ONE = 0x0008, // only return the item if there is one item in the array } internal enum DWM_SIT { None, DISPLAYFRAME = 1, } [Flags] internal enum ErrorModes { /// Use the system default, which is to display all error dialog boxes. Default = 0x0, /// /// The system does not display the critical-error-handler message box. /// Instead, the system sends the error to the calling process. /// FailCriticalErrors = 0x1, /// /// 64-bit Windows: The system automatically fixes memory alignment faults and makes them /// invisible to the application. It does this for the calling process and any descendant processes. /// After this value is set for a process, subsequent attempts to clear the value are ignored. /// NoGpFaultErrorBox = 0x2, /// /// The system does not display the general-protection-fault message box. /// This flag should only be set by debugging applications that handle general /// protection (GP) faults themselves with an exception handler. /// NoAlignmentFaultExcept = 0x4, /// /// The system does not display a message box when it fails to find a file. /// Instead, the error is returned to the calling process. /// NoOpenFileErrorBox = 0x8000 } /// /// Non-client hit test values, HT* /// internal enum HT { ERROR = -2, TRANSPARENT = -1, NOWHERE = 0, CLIENT = 1, CAPTION = 2, SYSMENU = 3, GROWBOX = 4, SIZE = GROWBOX, MENU = 5, HSCROLL = 6, VSCROLL = 7, MINBUTTON = 8, MAXBUTTON = 9, LEFT = 10, RIGHT = 11, TOP = 12, TOPLEFT = 13, TOPRIGHT = 14, BOTTOM = 15, BOTTOMLEFT = 16, BOTTOMRIGHT = 17, BORDER = 18, REDUCE = MINBUTTON, ZOOM = MAXBUTTON, SIZEFIRST = LEFT, SIZELAST = BOTTOMRIGHT, OBJECT = 19, CLOSE = 20, HELP = 21 } /// /// GetClassLongPtr values, GCLP_* /// internal enum GCLP { HBRBACKGROUND = -10, } /// /// GetWindowLongPtr values, GWL_* /// internal enum GWL { WNDPROC = (-4), HINSTANCE = (-6), HWNDPARENT = (-8), STYLE = (-16), EXSTYLE = (-20), USERDATA = (-21), ID = (-12) } /// /// SystemMetrics. SM_* /// internal enum SM { CXSCREEN = 0, CYSCREEN = 1, CXVSCROLL = 2, CYHSCROLL = 3, CYCAPTION = 4, CXBORDER = 5, CYBORDER = 6, CXFIXEDFRAME = 7, CYFIXEDFRAME = 8, CYVTHUMB = 9, CXHTHUMB = 10, CXICON = 11, CYICON = 12, CXCURSOR = 13, CYCURSOR = 14, CYMENU = 15, CXFULLSCREEN = 16, CYFULLSCREEN = 17, CYKANJIWINDOW = 18, MOUSEPRESENT = 19, CYVSCROLL = 20, CXHSCROLL = 21, DEBUG = 22, SWAPBUTTON = 23, CXMIN = 28, CYMIN = 29, CXSIZE = 30, CYSIZE = 31, CXFRAME = 32, CXSIZEFRAME = CXFRAME, CYFRAME = 33, CYSIZEFRAME = CYFRAME, CXMINTRACK = 34, CYMINTRACK = 35, CXDOUBLECLK = 36, CYDOUBLECLK = 37, CXICONSPACING = 38, CYICONSPACING = 39, MENUDROPALIGNMENT = 40, PENWINDOWS = 41, DBCSENABLED = 42, CMOUSEBUTTONS = 43, SECURE = 44, CXEDGE = 45, CYEDGE = 46, CXMINSPACING = 47, CYMINSPACING = 48, CXSMICON = 49, CYSMICON = 50, CYSMCAPTION = 51, CXSMSIZE = 52, CYSMSIZE = 53, CXMENUSIZE = 54, CYMENUSIZE = 55, ARRANGE = 56, CXMINIMIZED = 57, CYMINIMIZED = 58, CXMAXTRACK = 59, CYMAXTRACK = 60, CXMAXIMIZED = 61, CYMAXIMIZED = 62, NETWORK = 63, CLEANBOOT = 67, CXDRAG = 68, CYDRAG = 69, SHOWSOUNDS = 70, CXMENUCHECK = 71, CYMENUCHECK = 72, SLOWMACHINE = 73, MIDEASTENABLED = 74, MOUSEWHEELPRESENT = 75, XVIRTUALSCREEN = 76, YVIRTUALSCREEN = 77, CXVIRTUALSCREEN = 78, CYVIRTUALSCREEN = 79, CMONITORS = 80, SAMEDISPLAYFORMAT = 81, IMMENABLED = 82, CXFOCUSBORDER = 83, CYFOCUSBORDER = 84, TABLETPC = 86, MEDIACENTER = 87, REMOTESESSION = 0x1000, REMOTECONTROL = 0x2001, } /// /// SystemParameterInfo values, SPI_* /// internal enum SPI { GETBEEP = 0x0001, SETBEEP = 0x0002, GETMOUSE = 0x0003, SETMOUSE = 0x0004, GETBORDER = 0x0005, SETBORDER = 0x0006, GETKEYBOARDSPEED = 0x000A, SETKEYBOARDSPEED = 0x000B, LANGDRIVER = 0x000C, ICONHORIZONTALSPACING = 0x000D, GETSCREENSAVETIMEOUT = 0x000E, SETSCREENSAVETIMEOUT = 0x000F, GETSCREENSAVEACTIVE = 0x0010, SETSCREENSAVEACTIVE = 0x0011, GETGRIDGRANULARITY = 0x0012, SETGRIDGRANULARITY = 0x0013, SETDESKWALLPAPER = 0x0014, SETDESKPATTERN = 0x0015, GETKEYBOARDDELAY = 0x0016, SETKEYBOARDDELAY = 0x0017, ICONVERTICALSPACING = 0x0018, GETICONTITLEWRAP = 0x0019, SETICONTITLEWRAP = 0x001A, GETMENUDROPALIGNMENT = 0x001B, SETMENUDROPALIGNMENT = 0x001C, SETDOUBLECLKWIDTH = 0x001D, SETDOUBLECLKHEIGHT = 0x001E, GETICONTITLELOGFONT = 0x001F, SETDOUBLECLICKTIME = 0x0020, SETMOUSEBUTTONSWAP = 0x0021, SETICONTITLELOGFONT = 0x0022, GETFASTTASKSWITCH = 0x0023, SETFASTTASKSWITCH = 0x0024, SETDRAGFULLWINDOWS = 0x0025, GETDRAGFULLWINDOWS = 0x0026, GETNONCLIENTMETRICS = 0x0029, SETNONCLIENTMETRICS = 0x002A, GETMINIMIZEDMETRICS = 0x002B, SETMINIMIZEDMETRICS = 0x002C, GETICONMETRICS = 0x002D, SETICONMETRICS = 0x002E, SETWORKAREA = 0x002F, GETWORKAREA = 0x0030, SETPENWINDOWS = 0x0031, GETHIGHCONTRAST = 0x0042, SETHIGHCONTRAST = 0x0043, GETKEYBOARDPREF = 0x0044, SETKEYBOARDPREF = 0x0045, GETSCREENREADER = 0x0046, SETSCREENREADER = 0x0047, GETANIMATION = 0x0048, SETANIMATION = 0x0049, GETFONTSMOOTHING = 0x004A, SETFONTSMOOTHING = 0x004B, SETDRAGWIDTH = 0x004C, SETDRAGHEIGHT = 0x004D, SETHANDHELD = 0x004E, GETLOWPOWERTIMEOUT = 0x004F, GETPOWEROFFTIMEOUT = 0x0050, SETLOWPOWERTIMEOUT = 0x0051, SETPOWEROFFTIMEOUT = 0x0052, GETLOWPOWERACTIVE = 0x0053, GETPOWEROFFACTIVE = 0x0054, SETLOWPOWERACTIVE = 0x0055, SETPOWEROFFACTIVE = 0x0056, SETCURSORS = 0x0057, SETICONS = 0x0058, GETDEFAULTINPUTLANG = 0x0059, SETDEFAULTINPUTLANG = 0x005A, SETLANGTOGGLE = 0x005B, GETWINDOWSEXTENSION = 0x005C, SETMOUSETRAILS = 0x005D, GETMOUSETRAILS = 0x005E, SETSCREENSAVERRUNNING = 0x0061, SCREENSAVERRUNNING = SETSCREENSAVERRUNNING, GETFILTERKEYS = 0x0032, SETFILTERKEYS = 0x0033, GETTOGGLEKEYS = 0x0034, SETTOGGLEKEYS = 0x0035, GETMOUSEKEYS = 0x0036, SETMOUSEKEYS = 0x0037, GETSHOWSOUNDS = 0x0038, SETSHOWSOUNDS = 0x0039, GETSTICKYKEYS = 0x003A, SETSTICKYKEYS = 0x003B, GETACCESSTIMEOUT = 0x003C, SETACCESSTIMEOUT = 0x003D, GETSERIALKEYS = 0x003E, SETSERIALKEYS = 0x003F, GETSOUNDSENTRY = 0x0040, SETSOUNDSENTRY = 0x0041, GETSNAPTODEFBUTTON = 0x005F, SETSNAPTODEFBUTTON = 0x0060, GETMOUSEHOVERWIDTH = 0x0062, SETMOUSEHOVERWIDTH = 0x0063, GETMOUSEHOVERHEIGHT = 0x0064, SETMOUSEHOVERHEIGHT = 0x0065, GETMOUSEHOVERTIME = 0x0066, SETMOUSEHOVERTIME = 0x0067, GETWHEELSCROLLLINES = 0x0068, SETWHEELSCROLLLINES = 0x0069, GETMENUSHOWDELAY = 0x006A, SETMENUSHOWDELAY = 0x006B, GETWHEELSCROLLCHARS = 0x006C, SETWHEELSCROLLCHARS = 0x006D, GETSHOWIMEUI = 0x006E, SETSHOWIMEUI = 0x006F, GETMOUSESPEED = 0x0070, SETMOUSESPEED = 0x0071, GETSCREENSAVERRUNNING = 0x0072, GETDESKWALLPAPER = 0x0073, GETAUDIODESCRIPTION = 0x0074, SETAUDIODESCRIPTION = 0x0075, GETSCREENSAVESECURE = 0x0076, SETSCREENSAVESECURE = 0x0077, GETHUNGAPPTIMEOUT = 0x0078, SETHUNGAPPTIMEOUT = 0x0079, GETWAITTOKILLTIMEOUT = 0x007A, SETWAITTOKILLTIMEOUT = 0x007B, GETWAITTOKILLSERVICETIMEOUT = 0x007C, SETWAITTOKILLSERVICETIMEOUT = 0x007D, GETMOUSEDOCKTHRESHOLD = 0x007E, SETMOUSEDOCKTHRESHOLD = 0x007F, GETPENDOCKTHRESHOLD = 0x0080, SETPENDOCKTHRESHOLD = 0x0081, GETWINARRANGING = 0x0082, SETWINARRANGING = 0x0083, GETMOUSEDRAGOUTTHRESHOLD = 0x0084, SETMOUSEDRAGOUTTHRESHOLD = 0x0085, GETPENDRAGOUTTHRESHOLD = 0x0086, SETPENDRAGOUTTHRESHOLD = 0x0087, GETMOUSESIDEMOVETHRESHOLD = 0x0088, SETMOUSESIDEMOVETHRESHOLD = 0x0089, GETPENSIDEMOVETHRESHOLD = 0x008A, SETPENSIDEMOVETHRESHOLD = 0x008B, GETDRAGFROMMAXIMIZE = 0x008C, SETDRAGFROMMAXIMIZE = 0x008D, GETSNAPSIZING = 0x008E, SETSNAPSIZING = 0x008F, GETDOCKMOVING = 0x0090, SETDOCKMOVING = 0x0091, GETACTIVEWINDOWTRACKING = 0x1000, SETACTIVEWINDOWTRACKING = 0x1001, GETMENUANIMATION = 0x1002, SETMENUANIMATION = 0x1003, GETCOMBOBOXANIMATION = 0x1004, SETCOMBOBOXANIMATION = 0x1005, GETLISTBOXSMOOTHSCROLLING = 0x1006, SETLISTBOXSMOOTHSCROLLING = 0x1007, GETGRADIENTCAPTIONS = 0x1008, SETGRADIENTCAPTIONS = 0x1009, GETKEYBOARDCUES = 0x100A, SETKEYBOARDCUES = 0x100B, GETMENUUNDERLINES = GETKEYBOARDCUES, SETMENUUNDERLINES = SETKEYBOARDCUES, GETACTIVEWNDTRKZORDER = 0x100C, SETACTIVEWNDTRKZORDER = 0x100D, GETHOTTRACKING = 0x100E, SETHOTTRACKING = 0x100F, GETMENUFADE = 0x1012, SETMENUFADE = 0x1013, GETSELECTIONFADE = 0x1014, SETSELECTIONFADE = 0x1015, GETTOOLTIPANIMATION = 0x1016, SETTOOLTIPANIMATION = 0x1017, GETTOOLTIPFADE = 0x1018, SETTOOLTIPFADE = 0x1019, GETCURSORSHADOW = 0x101A, SETCURSORSHADOW = 0x101B, GETMOUSESONAR = 0x101C, SETMOUSESONAR = 0x101D, GETMOUSECLICKLOCK = 0x101E, SETMOUSECLICKLOCK = 0x101F, GETMOUSEVANISH = 0x1020, SETMOUSEVANISH = 0x1021, GETFLATMENU = 0x1022, SETFLATMENU = 0x1023, GETDROPSHADOW = 0x1024, SETDROPSHADOW = 0x1025, GETBLOCKSENDINPUTRESETS = 0x1026, SETBLOCKSENDINPUTRESETS = 0x1027, GETUIEFFECTS = 0x103E, SETUIEFFECTS = 0x103F, GETDISABLEOVERLAPPEDCONTENT = 0x1040, SETDISABLEOVERLAPPEDCONTENT = 0x1041, GETCLIENTAREAANIMATION = 0x1042, SETCLIENTAREAANIMATION = 0x1043, GETCLEARTYPE = 0x1048, SETCLEARTYPE = 0x1049, GETSPEECHRECOGNITION = 0x104A, SETSPEECHRECOGNITION = 0x104B, GETFOREGROUNDLOCKTIMEOUT = 0x2000, SETFOREGROUNDLOCKTIMEOUT = 0x2001, GETACTIVEWNDTRKTIMEOUT = 0x2002, SETACTIVEWNDTRKTIMEOUT = 0x2003, GETFOREGROUNDFLASHCOUNT = 0x2004, SETFOREGROUNDFLASHCOUNT = 0x2005, GETCARETWIDTH = 0x2006, SETCARETWIDTH = 0x2007, GETMOUSECLICKLOCKTIME = 0x2008, SETMOUSECLICKLOCKTIME = 0x2009, GETFONTSMOOTHINGTYPE = 0x200A, SETFONTSMOOTHINGTYPE = 0x200B, GETFONTSMOOTHINGCONTRAST = 0x200C, SETFONTSMOOTHINGCONTRAST = 0x200D, GETFOCUSBORDERWIDTH = 0x200E, SETFOCUSBORDERWIDTH = 0x200F, GETFOCUSBORDERHEIGHT = 0x2010, SETFOCUSBORDERHEIGHT = 0x2011, GETFONTSMOOTHINGORIENTATION = 0x2012, SETFONTSMOOTHINGORIENTATION = 0x2013, GETMINIMUMHITRADIUS = 0x2014, SETMINIMUMHITRADIUS = 0x2015, GETMESSAGEDURATION = 0x2016, SETMESSAGEDURATION = 0x2017, } /// /// SystemParameterInfo flag values, SPIF_* /// [Flags] internal enum SPIF { None = 0, UPDATEINIFILE = 0x01, SENDCHANGE = 0x02, SENDWININICHANGE = SENDCHANGE, } [Flags] internal enum STATE_SYSTEM { UNAVAILABLE = 0x00000001, // Disabled SELECTED = 0x00000002, FOCUSED = 0x00000004, PRESSED = 0x00000008, CHECKED = 0x00000010, MIXED = 0x00000020, // 3-state checkbox or toolbar button INDETERMINATE = MIXED, READONLY = 0x00000040, HOTTRACKED = 0x00000080, DEFAULT = 0x00000100, EXPANDED = 0x00000200, COLLAPSED = 0x00000400, BUSY = 0x00000800, FLOATING = 0x00001000, // Children "owned" not "contained" by parent MARQUEED = 0x00002000, ANIMATED = 0x00004000, INVISIBLE = 0x00008000, OFFSCREEN = 0x00010000, SIZEABLE = 0x00020000, MOVEABLE = 0x00040000, SELFVOICING = 0x00080000, FOCUSABLE = 0x00100000, SELECTABLE = 0x00200000, LINKED = 0x00400000, TRAVERSED = 0x00800000, MULTISELECTABLE = 0x01000000, // Supports multiple selection EXTSELECTABLE = 0x02000000, // Supports extended selection ALERT_LOW = 0x04000000, // This information is of low priority ALERT_MEDIUM = 0x08000000, // This information is of medium priority ALERT_HIGH = 0x10000000, // This information is of high priority PROTECTED = 0x20000000, // access to this is restricted VALID = 0x3FFFFFFF, } internal enum StockObject : int { WHITE_BRUSH = 0, LTGRAY_BRUSH = 1, GRAY_BRUSH = 2, DKGRAY_BRUSH = 3, BLACK_BRUSH = 4, NULL_BRUSH = 5, HOLLOW_BRUSH = NULL_BRUSH, WHITE_PEN = 6, BLACK_PEN = 7, NULL_PEN = 8, SYSTEM_FONT = 13, DEFAULT_PALETTE = 15, } /// /// CS_* /// [Flags] internal enum CS : uint { VREDRAW = 0x0001, HREDRAW = 0x0002, DBLCLKS = 0x0008, OWNDC = 0x0020, CLASSDC = 0x0040, PARENTDC = 0x0080, NOCLOSE = 0x0200, SAVEBITS = 0x0800, BYTEALIGNCLIENT = 0x1000, BYTEALIGNWINDOW = 0x2000, GLOBALCLASS = 0x4000, IME = 0x00010000, DROPSHADOW = 0x00020000 } /// /// WindowStyle values, WS_* /// [Flags] internal enum WS : uint { OVERLAPPED = 0x00000000, POPUP = 0x80000000, CHILD = 0x40000000, MINIMIZE = 0x20000000, VISIBLE = 0x10000000, DISABLED = 0x08000000, CLIPSIBLINGS = 0x04000000, CLIPCHILDREN = 0x02000000, MAXIMIZE = 0x01000000, BORDER = 0x00800000, DLGFRAME = 0x00400000, VSCROLL = 0x00200000, HSCROLL = 0x00100000, SYSMENU = 0x00080000, THICKFRAME = 0x00040000, GROUP = 0x00020000, TABSTOP = 0x00010000, MINIMIZEBOX = 0x00020000, MAXIMIZEBOX = 0x00010000, CAPTION = BORDER | DLGFRAME, TILED = OVERLAPPED, ICONIC = MINIMIZE, SIZEBOX = THICKFRAME, TILEDWINDOW = OVERLAPPEDWINDOW, OVERLAPPEDWINDOW = OVERLAPPED | CAPTION | SYSMENU | THICKFRAME | MINIMIZEBOX | MAXIMIZEBOX, POPUPWINDOW = POPUP | BORDER | SYSMENU, CHILDWINDOW = CHILD, } /// /// Window message values, WM_* /// internal enum WM { NULL = 0x0000, CREATE = 0x0001, DESTROY = 0x0002, MOVE = 0x0003, SIZE = 0x0005, ACTIVATE = 0x0006, SETFOCUS = 0x0007, KILLFOCUS = 0x0008, ENABLE = 0x000A, SETREDRAW = 0x000B, SETTEXT = 0x000C, GETTEXT = 0x000D, GETTEXTLENGTH = 0x000E, PAINT = 0x000F, CLOSE = 0x0010, QUERYENDSESSION = 0x0011, QUIT = 0x0012, QUERYOPEN = 0x0013, ERASEBKGND = 0x0014, SYSCOLORCHANGE = 0x0015, SHOWWINDOW = 0x0018, CTLCOLOR = 0x0019, WININICHANGE = 0x001A, SETTINGCHANGE = 0x001A, ACTIVATEAPP = 0x001C, SETCURSOR = 0x0020, MOUSEACTIVATE = 0x0021, CHILDACTIVATE = 0x0022, QUEUESYNC = 0x0023, GETMINMAXINFO = 0x0024, WINDOWPOSCHANGING = 0x0046, WINDOWPOSCHANGED = 0x0047, CONTEXTMENU = 0x007B, STYLECHANGING = 0x007C, STYLECHANGED = 0x007D, DISPLAYCHANGE = 0x007E, GETICON = 0x007F, SETICON = 0x0080, NCCREATE = 0x0081, NCDESTROY = 0x0082, NCCALCSIZE = 0x0083, NCHITTEST = 0x0084, NCPAINT = 0x0085, NCACTIVATE = 0x0086, GETDLGCODE = 0x0087, SYNCPAINT = 0x0088, NCMOUSEMOVE = 0x00A0, NCLBUTTONDOWN = 0x00A1, NCLBUTTONUP = 0x00A2, NCLBUTTONDBLCLK = 0x00A3, NCRBUTTONDOWN = 0x00A4, NCRBUTTONUP = 0x00A5, NCRBUTTONDBLCLK = 0x00A6, NCMBUTTONDOWN = 0x00A7, NCMBUTTONUP = 0x00A8, NCMBUTTONDBLCLK = 0x00A9, SYSKEYDOWN = 0x0104, SYSKEYUP = 0x0105, SYSCHAR = 0x0106, SYSDEADCHAR = 0x0107, COMMAND = 0x0111, SYSCOMMAND = 0x0112, MOUSEMOVE = 0x0200, LBUTTONDOWN = 0x0201, LBUTTONUP = 0x0202, LBUTTONDBLCLK = 0x0203, RBUTTONDOWN = 0x0204, RBUTTONUP = 0x0205, RBUTTONDBLCLK = 0x0206, MBUTTONDOWN = 0x0207, MBUTTONUP = 0x0208, MBUTTONDBLCLK = 0x0209, MOUSEWHEEL = 0x020A, XBUTTONDOWN = 0x020B, XBUTTONUP = 0x020C, XBUTTONDBLCLK = 0x020D, MOUSEHWHEEL = 0x020E, PARENTNOTIFY = 0x0210, CAPTURECHANGED = 0x0215, POWERBROADCAST = 0x0218, DEVICECHANGE = 0x0219, ENTERSIZEMOVE = 0x0231, EXITSIZEMOVE = 0x0232, IME_SETCONTEXT = 0x0281, IME_NOTIFY = 0x0282, IME_CONTROL = 0x0283, IME_COMPOSITIONFULL = 0x0284, IME_SELECT = 0x0285, IME_CHAR = 0x0286, IME_REQUEST = 0x0288, IME_KEYDOWN = 0x0290, IME_KEYUP = 0x0291, NCMOUSELEAVE = 0x02A2, TABLET_DEFBASE = 0x02C0, //WM_TABLET_MAXOFFSET = 0x20, TABLET_ADDED = TABLET_DEFBASE + 8, TABLET_DELETED = TABLET_DEFBASE + 9, TABLET_FLICK = TABLET_DEFBASE + 11, TABLET_QUERYSYSTEMGESTURESTATUS = TABLET_DEFBASE + 12, CUT = 0x0300, COPY = 0x0301, PASTE = 0x0302, CLEAR = 0x0303, UNDO = 0x0304, RENDERFORMAT = 0x0305, RENDERALLFORMATS = 0x0306, DESTROYCLIPBOARD = 0x0307, DRAWCLIPBOARD = 0x0308, PAINTCLIPBOARD = 0x0309, VSCROLLCLIPBOARD = 0x030A, SIZECLIPBOARD = 0x030B, ASKCBFORMATNAME = 0x030C, CHANGECBCHAIN = 0x030D, HSCROLLCLIPBOARD = 0x030E, QUERYNEWPALETTE = 0x030F, PALETTEISCHANGING = 0x0310, PALETTECHANGED = 0x0311, HOTKEY = 0x0312, PRINT = 0x0317, PRINTCLIENT = 0x0318, APPCOMMAND = 0x0319, THEMECHANGED = 0x031A, DWMCOMPOSITIONCHANGED = 0x031E, DWMNCRENDERINGCHANGED = 0x031F, DWMCOLORIZATIONCOLORCHANGED = 0x0320, DWMWINDOWMAXIMIZEDCHANGE = 0x0321, GETTITLEBARINFOEX = 0x033F, #region Windows 7 DWMSENDICONICTHUMBNAIL = 0x0323, DWMSENDICONICLIVEPREVIEWBITMAP = 0x0326, #endregion USER = 0x0400, // This is the hard-coded message value used by WinForms for Shell_NotifyIcon. // It's relatively safe to reuse. TRAYMOUSEMESSAGE = 0x800, //WM_USER + 1024 APP = 0x8000, } /// /// Window style extended values, WS_EX_* /// [Flags] internal enum WS_EX : uint { None = 0, DLGMODALFRAME = 0x00000001, NOPARENTNOTIFY = 0x00000004, TOPMOST = 0x00000008, ACCEPTFILES = 0x00000010, TRANSPARENT = 0x00000020, MDICHILD = 0x00000040, TOOLWINDOW = 0x00000080, WINDOWEDGE = 0x00000100, CLIENTEDGE = 0x00000200, CONTEXTHELP = 0x00000400, RIGHT = 0x00001000, LEFT = 0x00000000, RTLREADING = 0x00002000, LTRREADING = 0x00000000, LEFTSCROLLBAR = 0x00004000, RIGHTSCROLLBAR = 0x00000000, CONTROLPARENT = 0x00010000, STATICEDGE = 0x00020000, APPWINDOW = 0x00040000, LAYERED = 0x00080000, NOINHERITLAYOUT = 0x00100000, // Disable inheritence of mirroring by children LAYOUTRTL = 0x00400000, // Right to left mirroring COMPOSITED = 0x02000000, NOACTIVATE = 0x08000000, OVERLAPPEDWINDOW = (WINDOWEDGE | CLIENTEDGE), PALETTEWINDOW = (WINDOWEDGE | TOOLWINDOW | TOPMOST), } /// /// GetDeviceCaps nIndex values. /// internal enum DeviceCap { /// Number of bits per pixel /// BITSPIXEL = 12, /// /// Number of planes /// PLANES = 14, /// /// Logical pixels inch in X /// LOGPIXELSX = 88, /// /// Logical pixels inch in Y /// LOGPIXELSY = 90, } internal enum FO : int { MOVE = 0x0001, COPY = 0x0002, DELETE = 0x0003, RENAME = 0x0004, } /// /// "FILEOP_FLAGS", FOF_*. /// internal enum FOF : ushort { MULTIDESTFILES = 0x0001, CONFIRMMOUSE = 0x0002, SILENT = 0x0004, RENAMEONCOLLISION = 0x0008, NOCONFIRMATION = 0x0010, WANTMAPPINGHANDLE = 0x0020, ALLOWUNDO = 0x0040, FILESONLY = 0x0080, SIMPLEPROGRESS = 0x0100, NOCONFIRMMKDIR = 0x0200, NOERRORUI = 0x0400, NOCOPYSECURITYATTRIBS = 0x0800, NORECURSION = 0x1000, NO_CONNECTED_ELEMENTS = 0x2000, WANTNUKEWARNING = 0x4000, NORECURSEREPARSE = 0x8000, } /// /// EnableMenuItem uEnable values, MF_* /// [Flags] internal enum MF : uint { /// /// Possible return value for EnableMenuItem /// DOES_NOT_EXIST = unchecked((uint)-1), ENABLED = 0, BYCOMMAND = 0, GRAYED = 1, DISABLED = 2, } /// Specifies the type of visual style attribute to set on a window. internal enum WINDOWTHEMEATTRIBUTETYPE : uint { /// Non-client area window attributes will be set. WTA_NONCLIENT = 1, } /// /// DWMFLIP3DWINDOWPOLICY. DWMFLIP3D_* /// internal enum DWMFLIP3D { DEFAULT, EXCLUDEBELOW, EXCLUDEABOVE, //LAST } /// /// DWMNCRENDERINGPOLICY. DWMNCRP_* /// internal enum DWMNCRP { USEWINDOWSTYLE, DISABLED, ENABLED, //LAST } /// /// DWMWINDOWATTRIBUTE. DWMWA_* /// internal enum DWMWA { NCRENDERING_ENABLED = 1, NCRENDERING_POLICY, TRANSITIONS_FORCEDISABLED, ALLOW_NCPAINT, CAPTION_BUTTON_BOUNDS, NONCLIENT_RTL_LAYOUT, FORCE_ICONIC_REPRESENTATION, FLIP3D_POLICY, EXTENDED_FRAME_BOUNDS, // New to Windows 7: HAS_ICONIC_BITMAP, DISALLOW_PEEK, EXCLUDED_FROM_PEEK, // LAST } /// /// WindowThemeNonClientAttributes /// [Flags] internal enum WTNCA : uint { /// Prevents the window caption from being drawn. NODRAWCAPTION = 0x00000001, /// Prevents the system icon from being drawn. NODRAWICON = 0x00000002, /// Prevents the system icon menu from appearing. NOSYSMENU = 0x00000004, /// Prevents mirroring of the question mark, even in right-to-left (RTL) layout. NOMIRRORHELP = 0x00000008, /// A mask that contains all the valid bits. VALIDBITS = NODRAWCAPTION | NODRAWICON | NOMIRRORHELP | NOSYSMENU, } /// /// SetWindowPos options /// [Flags] internal enum SWP { ASYNCWINDOWPOS = 0x4000, DEFERERASE = 0x2000, DRAWFRAME = 0x0020, FRAMECHANGED = 0x0020, HIDEWINDOW = 0x0080, NOACTIVATE = 0x0010, NOCOPYBITS = 0x0100, NOMOVE = 0x0002, NOOWNERZORDER = 0x0200, NOREDRAW = 0x0008, NOREPOSITION = 0x0200, NOSENDCHANGING = 0x0400, NOSIZE = 0x0001, NOZORDER = 0x0004, SHOWWINDOW = 0x0040, } /// /// ShowWindow options /// internal enum SW { HIDE = 0, SHOWNORMAL = 1, NORMAL = 1, SHOWMINIMIZED = 2, SHOWMAXIMIZED = 3, MAXIMIZE = 3, SHOWNOACTIVATE = 4, SHOW = 5, MINIMIZE = 6, SHOWMINNOACTIVE = 7, SHOWNA = 8, RESTORE = 9, SHOWDEFAULT = 10, FORCEMINIMIZE = 11, } internal enum SC { SIZE = 0xF000, MOVE = 0xF010, MINIMIZE = 0xF020, MAXIMIZE = 0xF030, NEXTWINDOW = 0xF040, PREVWINDOW = 0xF050, CLOSE = 0xF060, VSCROLL = 0xF070, HSCROLL = 0xF080, MOUSEMENU = 0xF090, KEYMENU = 0xF100, ARRANGE = 0xF110, RESTORE = 0xF120, TASKLIST = 0xF130, SCREENSAVE = 0xF140, HOTKEY = 0xF150, DEFAULT = 0xF160, MONITORPOWER = 0xF170, CONTEXTHELP = 0xF180, SEPARATOR = 0xF00F, /// /// SCF_ISSECURE /// F_ISSECURE = 0x00000001, ICON = MINIMIZE, ZOOM = MAXIMIZE, } /// /// GDI+ Status codes /// internal enum Status { Ok = 0, GenericError = 1, InvalidParameter = 2, OutOfMemory = 3, ObjectBusy = 4, InsufficientBuffer = 5, NotImplemented = 6, Win32Error = 7, WrongState = 8, Aborted = 9, FileNotFound = 10, ValueOverflow = 11, AccessDenied = 12, UnknownImageFormat = 13, FontFamilyNotFound = 14, FontStyleNotFound = 15, NotTrueTypeFont = 16, UnsupportedGdiplusVersion = 17, GdiplusNotInitialized = 18, PropertyNotFound = 19, PropertyNotSupported = 20, ProfileNotFound = 21, } internal enum MOUSEEVENTF : int { //mouse event constants LEFTDOWN = 2, LEFTUP = 4 } /// /// MSGFLT_*. New in Vista. Realiased in Windows 7. /// internal enum MSGFLT { // Win7 versions of this enum: RESET = 0, ALLOW = 1, DISALLOW = 2, // Vista versions of this enum: // ADD = 1, // REMOVE = 2, } internal enum MSGFLTINFO { NONE = 0, ALREADYALLOWED_FORWND = 1, ALREADYDISALLOWED_FORWND = 2, ALLOWED_HIGHER = 3, } internal enum INPUT_TYPE : uint { MOUSE = 0, } /// /// Shell_NotifyIcon messages. NIM_* /// internal enum NIM : uint { ADD = 0, MODIFY = 1, DELETE = 2, SETFOCUS = 3, SETVERSION = 4, } /// /// SHAddToRecentDocuments flags. SHARD_* /// internal enum SHARD { PIDL = 0x00000001, PATHA = 0x00000002, PATHW = 0x00000003, APPIDINFO = 0x00000004, // indicates the data type is a pointer to a SHARDAPPIDINFO structure APPIDINFOIDLIST = 0x00000005, // indicates the data type is a pointer to a SHARDAPPIDINFOIDLIST structure LINK = 0x00000006, // indicates the data type is a pointer to an IShellLink instance APPIDINFOLINK = 0x00000007, // indicates the data type is a pointer to a SHARDAPPIDINFOLINK structure } [Flags] enum SLGP { SHORTPATH = 0x1, UNCPRIORITY = 0x2, RAWPATH = 0x4 } /// /// Shell_NotifyIcon flags. NIF_* /// [Flags] internal enum NIF : uint { MESSAGE = 0x0001, ICON = 0x0002, TIP = 0x0004, STATE = 0x0008, INFO = 0x0010, GUID = 0x0020, /// /// Vista only. /// REALTIME = 0x0040, /// /// Vista only. /// SHOWTIP = 0x0080, XP_MASK = MESSAGE | ICON | STATE | INFO | GUID, VISTA_MASK = XP_MASK | REALTIME | SHOWTIP, } /// /// Shell_NotifyIcon info flags. NIIF_* /// internal enum NIIF { NONE = 0x00000000, INFO = 0x00000001, WARNING = 0x00000002, ERROR = 0x00000003, /// XP SP2 and later. USER = 0x00000004, /// XP and later. NOSOUND = 0x00000010, /// Vista and later. LARGE_ICON = 0x00000020, /// Windows 7 and later NIIF_RESPECT_QUIET_TIME = 0x00000080, /// XP and later. Native version called NIIF_ICON_MASK. XP_ICON_MASK = 0x0000000F, } /// /// AC_* /// internal enum AC : byte { SRC_OVER = 0, SRC_ALPHA = 1, } internal enum ULW { ALPHA = 2, COLORKEY = 1, OPAQUE = 4, } internal enum WVR { ALIGNTOP = 0x0010, ALIGNLEFT = 0x0020, ALIGNBOTTOM = 0x0040, ALIGNRIGHT = 0x0080, HREDRAW = 0x0100, VREDRAW = 0x0200, VALIDRECTS = 0x0400, REDRAW = HREDRAW | VREDRAW, } #endregion #region SafeHandles internal sealed class SafeFindHandle : SafeHandleZeroOrMinusOneIsInvalid { [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)] private SafeFindHandle() : base(true) { } protected override bool ReleaseHandle() { return NativeMethods.FindClose(handle); } } internal sealed class SafeDC : SafeHandleZeroOrMinusOneIsInvalid { private static class NativeMethods { [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll")] public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll")] public static extern SafeDC GetDC(IntPtr hwnd); // Weird legacy function, documentation is unclear about how to use it... [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("gdi32.dll", CharSet = CharSet.Unicode)] public static extern SafeDC CreateDC([MarshalAs(UnmanagedType.LPWStr)] string lpszDriver, [MarshalAs(UnmanagedType.LPWStr)] string lpszDevice, IntPtr lpszOutput, IntPtr lpInitData); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("gdi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] public static extern SafeDC CreateCompatibleDC(IntPtr hdc); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("gdi32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool DeleteDC(IntPtr hdc); } private IntPtr? _hwnd; private bool _created; public IntPtr Hwnd { set { Assert.NullableIsNull(_hwnd); _hwnd = value; } } private SafeDC() : base(true) { } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] protected override bool ReleaseHandle() { if (_created) { return NativeMethods.DeleteDC(handle); } if (!_hwnd.HasValue || _hwnd.Value == IntPtr.Zero) { return true; } return NativeMethods.ReleaseDC(_hwnd.Value, handle) == 1; } [SuppressMessage("Microsoft.Usage", "CA2201:DoNotRaiseReservedExceptionTypes"), SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static SafeDC CreateDC(string deviceName) { SafeDC dc = null; try { // Should this really be on the driver parameter? dc = NativeMethods.CreateDC(deviceName, null, IntPtr.Zero, IntPtr.Zero); } finally { if (dc != null) { dc._created = true; } } if (dc.IsInvalid) { dc.Dispose(); throw new SystemException("Unable to create a device context from the specified device information."); } return dc; } [SuppressMessage("Microsoft.Usage", "CA2201:DoNotRaiseReservedExceptionTypes"), SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static SafeDC CreateCompatibleDC(SafeDC hdc) { SafeDC dc = null; try { IntPtr hPtr = IntPtr.Zero; if (hdc != null) { hPtr = hdc.handle; } dc = NativeMethods.CreateCompatibleDC(hPtr); if (dc == null) { HRESULT.ThrowLastError(); } } finally { if (dc != null) { dc._created = true; } } if (dc.IsInvalid) { dc.Dispose(); throw new SystemException("Unable to create a device context from the specified device information."); } return dc; } public static SafeDC GetDC(IntPtr hwnd) { SafeDC dc = null; try { dc = NativeMethods.GetDC(hwnd); } finally { if (dc != null) { dc.Hwnd = hwnd; } } if (dc.IsInvalid) { // GetDC does not set the last error... HRESULT.E_FAIL.ThrowIfFailed(); } return dc; } public static SafeDC GetDesktop() { return GetDC(IntPtr.Zero); } [SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")] [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static SafeDC WrapDC(IntPtr hdc) { // This won't actually get released by the class, but it allows an IntPtr to be converted for signatures. return new SafeDC { handle = hdc, _created = false, _hwnd = IntPtr.Zero, }; } } internal sealed class SafeHBITMAP : SafeHandleZeroOrMinusOneIsInvalid { private SafeHBITMAP() : base(true) { } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] protected override bool ReleaseHandle() { return NativeMethods.DeleteObject(handle); } } internal sealed class SafeGdiplusStartupToken : SafeHandleZeroOrMinusOneIsInvalid { private SafeGdiplusStartupToken() : base(true) { } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] protected override bool ReleaseHandle() { Status s = NativeMethods.GdiplusShutdown(this.handle); return s == Status.Ok; } [SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")] [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [SuppressMessage("Microsoft.Usage", "CA2201:DoNotRaiseReservedExceptionTypes")] public static SafeGdiplusStartupToken Startup() { SafeGdiplusStartupToken safeHandle = new SafeGdiplusStartupToken(); IntPtr unsafeHandle; StartupOutput output; Status s = NativeMethods.GdiplusStartup(out unsafeHandle, new StartupInput(), out output); if (s == Status.Ok) { safeHandle.handle = unsafeHandle; return safeHandle; } safeHandle.Dispose(); throw new Exception("Unable to initialize GDI+"); } } internal sealed class SafeConnectionPointCookie : SafeHandleZeroOrMinusOneIsInvalid { private IConnectionPoint _cp; // handle holds the cookie value. [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [SuppressMessage("Microsoft.Naming", "CA2204:Literals should be spelled correctly", MessageId = "IConnectionPoint")] public SafeConnectionPointCookie(IConnectionPointContainer target, object sink, Guid eventId) : base(true) { Verify.IsNotNull(target, "target"); Verify.IsNotNull(sink, "sink"); Verify.IsNotDefault(eventId, "eventId"); handle = IntPtr.Zero; IConnectionPoint cp = null; try { int dwCookie; target.FindConnectionPoint(ref eventId, out cp); cp.Advise(sink, out dwCookie); if (dwCookie == 0) { throw new InvalidOperationException("IConnectionPoint::Advise returned an invalid cookie."); } handle = new IntPtr(dwCookie); _cp = cp; cp = null; } finally { Utility.SafeRelease(ref cp); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public void Disconnect() { ReleaseHandle(); } [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")] [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] protected override bool ReleaseHandle() { try { if (!this.IsInvalid) { int dwCookie = handle.ToInt32(); handle = IntPtr.Zero; Assert.IsNotNull(_cp); try { _cp.Unadvise(dwCookie); } finally { Utility.SafeRelease(ref _cp); } } return true; } catch { return false; } } } #endregion #region Native Types [StructLayout(LayoutKind.Sequential)] internal struct BLENDFUNCTION { // Must be AC_SRC_OVER public AC BlendOp; // Must be 0. public byte BlendFlags; // Alpha transparency between 0 (transparent) - 255 (opaque) public byte SourceConstantAlpha; // Must be AC_SRC_ALPHA public AC AlphaFormat; } [StructLayout(LayoutKind.Sequential)] internal struct HIGHCONTRAST { public int cbSize; public HCF dwFlags; //[MarshalAs(UnmanagedType.LPWStr, SizeConst=80)] //public String lpszDefaultScheme; public IntPtr lpszDefaultScheme; } [StructLayout(LayoutKind.Sequential)] internal struct RGBQUAD { public byte rgbBlue; public byte rgbGreen; public byte rgbRed; public byte rgbReserved; } [StructLayout(LayoutKind.Sequential, Pack = 2)] internal struct BITMAPINFOHEADER { public int biSize; public int biWidth; public int biHeight; public short biPlanes; public short biBitCount; public BI biCompression; public int biSizeImage; public int biXPelsPerMeter; public int biYPelsPerMeter; public int biClrUsed; public int biClrImportant; } [StructLayout(LayoutKind.Sequential)] internal struct BITMAPINFO { public BITMAPINFOHEADER bmiHeader; public RGBQUAD bmiColors; } // Win7 only. [StructLayout(LayoutKind.Sequential)] internal struct CHANGEFILTERSTRUCT { public uint cbSize; public MSGFLTINFO ExtStatus; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct CREATESTRUCT { public IntPtr lpCreateParams; public IntPtr hInstance; public IntPtr hMenu; public IntPtr hwndParent; public int cy; public int cx; public int y; public int x; public WS style; [MarshalAs(UnmanagedType.LPWStr)] public string lpszName; [MarshalAs(UnmanagedType.LPWStr)] public string lpszClass; public WS_EX dwExStyle; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)] internal struct SHFILEOPSTRUCT { public IntPtr hwnd; [MarshalAs(UnmanagedType.U4)] public FO wFunc; // double-null terminated arrays of LPWSTRS public string pFrom; public string pTo; [MarshalAs(UnmanagedType.U2)] public FOF fFlags; [MarshalAs(UnmanagedType.Bool)] public int fAnyOperationsAborted; public IntPtr hNameMappings; public string lpszProgressTitle; } [StructLayout(LayoutKind.Sequential)] internal struct TITLEBARINFO { public int cbSize; public RECT rcTitleBar; public STATE_SYSTEM rgstate_TitleBar; public STATE_SYSTEM rgstate_Reserved; public STATE_SYSTEM rgstate_MinimizeButton; public STATE_SYSTEM rgstate_MaximizeButton; public STATE_SYSTEM rgstate_HelpButton; public STATE_SYSTEM rgstate_CloseButton; } // New to Vista. [StructLayout(LayoutKind.Sequential)] internal struct TITLEBARINFOEX { public int cbSize; public RECT rcTitleBar; public STATE_SYSTEM rgstate_TitleBar; public STATE_SYSTEM rgstate_Reserved; public STATE_SYSTEM rgstate_MinimizeButton; public STATE_SYSTEM rgstate_MaximizeButton; public STATE_SYSTEM rgstate_HelpButton; public STATE_SYSTEM rgstate_CloseButton; public RECT rgrect_TitleBar; public RECT rgrect_Reserved; public RECT rgrect_MinimizeButton; public RECT rgrect_MaximizeButton; public RECT rgrect_HelpButton; public RECT rgrect_CloseButton; } [SuppressMessage("Microsoft.Performance", "CA1812:AvoidUninstantiatedInternalClasses")] [StructLayout(LayoutKind.Sequential)] internal class NOTIFYICONDATA { public int cbSize; public IntPtr hWnd; public int uID; public NIF uFlags; public int uCallbackMessage; public IntPtr hIcon; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] public char[] szTip = new char[128]; /// /// The state of the icon. There are two flags that can be set independently. /// NIS_HIDDEN = 1. The icon is hidden. /// NIS_SHAREDICON = 2. The icon is shared. /// public uint dwState; public uint dwStateMask; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public char[] szInfo = new char[256]; // Prior to Vista this was a union of uTimeout and uVersion. As of Vista, uTimeout has been deprecated. public uint uVersion; // Used with Shell_NotifyIcon flag NIM_SETVERSION. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] public char[] szInfoTitle = new char[64]; public uint dwInfoFlags; public Guid guidItem; // Vista only IntPtr hBalloonIcon; } [SuppressMessage("Microsoft.Performance", "CA1812:AvoidUninstantiatedInternalClasses")] [StructLayout(LayoutKind.Explicit)] internal class PROPVARIANT : IDisposable { private static class NativeMethods { [DllImport("ole32.dll")] internal static extern HRESULT PropVariantClear(PROPVARIANT pvar); } [SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] [FieldOffset(0)] private ushort vt; [SuppressMessage("Microsoft.Reliability", "CA2006:UseSafeHandleToEncapsulateNativeResources")] [SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] [FieldOffset(8)] private IntPtr pointerVal; [SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] [FieldOffset(8)] private byte byteVal; [SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] [FieldOffset(8)] private long longVal; [SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] [FieldOffset(8)] private short boolVal; [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public VarEnum VarType { get { return (VarEnum)vt; } } // Right now only using this for strings. [SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")] public string GetValue() { if (vt == (ushort)VarEnum.VT_LPWSTR) { return Marshal.PtrToStringUni(pointerVal); } return null; } public void SetValue(bool f) { Clear(); vt = (ushort)VarEnum.VT_BOOL; boolVal = (short)(f ? -1 : 0); } [SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")] public void SetValue(string val) { Clear(); vt = (ushort)VarEnum.VT_LPWSTR; pointerVal = Marshal.StringToCoTaskMemUni(val); } public void Clear() { HRESULT hr = NativeMethods.PropVariantClear(this); Assert.IsTrue(hr.Succeeded); } #region IDisposable Pattern public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } ~PROPVARIANT() { Dispose(false); } [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "disposing")] private void Dispose(bool disposing) { Clear(); } #endregion } [SuppressMessage("Microsoft.Performance", "CA1812:AvoidUninstantiatedInternalClasses")] [StructLayout(LayoutKind.Sequential, Pack = 4)] internal class SHARDAPPIDINFO { [MarshalAs(UnmanagedType.Interface)] object psi; // The namespace location of the the item that should be added to the recent docs folder. [MarshalAs(UnmanagedType.LPWStr)] string pszAppID; // The id of the application that should be associated with this recent doc. } [SuppressMessage("Microsoft.Performance", "CA1812:AvoidUninstantiatedInternalClasses")] [StructLayout(LayoutKind.Sequential, Pack = 4)] internal class SHARDAPPIDINFOIDLIST { /// The idlist for the shell item that should be added to the recent docs folder. IntPtr pidl; /// The id of the application that should be associated with this recent doc. [MarshalAs(UnmanagedType.LPWStr)] string pszAppID; } [SuppressMessage("Microsoft.Performance", "CA1812:AvoidUninstantiatedInternalClasses")] [StructLayout(LayoutKind.Sequential, Pack = 4)] internal class SHARDAPPIDINFOLINK { IntPtr psl; // An IShellLink instance that when launched opens a recently used item in the specified // application. This link is not added to the recent docs folder, but will be added to the // specified application's destination list. [MarshalAs(UnmanagedType.LPWStr)] string pszAppID; // The id of the application that should be associated with this recent doc. } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct LOGFONT { public int lfHeight; public int lfWidth; public int lfEscapement; public int lfOrientation; public int lfWeight; public byte lfItalic; public byte lfUnderline; public byte lfStrikeOut; public byte lfCharSet; public byte lfOutPrecision; public byte lfClipPrecision; public byte lfQuality; public byte lfPitchAndFamily; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string lfFaceName; } [StructLayout(LayoutKind.Sequential)] internal struct MINMAXINFO { public POINT ptReserved; public POINT ptMaxSize; public POINT ptMaxPosition; public POINT ptMinTrackSize; public POINT ptMaxTrackSize; } [StructLayout(LayoutKind.Sequential)] internal struct NONCLIENTMETRICS { public int cbSize; public int iBorderWidth; public int iScrollWidth; public int iScrollHeight; public int iCaptionWidth; public int iCaptionHeight; public LOGFONT lfCaptionFont; public int iSmCaptionWidth; public int iSmCaptionHeight; public LOGFONT lfSmCaptionFont; public int iMenuWidth; public int iMenuHeight; public LOGFONT lfMenuFont; public LOGFONT lfStatusFont; public LOGFONT lfMessageFont; // Vista only public int iPaddedBorderWidth; [SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")] public static NONCLIENTMETRICS VistaMetricsStruct { get { var ncm = new NONCLIENTMETRICS(); ncm.cbSize = Marshal.SizeOf(typeof(NONCLIENTMETRICS)); return ncm; } } [SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")] public static NONCLIENTMETRICS XPMetricsStruct { get { var ncm = new NONCLIENTMETRICS(); // Account for the missing iPaddedBorderWidth ncm.cbSize = Marshal.SizeOf(typeof(NONCLIENTMETRICS)) - sizeof(int); return ncm; } } } /// Defines options that are used to set window visual style attributes. [StructLayout(LayoutKind.Explicit)] internal struct WTA_OPTIONS { // public static readonly uint Size = (uint)Marshal.SizeOf(typeof(WTA_OPTIONS)); public const uint Size = 8; /// /// A combination of flags that modify window visual style attributes. /// Can be a combination of the WTNCA constants. /// [SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields", Justification = "Used by native code.")] [FieldOffset(0)] public WTNCA dwFlags; /// /// A bitmask that describes how the values specified in dwFlags should be applied. /// If the bit corresponding to a value in dwFlags is 0, that flag will be removed. /// If the bit is 1, the flag will be added. /// [SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields", Justification = "Used by native code.")] [FieldOffset(4)] public WTNCA dwMask; } [StructLayout(LayoutKind.Sequential)] internal struct MARGINS { /// Width of left border that retains its size. public int cxLeftWidth; /// Width of right border that retains its size. public int cxRightWidth; /// Height of top border that retains its size. public int cyTopHeight; /// Height of bottom border that retains its size. public int cyBottomHeight; }; [StructLayout(LayoutKind.Sequential)] internal class MONITORINFO { public int cbSize = Marshal.SizeOf(typeof(MONITORINFO)); public RECT rcMonitor; public RECT rcWork; public int dwFlags; } [StructLayout(LayoutKind.Sequential)] internal struct POINT { public int x; public int y; } [SuppressMessage("Microsoft.Performance", "CA1812:AvoidUninstantiatedInternalClasses")] [StructLayout(LayoutKind.Sequential)] internal class RefPOINT { public int x; public int y; } [StructLayout(LayoutKind.Sequential)] internal struct RECT { private int _left; private int _top; private int _right; private int _bottom; [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public void Offset(int dx, int dy) { _left += dx; _top += dy; _right += dx; _bottom += dy; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public int Left { get { return _left; } set { _left = value; } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public int Right { get { return _right; } set { _right = value; } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public int Top { get { return _top; } set { _top = value; } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public int Bottom { get { return _bottom; } set { _bottom = value; } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public int Width { get { return _right - _left; } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public int Height { get { return _bottom - _top; } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public POINT Position { get { return new POINT { x = _left, y = _top }; } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public SIZE Size { get { return new SIZE { cx = Width, cy = Height }; } } public static RECT Union(RECT rect1, RECT rect2) { return new RECT { Left = Math.Min(rect1.Left, rect2.Left), Top = Math.Min(rect1.Top, rect2.Top), Right = Math.Max(rect1.Right, rect2.Right), Bottom = Math.Max(rect1.Bottom, rect2.Bottom), }; } public override bool Equals(object obj) { try { var rc = (RECT)obj; return rc._bottom == _bottom && rc._left == _left && rc._right == _right && rc._top == _top; } catch (InvalidCastException) { return false; } } public override int GetHashCode() { return (_left << 16 | Utility.LOWORD(_right)) ^ (_top << 16 | Utility.LOWORD(_bottom)); } } [SuppressMessage("Microsoft.Performance", "CA1812:AvoidUninstantiatedInternalClasses")] [StructLayout(LayoutKind.Sequential)] internal class RefRECT { private int _left; private int _top; private int _right; private int _bottom; [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public RefRECT(int left, int top, int right, int bottom) { _left = left; _top = top; _right = right; _bottom = bottom; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public int Width { get { return _right - _left; } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public int Height { get { return _bottom - _top; } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public int Left { get { return _left; } set { _left = value; } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public int Right { get { return _right; } set { _right = value; } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public int Top { get { return _top; } set { _top = value; } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public int Bottom { get { return _bottom; } set { _bottom = value; } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public void Offset(int dx, int dy) { _left += dx; _top += dy; _right += dx; _bottom += dy; } } [StructLayout(LayoutKind.Sequential)] internal struct SIZE { public int cx; public int cy; } [StructLayout(LayoutKind.Sequential)] internal struct StartupOutput { public IntPtr hook; public IntPtr unhook; } [StructLayout(LayoutKind.Sequential)] internal class StartupInput { public int GdiplusVersion = 1; public IntPtr DebugEventCallback; public bool SuppressBackgroundThread; public bool SuppressExternalCodecs; } [SuppressMessage("Microsoft.Performance", "CA1812:AvoidUninstantiatedInternalClasses")] [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] [BestFitMapping(false)] internal class WIN32_FIND_DATAW { public FileAttributes dwFileAttributes; public System.Runtime.InteropServices.ComTypes.FILETIME ftCreationTime; public System.Runtime.InteropServices.ComTypes.FILETIME ftLastAccessTime; public System.Runtime.InteropServices.ComTypes.FILETIME ftLastWriteTime; public int nFileSizeHigh; public int nFileSizeLow; public int dwReserved0; public int dwReserved1; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string cFileName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)] public string cAlternateFileName; } [StructLayout(LayoutKind.Sequential)] internal class WINDOWPLACEMENT { public int length = Marshal.SizeOf(typeof(WINDOWPLACEMENT)); public int flags; public SW showCmd; public POINT ptMinPosition; public POINT ptMaxPosition; public RECT rcNormalPosition; } [StructLayout(LayoutKind.Sequential)] internal struct WINDOWPOS { public IntPtr hwnd; public IntPtr hwndInsertAfter; public int x; public int y; public int cx; public int cy; public int flags; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct WNDCLASSEX { public int cbSize; public CS style; public WndProc lpfnWndProc; public int cbClsExtra; public int cbWndExtra; public IntPtr hInstance; public IntPtr hIcon; public IntPtr hCursor; public IntPtr hbrBackground; [MarshalAs(UnmanagedType.LPWStr)] public string lpszMenuName; [MarshalAs(UnmanagedType.LPWStr)] public string lpszClassName; public IntPtr hIconSm; } [StructLayout(LayoutKind.Sequential)] internal struct MOUSEINPUT { public int dx; public int dy; public int mouseData; public int dwFlags; public int time; public IntPtr dwExtraInfo; } [StructLayout(LayoutKind.Sequential)] internal struct INPUT { public uint type; public MOUSEINPUT mi; }; [StructLayout(LayoutKind.Sequential)] internal struct UNSIGNED_RATIO { public uint uiNumerator; public uint uiDenominator; } [StructLayout(LayoutKind.Sequential, Pack=1)] internal struct DWM_TIMING_INFO { public int cbSize; public UNSIGNED_RATIO rateRefresh; public ulong qpcRefreshPeriod; public UNSIGNED_RATIO rateCompose; public ulong qpcVBlank; public ulong cRefresh; public uint cDXRefresh; public ulong qpcCompose; public ulong cFrame; public uint cDXPresent; public ulong cRefreshFrame; public ulong cFrameSubmitted; public uint cDXPresentSubmitted; public ulong cFrameConfirmed; public uint cDXPresentConfirmed; public ulong cRefreshConfirmed; public uint cDXRefreshConfirmed; public ulong cFramesLate; public uint cFramesOutstanding; public ulong cFrameDisplayed; public ulong qpcFrameDisplayed; public ulong cRefreshFrameDisplayed; public ulong cFrameComplete; public ulong qpcFrameComplete; public ulong cFramePending; public ulong qpcFramePending; public ulong cFramesDisplayed; public ulong cFramesComplete; public ulong cFramesPending; public ulong cFramesAvailable; public ulong cFramesDropped; public ulong cFramesMissed; public ulong cRefreshNextDisplayed; public ulong cRefreshNextPresented; public ulong cRefreshesDisplayed; public ulong cRefreshesPresented; public ulong cRefreshStarted; public ulong cPixelsReceived; public ulong cPixelsDrawn; public ulong cBuffersEmpty; } #endregion /// Delegate declaration that matches native WndProc signatures. internal delegate IntPtr WndProc(IntPtr hwnd, WM uMsg, IntPtr wParam, IntPtr lParam); /// Delegate declaration that matches native WndProc signatures. internal delegate IntPtr WndProcHook(IntPtr hwnd, WM uMsg, IntPtr wParam, IntPtr lParam, ref bool handled); /// Delegate declaration that matches managed WndProc signatures. internal delegate IntPtr MessageHandler(WM uMsg, IntPtr wParam, IntPtr lParam, out bool handled); // Some native methods are shimmed through public versions that handle converting failures into thrown exceptions. internal static class NativeMethods { [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", EntryPoint = "AdjustWindowRectEx", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool _AdjustWindowRectEx(ref RECT lpRect, WS dwStyle, [MarshalAs(UnmanagedType.Bool)] bool bMenu, WS_EX dwExStyle); public static RECT AdjustWindowRectEx(RECT lpRect, WS dwStyle, bool bMenu, WS_EX dwExStyle) { // Native version modifies the parameter in place. if (!_AdjustWindowRectEx(ref lpRect, dwStyle, bMenu, dwExStyle)) { HRESULT.ThrowLastError(); } return lpRect; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", EntryPoint = "ChangeWindowMessageFilter", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool _ChangeWindowMessageFilter(WM message, MSGFLT dwFlag); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", EntryPoint = "ChangeWindowMessageFilterEx", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool _ChangeWindowMessageFilterEx(IntPtr hwnd, WM message, MSGFLT action, [In, Out, Optional] ref CHANGEFILTERSTRUCT pChangeFilterStruct); // Note that processes at or below SECURITY_MANDATORY_LOW_RID are not allowed to change the message filter. // If those processes call this function, it will fail and generate the extended error code, ERROR_ACCESS_DENIED. [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static HRESULT ChangeWindowMessageFilterEx(IntPtr hwnd, WM message, MSGFLT action, out MSGFLTINFO filterInfo) { filterInfo = MSGFLTINFO.NONE; bool ret; // This origins of this API were added for Vista. The Ex version was added for Windows 7. // If we're not on either, then this message filter isolation doesn't exist. if (!Utility.IsOSVistaOrNewer) { return HRESULT.S_FALSE; } // If we're on Vista rather than Win7 then we can't use the Ex version of this function. // The Ex version is preferred if possible because this results in process-wide modifications of the filter // and is deprecated as of Win7. if (!Utility.IsOSWindows7OrNewer) { // Note that the Win7 MSGFLT_ALLOW/DISALLOW enum values map to the Vista MSGFLT_ADD/REMOVE ret = _ChangeWindowMessageFilter(message, action); if (!ret) { return (HRESULT)Win32Error.GetLastError(); } return HRESULT.S_OK; } var filterstruct = new CHANGEFILTERSTRUCT { cbSize = (uint)Marshal.SizeOf(typeof(CHANGEFILTERSTRUCT)) }; ret = _ChangeWindowMessageFilterEx(hwnd, message, action, ref filterstruct); if (!ret) { return (HRESULT)Win32Error.GetLastError(); } filterInfo = filterstruct.ExtStatus; return HRESULT.S_OK; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("gdi32.dll")] public static extern CombineRgnResult CombineRgn(IntPtr hrgnDest, IntPtr hrgnSrc1, IntPtr hrgnSrc2, RGN fnCombineMode); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("shell32.dll", EntryPoint = "CommandLineToArgvW", CharSet = CharSet.Unicode)] private static extern IntPtr _CommandLineToArgvW([MarshalAs(UnmanagedType.LPWStr)] string cmdLine, out int numArgs); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static string[] CommandLineToArgvW(string cmdLine) { IntPtr argv = IntPtr.Zero; try { int numArgs = 0; argv = _CommandLineToArgvW(cmdLine, out numArgs); if (argv == IntPtr.Zero) { throw new Win32Exception(); } var result = new string[numArgs]; for (int i = 0; i < numArgs; i++) { IntPtr currArg = Marshal.ReadIntPtr(argv, i * Marshal.SizeOf(typeof(IntPtr))); result[i] = Marshal.PtrToStringUni(currArg); } return result; } finally { IntPtr p = _LocalFree(argv); // Otherwise LocalFree failed. Assert.AreEqual(IntPtr.Zero, p); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("gdi32.dll", EntryPoint = "CreateDIBSection", SetLastError = true)] private static extern SafeHBITMAP _CreateDIBSection(SafeDC hdc, [In] ref BITMAPINFO bitmapInfo, int iUsage, [Out] out IntPtr ppvBits, IntPtr hSection, int dwOffset); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("gdi32.dll", EntryPoint = "CreateDIBSection", SetLastError = true)] private static extern SafeHBITMAP _CreateDIBSectionIntPtr(IntPtr hdc, [In] ref BITMAPINFO bitmapInfo, int iUsage, [Out] out IntPtr ppvBits, IntPtr hSection, int dwOffset); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static SafeHBITMAP CreateDIBSection(SafeDC hdc, ref BITMAPINFO bitmapInfo, out IntPtr ppvBits, IntPtr hSection, int dwOffset) { const int DIB_RGB_COLORS = 0; SafeHBITMAP hBitmap = null; if (hdc == null) { hBitmap = _CreateDIBSectionIntPtr(IntPtr.Zero, ref bitmapInfo, DIB_RGB_COLORS, out ppvBits, hSection, dwOffset); } else { hBitmap = _CreateDIBSection(hdc, ref bitmapInfo, DIB_RGB_COLORS, out ppvBits, hSection, dwOffset); } if (hBitmap.IsInvalid) { HRESULT.ThrowLastError(); } return hBitmap; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("gdi32.dll", EntryPoint = "CreateRoundRectRgn", SetLastError = true)] private static extern IntPtr _CreateRoundRectRgn(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect, int nWidthEllipse, int nHeightEllipse); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static IntPtr CreateRoundRectRgn(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect, int nWidthEllipse, int nHeightEllipse) { IntPtr ret = _CreateRoundRectRgn(nLeftRect, nTopRect, nRightRect, nBottomRect, nWidthEllipse, nHeightEllipse); if (IntPtr.Zero == ret) { throw new Win32Exception(); } return ret; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("gdi32.dll", EntryPoint = "CreateRectRgn", SetLastError = true)] private static extern IntPtr _CreateRectRgn(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static IntPtr CreateRectRgn(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect) { IntPtr ret = _CreateRectRgn(nLeftRect, nTopRect, nRightRect, nBottomRect); if (IntPtr.Zero == ret) { throw new Win32Exception(); } return ret; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("gdi32.dll", EntryPoint = "CreateRectRgnIndirect", SetLastError = true)] private static extern IntPtr _CreateRectRgnIndirect([In] ref RECT lprc); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static IntPtr CreateRectRgnIndirect(RECT lprc) { IntPtr ret = _CreateRectRgnIndirect(ref lprc); if (IntPtr.Zero == ret) { throw new Win32Exception(); } return ret; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("gdi32.dll")] public static extern IntPtr CreateSolidBrush(int crColor); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode, EntryPoint = "CreateWindowExW")] private static extern IntPtr _CreateWindowEx( WS_EX dwExStyle, [MarshalAs(UnmanagedType.LPWStr)] string lpClassName, [MarshalAs(UnmanagedType.LPWStr)] string lpWindowName, WS dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, IntPtr hMenu, IntPtr hInstance, IntPtr lpParam); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static IntPtr CreateWindowEx( WS_EX dwExStyle, string lpClassName, string lpWindowName, WS dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, IntPtr hMenu, IntPtr hInstance, IntPtr lpParam) { IntPtr ret = _CreateWindowEx(dwExStyle, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); if (IntPtr.Zero == ret) { HRESULT.ThrowLastError(); } return ret; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", CharSet = CharSet.Unicode, EntryPoint = "DefWindowProcW")] public static extern IntPtr DefWindowProc(IntPtr hWnd, WM Msg, IntPtr wParam, IntPtr lParam); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("gdi32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool DeleteObject(IntPtr hObject); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool DestroyIcon(IntPtr handle); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool DestroyWindow(IntPtr hwnd); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool IsWindow(IntPtr hwnd); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("dwmapi.dll", PreserveSig = false)] public static extern void DwmExtendFrameIntoClientArea(IntPtr hwnd, ref MARGINS pMarInset); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("dwmapi.dll", EntryPoint = "DwmIsCompositionEnabled", PreserveSig = false)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool _DwmIsCompositionEnabled(); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("dwmapi.dll", EntryPoint = "DwmGetColorizationColor", PreserveSig = true)] private static extern HRESULT _DwmGetColorizationColor(out uint pcrColorization, [Out, MarshalAs(UnmanagedType.Bool)] out bool pfOpaqueBlend); public static bool DwmGetColorizationColor(out uint pcrColorization, out bool pfOpaqueBlend) { // Make this call safe to make on downlevel OSes... if (Utility.IsOSVistaOrNewer && IsThemeActive()) { HRESULT hr = _DwmGetColorizationColor(out pcrColorization, out pfOpaqueBlend); if (hr.Succeeded) { return true; } } // Default values. If for some reason the native DWM API fails it's never enough of a reason // to bring down the app. Empirically it still sometimes returns errors even when the theme service is on. // We'll still use the boolean return value to allow the caller to respond if they care. pcrColorization = 0xFF000000; pfOpaqueBlend = true; return false; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static bool DwmIsCompositionEnabled() { // Make this call safe to make on downlevel OSes... if (!Utility.IsOSVistaOrNewer) { return false; } return _DwmIsCompositionEnabled(); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("dwmapi.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool DwmDefWindowProc(IntPtr hwnd, WM msg, IntPtr wParam, IntPtr lParam, out IntPtr plResult); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("dwmapi.dll", EntryPoint = "DwmSetWindowAttribute")] private static extern void _DwmSetWindowAttribute(IntPtr hwnd, DWMWA dwAttribute, ref int pvAttribute, int cbAttribute); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static void DwmSetWindowAttributeFlip3DPolicy(IntPtr hwnd, DWMFLIP3D flip3dPolicy) { Assert.IsTrue(Utility.IsOSVistaOrNewer); var dwPolicy = (int)flip3dPolicy; _DwmSetWindowAttribute(hwnd, DWMWA.FLIP3D_POLICY, ref dwPolicy, sizeof(int)); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static void DwmSetWindowAttributeDisallowPeek(IntPtr hwnd, bool disallowPeek) { Assert.IsTrue(Utility.IsOSWindows7OrNewer); int dwDisallow = (int)(disallowPeek ? Win32Value.TRUE : Win32Value.FALSE); _DwmSetWindowAttribute(hwnd, DWMWA.DISALLOW_PEEK, ref dwDisallow, sizeof(int)); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", EntryPoint = "EnableMenuItem")] private static extern int _EnableMenuItem(IntPtr hMenu, SC uIDEnableItem, MF uEnable); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static MF EnableMenuItem(IntPtr hMenu, SC uIDEnableItem, MF uEnable) { // Returns the previous state of the menu item, or -1 if the menu item does not exist. int iRet = _EnableMenuItem(hMenu, uIDEnableItem, uEnable); return (MF)iRet; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", EntryPoint = "RemoveMenu", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool _RemoveMenu(IntPtr hMenu, uint uPosition, uint uFlags); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static void RemoveMenu(IntPtr hMenu, SC uPosition, MF uFlags) { if (!_RemoveMenu(hMenu, (uint)uPosition, (uint)uFlags)) { throw new Win32Exception(); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", EntryPoint = "DrawMenuBar", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool _DrawMenuBar(IntPtr hWnd); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static void DrawMenuBar(IntPtr hWnd) { if (!_DrawMenuBar(hWnd)) { throw new Win32Exception(); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("kernel32.dll")] [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool FindClose(IntPtr handle); // Not shimming this SetLastError=true function because callers want to evaluate the reason for failure. [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] public static extern SafeFindHandle FindFirstFileW(string lpFileName, [In, Out, MarshalAs(UnmanagedType.LPStruct)] WIN32_FIND_DATAW lpFindFileData); // Not shimming this SetLastError=true function because callers want to evaluate the reason for failure. [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool FindNextFileW(SafeFindHandle hndFindFile, [In, Out, MarshalAs(UnmanagedType.LPStruct)] WIN32_FIND_DATAW lpFindFileData); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", EntryPoint = "GetClientRect", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool _GetClientRect(IntPtr hwnd, [Out] out RECT lpRect); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static RECT GetClientRect(IntPtr hwnd) { RECT rc; if (!_GetClientRect(hwnd, out rc)) { HRESULT.ThrowLastError(); } return rc; } [DllImport("uxtheme.dll", EntryPoint="GetCurrentThemeName", CharSet = CharSet.Unicode)] private static extern HRESULT _GetCurrentThemeName( StringBuilder pszThemeFileName, int dwMaxNameChars, StringBuilder pszColorBuff, int cchMaxColorChars, StringBuilder pszSizeBuff, int cchMaxSizeChars); public static void GetCurrentThemeName(out string themeFileName, out string color, out string size) { // Not expecting strings longer than MAX_PATH. We will return the error var fileNameBuilder = new StringBuilder((int)Win32Value.MAX_PATH); var colorBuilder = new StringBuilder((int)Win32Value.MAX_PATH); var sizeBuilder = new StringBuilder((int)Win32Value.MAX_PATH); // This will throw if the theme service is not active (e.g. not UxTheme!IsThemeActive). _GetCurrentThemeName(fileNameBuilder, fileNameBuilder.Capacity, colorBuilder, colorBuilder.Capacity, sizeBuilder, sizeBuilder.Capacity) .ThrowIfFailed(); themeFileName = fileNameBuilder.ToString(); color = colorBuilder.ToString(); size = sizeBuilder.ToString(); } [DllImport("uxtheme.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool IsThemeActive(); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [Obsolete("Use SafeDC.GetDC instead.", true)] public static void GetDC() { } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("gdi32.dll")] public static extern int GetDeviceCaps(SafeDC hdc, DeviceCap nIndex); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("kernel32.dll", EntryPoint = "GetModuleFileName", CharSet = CharSet.Unicode, SetLastError = true)] private static extern int _GetModuleFileName(IntPtr hModule, StringBuilder lpFilename, int nSize); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static string GetModuleFileName(IntPtr hModule) { var buffer = new StringBuilder((int)Win32Value.MAX_PATH); while (true) { int size = _GetModuleFileName(hModule, buffer, buffer.Capacity); if (size == 0) { HRESULT.ThrowLastError(); } // GetModuleFileName returns nSize when it's truncated but does NOT set the last error. // MSDN documentation says this has changed in Windows 2000+. if (size == buffer.Capacity) { // Enlarge the buffer and try again. buffer.EnsureCapacity(buffer.Capacity * 2); continue; } return buffer.ToString(); } } [DllImport("kernel32.dll", EntryPoint = "GetModuleHandleW", CharSet = CharSet.Unicode, SetLastError = true)] private static extern IntPtr _GetModuleHandle([MarshalAs(UnmanagedType.LPWStr)] string lpModuleName); public static IntPtr GetModuleHandle(string lpModuleName) { IntPtr retPtr = _GetModuleHandle(lpModuleName); if (retPtr == IntPtr.Zero) { HRESULT.ThrowLastError(); } return retPtr; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", EntryPoint = "GetMonitorInfo", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool _GetMonitorInfo(IntPtr hMonitor, [In, Out] MONITORINFO lpmi); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static MONITORINFO GetMonitorInfo(IntPtr hMonitor) { var mi = new MONITORINFO(); if (!_GetMonitorInfo(hMonitor, mi)) { throw new Win32Exception(); } return mi; } [DllImport("gdi32.dll", EntryPoint = "GetStockObject", SetLastError = true)] private static extern IntPtr _GetStockObject(StockObject fnObject); public static IntPtr GetStockObject(StockObject fnObject) { IntPtr retPtr = _GetStockObject(fnObject); if (retPtr == null) { HRESULT.ThrowLastError(); } return retPtr; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll")] public static extern IntPtr GetSystemMenu(IntPtr hWnd, [MarshalAs(UnmanagedType.Bool)] bool bRevert); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll")] public static extern int GetSystemMetrics(SM nIndex); // This is aliased as a macro in 32bit Windows. [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static IntPtr GetWindowLongPtr(IntPtr hwnd, GWL nIndex) { IntPtr ret = IntPtr.Zero; if (8 == IntPtr.Size) { ret = GetWindowLongPtr64(hwnd, nIndex); } else { ret = new IntPtr(GetWindowLongPtr32(hwnd, nIndex)); } if (IntPtr.Zero == ret) { throw new Win32Exception(); } return ret; } /// /// Sets attributes to control how visual styles are applied to a specified window. /// /// /// Handle to a window to apply changes to. /// /// /// Value of type WINDOWTHEMEATTRIBUTETYPE that specifies the type of attribute to set. /// The value of this parameter determines the type of data that should be passed in the pvAttribute parameter. /// Can be the following value: /// WTA_NONCLIENT (Specifies non-client related attributes). /// pvAttribute must be a pointer of type WTA_OPTIONS. /// /// /// A pointer that specifies attributes to set. Type is determined by the value of the eAttribute value. /// /// /// Specifies the size, in bytes, of the data pointed to by pvAttribute. /// [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("uxtheme.dll", PreserveSig = false)] public static extern void SetWindowThemeAttribute([In] IntPtr hwnd, [In] WINDOWTHEMEATTRIBUTETYPE eAttribute, [In] ref WTA_OPTIONS pvAttribute, [In] uint cbAttribute); [SuppressMessage("Microsoft.Interoperability", "CA1400:PInvokeEntryPointsShouldExist")] [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", EntryPoint = "GetWindowLong", SetLastError = true)] private static extern int GetWindowLongPtr32(IntPtr hWnd, GWL nIndex); [SuppressMessage("Microsoft.Interoperability", "CA1400:PInvokeEntryPointsShouldExist")] [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", EntryPoint = "GetWindowLongPtr", SetLastError = true)] private static extern IntPtr GetWindowLongPtr64(IntPtr hWnd, GWL nIndex); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool GetWindowPlacement(IntPtr hwnd, WINDOWPLACEMENT lpwndpl); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static WINDOWPLACEMENT GetWindowPlacement(IntPtr hwnd) { WINDOWPLACEMENT wndpl = new WINDOWPLACEMENT(); if (GetWindowPlacement(hwnd, wndpl)) { return wndpl; } throw new Win32Exception(); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", EntryPoint = "GetWindowRect", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool _GetWindowRect(IntPtr hWnd, out RECT lpRect); public static RECT GetWindowRect(IntPtr hwnd) { RECT rc; if (!_GetWindowRect(hwnd, out rc)) { HRESULT.ThrowLastError(); } return rc; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("gdiplus.dll")] public static extern Status GdipCreateBitmapFromStream(IStream stream, out IntPtr bitmap); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("gdiplus.dll")] public static extern Status GdipCreateHBITMAPFromBitmap(IntPtr bitmap, out IntPtr hbmReturn, Int32 background); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("gdiplus.dll")] public static extern Status GdipCreateHICONFromBitmap(IntPtr bitmap, out IntPtr hbmReturn); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("gdiplus.dll")] public static extern Status GdipDisposeImage(IntPtr image); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("gdiplus.dll")] public static extern Status GdipImageForceValidation(IntPtr image); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("gdiplus.dll")] public static extern Status GdiplusStartup(out IntPtr token, StartupInput input, out StartupOutput output); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("gdiplus.dll")] public static extern Status GdiplusShutdown(IntPtr token); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool IsWindowVisible(IntPtr hwnd); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("kernel32.dll", EntryPoint = "LocalFree", SetLastError = true)] private static extern IntPtr _LocalFree(IntPtr hMem); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll")] public static extern IntPtr MonitorFromWindow(IntPtr hwnd, uint dwFlags); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", EntryPoint = "PostMessage", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool _PostMessage(IntPtr hWnd, WM Msg, IntPtr wParam, IntPtr lParam); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static void PostMessage(IntPtr hWnd, WM Msg, IntPtr wParam, IntPtr lParam) { if (!_PostMessage(hWnd, Msg, wParam, lParam)) { throw new Win32Exception(); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", SetLastError = true, EntryPoint = "RegisterClassExW")] private static extern short _RegisterClassEx([In] ref WNDCLASSEX lpwcx); // Note that this will throw HRESULT_FROM_WIN32(ERROR_CLASS_ALREADY_EXISTS) on duplicate registration. // If needed, consider adding a Try* version of this function that returns the error code since that // may be ignorable. [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static short RegisterClassEx(ref WNDCLASSEX lpwcx) { short ret = _RegisterClassEx(ref lpwcx); if (ret == 0) { HRESULT.ThrowLastError(); } return ret; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", EntryPoint = "RegisterWindowMessage", SetLastError = true, CharSet = CharSet.Unicode)] private static extern uint _RegisterWindowMessage([MarshalAs(UnmanagedType.LPWStr)] string lpString); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static WM RegisterWindowMessage(string lpString) { uint iRet = _RegisterWindowMessage(lpString); if (iRet == 0) { HRESULT.ThrowLastError(); } return (WM)iRet; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", EntryPoint = "SetActiveWindow", SetLastError = true)] private static extern IntPtr _SetActiveWindow(IntPtr hWnd); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static IntPtr SetActiveWindow(IntPtr hwnd) { Verify.IsNotDefault(hwnd, "hwnd"); IntPtr ret = _SetActiveWindow(hwnd); if (ret == IntPtr.Zero) { HRESULT.ThrowLastError(); } return ret; } // This is aliased as a macro in 32bit Windows. [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static IntPtr SetClassLongPtr(IntPtr hwnd, GCLP nIndex, IntPtr dwNewLong) { if (8 == IntPtr.Size) { return SetClassLongPtr64(hwnd, nIndex, dwNewLong); } return new IntPtr(SetClassLongPtr32(hwnd, nIndex, dwNewLong.ToInt32())); } [SuppressMessage("Microsoft.Interoperability", "CA1400:PInvokeEntryPointsShouldExist")] [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", EntryPoint = "SetClassLong", SetLastError = true)] private static extern int SetClassLongPtr32(IntPtr hWnd, GCLP nIndex, int dwNewLong); [SuppressMessage("Microsoft.Interoperability", "CA1400:PInvokeEntryPointsShouldExist")] [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", EntryPoint = "SetClassLongPtr", SetLastError = true)] private static extern IntPtr SetClassLongPtr64(IntPtr hWnd, GCLP nIndex, IntPtr dwNewLong); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("kernel32.dll", SetLastError = true)] public static extern ErrorModes SetErrorMode(ErrorModes newMode); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("kernel32.dll", SetLastError = true, EntryPoint = "SetProcessWorkingSetSize")] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool _SetProcessWorkingSetSize(IntPtr hProcess, IntPtr dwMinimiumWorkingSetSize, IntPtr dwMaximumWorkingSetSize); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static void SetProcessWorkingSetSize(IntPtr hProcess, int dwMinimumWorkingSetSize, int dwMaximumWorkingSetSize) { if (!_SetProcessWorkingSetSize(hProcess, new IntPtr(dwMinimumWorkingSetSize), new IntPtr(dwMaximumWorkingSetSize))) { throw new Win32Exception(); } } // This is aliased as a macro in 32bit Windows. [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static IntPtr SetWindowLongPtr(IntPtr hwnd, GWL nIndex, IntPtr dwNewLong) { if (8 == IntPtr.Size) { return SetWindowLongPtr64(hwnd, nIndex, dwNewLong); } return new IntPtr(SetWindowLongPtr32(hwnd, nIndex, dwNewLong.ToInt32())); } [SuppressMessage("Microsoft.Interoperability", "CA1400:PInvokeEntryPointsShouldExist")] [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", EntryPoint = "SetWindowLong", SetLastError = true)] private static extern int SetWindowLongPtr32(IntPtr hWnd, GWL nIndex, int dwNewLong); [SuppressMessage("Microsoft.Interoperability", "CA1400:PInvokeEntryPointsShouldExist")] [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", EntryPoint = "SetWindowLongPtr", SetLastError = true)] private static extern IntPtr SetWindowLongPtr64(IntPtr hWnd, GWL nIndex, IntPtr dwNewLong); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", EntryPoint = "SetWindowRgn", SetLastError = true)] private static extern int _SetWindowRgn(IntPtr hWnd, IntPtr hRgn, [MarshalAs(UnmanagedType.Bool)] bool bRedraw); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static void SetWindowRgn(IntPtr hWnd, IntPtr hRgn, bool bRedraw) { int err = _SetWindowRgn(hWnd, hRgn, bRedraw); if (0 == err) { throw new Win32Exception(); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", EntryPoint = "SetWindowPos", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool _SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, SWP uFlags); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, SWP uFlags) { if (!_SetWindowPos(hWnd, hWndInsertAfter, x, y, cx, cy, uFlags)) { // If this fails it's never worth taking down the process. Let the caller deal with the error if they want. return false; } return true; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("shell32.dll", SetLastError = false)] public static extern Win32Error SHFileOperation(ref SHFILEOPSTRUCT lpFileOp); [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool ShowWindow(IntPtr hwnd, SW nCmdShow); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", EntryPoint = "SystemParametersInfoW", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool _SystemParametersInfo_String(SPI uiAction, int uiParam, [MarshalAs(UnmanagedType.LPWStr)] string pvParam, SPIF fWinIni); /// Overload of SystemParametersInfo for getting and setting NONCLIENTMETRICS. [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", EntryPoint = "SystemParametersInfoW", SetLastError = true, CharSet = CharSet.Unicode)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool _SystemParametersInfo_NONCLIENTMETRICS(SPI uiAction, int uiParam, [In, Out] ref NONCLIENTMETRICS pvParam, SPIF fWinIni); /// Overload of SystemParametersInfo for getting and setting HIGHCONTRAST. [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", EntryPoint = "SystemParametersInfoW", SetLastError = true, CharSet = CharSet.Unicode)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool _SystemParametersInfo_HIGHCONTRAST(SPI uiAction, int uiParam, [In, Out] ref HIGHCONTRAST pvParam, SPIF fWinIni); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static void SystemParametersInfo(SPI uiAction, int uiParam, string pvParam, SPIF fWinIni) { if (!_SystemParametersInfo_String(uiAction, uiParam, pvParam, fWinIni)) { HRESULT.ThrowLastError(); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static NONCLIENTMETRICS SystemParameterInfo_GetNONCLIENTMETRICS() { var metrics = Utility.IsOSVistaOrNewer ? NONCLIENTMETRICS.VistaMetricsStruct : NONCLIENTMETRICS.XPMetricsStruct; if (!_SystemParametersInfo_NONCLIENTMETRICS(SPI.GETNONCLIENTMETRICS, metrics.cbSize, ref metrics, SPIF.None)) { HRESULT.ThrowLastError(); } return metrics; } [SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")] public static HIGHCONTRAST SystemParameterInfo_GetHIGHCONTRAST() { var hc = new HIGHCONTRAST { cbSize = Marshal.SizeOf(typeof(HIGHCONTRAST)) }; if (!_SystemParametersInfo_HIGHCONTRAST(SPI.GETHIGHCONTRAST, hc.cbSize, ref hc, SPIF.None)) { HRESULT.ThrowLastError(); } return hc; } // This function is strange in that it returns a BOOL if TPM_RETURNCMD isn't specified, but otherwise the command Id. // Currently it's only used with TPM_RETURNCMD, so making the signature match that. [DllImport("user32.dll")] public static extern uint TrackPopupMenuEx(IntPtr hmenu, uint fuFlags, int x, int y, IntPtr hwnd, IntPtr lptpm); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("gdi32.dll", EntryPoint = "SelectObject", SetLastError = true)] private static extern IntPtr _SelectObject(SafeDC hdc, IntPtr hgdiobj); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static IntPtr SelectObject(SafeDC hdc, IntPtr hgdiobj) { IntPtr ret = _SelectObject(hdc, hgdiobj); if (ret == IntPtr.Zero) { HRESULT.ThrowLastError(); } return ret; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("gdi32.dll", EntryPoint = "SelectObject", SetLastError = true)] private static extern IntPtr _SelectObjectSafeHBITMAP(SafeDC hdc, SafeHBITMAP hgdiobj); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static IntPtr SelectObject(SafeDC hdc, SafeHBITMAP hgdiobj) { IntPtr ret = _SelectObjectSafeHBITMAP(hdc, hgdiobj); if (ret == IntPtr.Zero) { HRESULT.ThrowLastError(); } return ret; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", SetLastError = true)] public static extern int SendInput(int nInputs, ref INPUT pInputs, int cbSize); // Depending on the message, callers may want to call GetLastError based on the return value. [DllImport("user32.dll", SetLastError = true)] public static extern IntPtr SendMessage(IntPtr hWnd, WM Msg, IntPtr wParam, IntPtr lParam); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", EntryPoint = "UnregisterClass", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool _UnregisterClassAtom(IntPtr lpClassName, IntPtr hInstance); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", EntryPoint = "UnregisterClass", CharSet = CharSet.Unicode, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool _UnregisterClassName(string lpClassName, IntPtr hInstance); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static void UnregisterClass(short atom, IntPtr hinstance) { if (!_UnregisterClassAtom(new IntPtr(atom), hinstance)) { HRESULT.ThrowLastError(); } } public static void UnregisterClass(string lpClassName, IntPtr hInstance) { if (!_UnregisterClassName(lpClassName, hInstance)) { HRESULT.ThrowLastError(); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", SetLastError = true, EntryPoint = "UpdateLayeredWindow")] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool _UpdateLayeredWindow( IntPtr hwnd, SafeDC hdcDst, [In] ref POINT pptDst, [In] ref SIZE psize, SafeDC hdcSrc, [In] ref POINT pptSrc, int crKey, ref BLENDFUNCTION pblend, ULW dwFlags); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("user32.dll", SetLastError = true, EntryPoint = "UpdateLayeredWindow")] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool _UpdateLayeredWindowIntPtr( IntPtr hwnd, IntPtr hdcDst, IntPtr pptDst, IntPtr psize, IntPtr hdcSrc, IntPtr pptSrc, int crKey, ref BLENDFUNCTION pblend, ULW dwFlags); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static void UpdateLayeredWindow( IntPtr hwnd, SafeDC hdcDst, ref POINT pptDst, ref SIZE psize, SafeDC hdcSrc, ref POINT pptSrc, int crKey, ref BLENDFUNCTION pblend, ULW dwFlags) { if (!_UpdateLayeredWindow(hwnd, hdcDst, ref pptDst, ref psize, hdcSrc, ref pptSrc, crKey, ref pblend, dwFlags)) { HRESULT.ThrowLastError(); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public static void UpdateLayeredWindow( IntPtr hwnd, int crKey, ref BLENDFUNCTION pblend, ULW dwFlags) { if (!_UpdateLayeredWindowIntPtr(hwnd, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, crKey, ref pblend, dwFlags)) { HRESULT.ThrowLastError(); } } #region Win7 declarations [DllImport("shell32.dll", EntryPoint = "SHAddToRecentDocs")] private static extern void _SHAddToRecentDocs_String(SHARD uFlags, [MarshalAs(UnmanagedType.LPWStr)] string pv); // This overload is required. There's a cast in the Shell code that causes the wrong vtbl to be used // if we let the marshaller convert the parameter to an IUnknown. [DllImport("shell32.dll", EntryPoint = "SHAddToRecentDocs")] private static extern void _SHAddToRecentDocs_ShellLink(SHARD uFlags, IShellLinkW pv); public static void SHAddToRecentDocs(string path) { _SHAddToRecentDocs_String(SHARD.PATHW, path); } // Win7 only. public static void SHAddToRecentDocs(IShellLinkW shellLink) { _SHAddToRecentDocs_ShellLink(SHARD.LINK, shellLink); } // #define DWM_SIT_DISPLAYFRAME 0x00000001 // Display a window frame around the provided bitmap [DllImport("dwmapi.dll", EntryPoint="DwmGetCompositionTimingInfo")] private static extern HRESULT _DwmGetCompositionTimingInfo(IntPtr hwnd, ref DWM_TIMING_INFO pTimingInfo); public static DWM_TIMING_INFO? DwmGetCompositionTimingInfo(IntPtr hwnd) { if (!Utility.IsOSVistaOrNewer) { // API was new to Vista. return null; } var dti = new DWM_TIMING_INFO { cbSize = Marshal.SizeOf(typeof(DWM_TIMING_INFO)) }; HRESULT hr = _DwmGetCompositionTimingInfo(hwnd, ref dti); if (hr == HRESULT.E_PENDING) { // The system isn't yet ready to respond. Return null rather than throw. return null; } hr.ThrowIfFailed(); return dti; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("dwmapi.dll", PreserveSig = false)] public static extern void DwmInvalidateIconicBitmaps(IntPtr hwnd); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("dwmapi.dll", PreserveSig = false)] public static extern void DwmSetIconicThumbnail(IntPtr hwnd, IntPtr hbmp, DWM_SIT dwSITFlags); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("dwmapi.dll", PreserveSig = false)] public static extern void DwmSetIconicLivePreviewBitmap(IntPtr hwnd, IntPtr hbmp, RefPOINT pptClient, DWM_SIT dwSITFlags); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("shell32.dll", PreserveSig = false)] public static extern void SHGetItemFromDataObject(IDataObject pdtobj, DOGIF dwFlags, [In] ref Guid riid, [Out, MarshalAs(UnmanagedType.Interface)] out object ppv); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("shell32.dll", PreserveSig = false)] public static extern HRESULT SHCreateItemFromParsingName([MarshalAs(UnmanagedType.LPWStr)] string pszPath, IBindCtx pbc, [In] ref Guid riid, [Out, MarshalAs(UnmanagedType.Interface)] out object ppv); [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("shell32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool Shell_NotifyIcon(NIM dwMessage, [In] NOTIFYICONDATA lpdata); /// /// Sets the User Model AppID for the current process, enabling Windows to retrieve this ID /// /// [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("shell32.dll", PreserveSig = false)] public static extern void SetCurrentProcessExplicitAppUserModelID([MarshalAs(UnmanagedType.LPWStr)] string AppID); /// /// Retrieves the User Model AppID that has been explicitly set for the current process via SetCurrentProcessExplicitAppUserModelID /// /// [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport("shell32.dll")] public static extern HRESULT GetCurrentProcessExplicitAppUserModelID([Out, MarshalAs(UnmanagedType.LPWStr)] out string AppID); #endregion } }