2021-06-29 10:15:57 +00:00
using System ;
using System.Collections.Generic ;
using System.Linq ;
using System.Runtime.InteropServices ;
using System.Text ;
using System.Threading.Tasks ;
namespace DisplayMagicianShared.Windows
{
2021-07-24 04:05:38 +00:00
public enum WIN32STATUS : uint
2021-06-29 10:15:57 +00:00
{
ERROR_SUCCESS = 0 ,
ERROR_ACCESS_DENIED = 5 ,
ERROR_NOT_SUPPORTED = 50 ,
ERROR_GEN_FAILURE = 31 ,
ERROR_INVALID_PARAMETER = 87 ,
ERROR_INSUFFICIENT_BUFFER = 122 ,
2021-07-24 04:05:38 +00:00
ERROR_BAD_CONFIGURATION = 1610 ,
2021-06-29 10:15:57 +00:00
}
2021-07-24 04:05:38 +00:00
public enum DISPLAYCONFIG_DEVICE_INFO_TYPE : uint
2021-06-29 10:15:57 +00:00
{
2021-07-24 04:05:38 +00:00
Zero = 0 ,
2021-06-29 10:15:57 +00:00
DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME = 1 ,
DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME = 2 ,
DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE = 3 ,
DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME = 4 ,
DISPLAYCONFIG_DEVICE_INFO_SET_TARGET_PERSISTENCE = 5 ,
DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_BASE_TYPE = 6 ,
DISPLAYCONFIG_DEVICE_INFO_GET_SUPPORT_VIRTUAL_RESOLUTION = 7 ,
DISPLAYCONFIG_DEVICE_INFO_SET_SUPPORT_VIRTUAL_RESOLUTION = 8 ,
DISPLAYCONFIG_DEVICE_INFO_GET_ADVANCED_COLOR_INFO = 9 ,
DISPLAYCONFIG_DEVICE_INFO_SET_ADVANCED_COLOR_STATE = 10 ,
DISPLAYCONFIG_DEVICE_INFO_GET_SDR_WHITE_LEVEL = 11 ,
}
2021-07-24 04:05:38 +00:00
[Flags]
public enum DISPLAYCONFIG_COLOR_ENCODING : uint
2021-06-29 10:15:57 +00:00
{
DISPLAYCONFIG_COLOR_ENCODING_RGB = 0 ,
DISPLAYCONFIG_COLOR_ENCODING_YCBCR444 = 1 ,
DISPLAYCONFIG_COLOR_ENCODING_YCBCR422 = 2 ,
DISPLAYCONFIG_COLOR_ENCODING_YCBCR420 = 3 ,
DISPLAYCONFIG_COLOR_ENCODING_INTENSITY = 4 ,
}
2021-07-24 04:05:38 +00:00
[Flags]
public enum DISPLAYCONFIG_SCALING : uint
2021-06-29 10:15:57 +00:00
{
2021-07-24 04:05:38 +00:00
Zero = 0 ,
2021-06-29 10:15:57 +00:00
DISPLAYCONFIG_SCALING_IDENTITY = 1 ,
DISPLAYCONFIG_SCALING_CENTERED = 2 ,
DISPLAYCONFIG_SCALING_STRETCHED = 3 ,
DISPLAYCONFIG_SCALING_ASPECTRATIOCENTEREDMAX = 4 ,
DISPLAYCONFIG_SCALING_CUSTOM = 5 ,
DISPLAYCONFIG_SCALING_PREFERRED = 128 ,
2021-07-24 04:05:38 +00:00
DISPLAYCONFIG_SCALING_FORCEUINT32 = 0xFFFFFFFF ,
2021-06-29 10:15:57 +00:00
}
2021-07-24 04:05:38 +00:00
[Flags]
public enum DISPLAYCONFIG_ROTATION : uint
2021-06-29 10:15:57 +00:00
{
2021-07-24 04:05:38 +00:00
Zero = 0 ,
2021-06-29 10:15:57 +00:00
DISPLAYCONFIG_ROTATION_IDENTITY = 1 ,
DISPLAYCONFIG_ROTATION_ROTATE90 = 2 ,
DISPLAYCONFIG_ROTATION_ROTATE180 = 3 ,
2021-07-24 04:05:38 +00:00
DISPLAYCONFIG_ROTATION_ROTATE270 = 4 ,
DISPLAYCONFIG_ROTATION_FORCEUINT32 = 0xFFFFFFFF ,
2021-06-29 10:15:57 +00:00
}
2021-07-24 04:05:38 +00:00
[Flags]
public enum DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY : uint
2021-06-29 10:15:57 +00:00
{
2021-07-24 04:05:38 +00:00
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER = 4294967295 , // - 1
2021-06-29 10:15:57 +00:00
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HD15 = 0 ,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SVIDEO = 1 ,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPOSITE_VIDEO = 2 ,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPONENT_VIDEO = 3 ,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DVI = 4 ,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI = 5 ,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_LVDS = 6 ,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_D_JPN = 8 ,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDI = 9 ,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EXTERNAL = 10 ,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED = 11 ,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EXTERNAL = 12 ,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EMBEDDED = 13 ,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDTVDONGLE = 14 ,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_MIRACAST = 15 ,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INDIRECT_WIRED = 16 ,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INDIRECT_VIRTUAL = 17 ,
2021-07-24 04:05:38 +00:00
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_public = 0x80000000 ,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_FORCEUINT32 = 0xFFFFFFFF ,
2021-06-29 10:15:57 +00:00
}
2021-07-24 04:05:38 +00:00
[Flags]
public enum DISPLAYCONFIG_TOPOLOGY_ID : uint
2021-06-29 10:15:57 +00:00
{
2021-07-24 04:05:38 +00:00
Zero = 0x0 ,
2021-10-20 05:06:02 +00:00
DISPLAYCONFIG_TOPOLOGY_INTERNAL = 0x00000001 ,
2021-06-29 10:15:57 +00:00
DISPLAYCONFIG_TOPOLOGY_CLONE = 0x00000002 ,
DISPLAYCONFIG_TOPOLOGY_EXTEND = 0x00000004 ,
DISPLAYCONFIG_TOPOLOGY_EXTERNAL = 0x00000008 ,
2021-07-24 04:05:38 +00:00
DISPLAYCONFIG_TOPOLOGY_FORCEUINT32 = 0xFFFFFFFF ,
2021-06-29 10:15:57 +00:00
}
2021-07-24 04:05:38 +00:00
[Flags]
2021-10-20 05:06:02 +00:00
public enum DISPLAYCONFIG_PATH_FLAGS : uint
2021-06-29 10:15:57 +00:00
{
2021-07-24 04:05:38 +00:00
Zero = 0x0 ,
2021-06-29 10:15:57 +00:00
DISPLAYCONFIG_PATH_ACTIVE = 0x00000001 ,
DISPLAYCONFIG_PATH_PREFERRED_UNSCALED = 0x00000004 ,
DISPLAYCONFIG_PATH_SUPPORT_VIRTUAL_MODE = 0x00000008 ,
}
2021-07-24 04:05:38 +00:00
[Flags]
public enum DISPLAYCONFIG_SOURCE_FLAGS : uint
2021-06-29 10:15:57 +00:00
{
2021-07-24 04:05:38 +00:00
Zero = 0x0 ,
2021-06-29 10:15:57 +00:00
DISPLAYCONFIG_SOURCE_IN_USE = 0x00000001 ,
}
2021-07-24 04:05:38 +00:00
[Flags]
public enum DISPLAYCONFIG_TARGET_FLAGS : uint
2021-06-29 10:15:57 +00:00
{
2021-07-24 04:05:38 +00:00
Zero = 0x0 ,
2021-06-29 10:15:57 +00:00
DISPLAYCONFIG_TARGET_IN_USE = 0x00000001 ,
DISPLAYCONFIG_TARGET_FORCIBLE = 0x00000002 ,
DISPLAYCONFIG_TARGET_FORCED_AVAILABILITY_BOOT = 0x00000004 ,
DISPLAYCONFIG_TARGET_FORCED_AVAILABILITY_PATH = 0x00000008 ,
DISPLAYCONFIG_TARGET_FORCED_AVAILABILITY_SYSTEM = 0x00000010 ,
DISPLAYCONFIG_TARGET_IS_HMD = 0x00000020 ,
}
2021-07-24 04:05:38 +00:00
[Flags]
public enum QDC : uint
2021-06-29 10:15:57 +00:00
{
2021-07-24 04:05:38 +00:00
Zero = 0x0 ,
2021-06-29 10:15:57 +00:00
QDC_ALL_PATHS = 0x00000001 , // Get all paths
QDC_ONLY_ACTIVE_PATHS = 0x00000002 , // Get only the active paths currently in use
2021-07-24 04:05:38 +00:00
QDC_DATABASE_CURRENT = 0x00000004 , // Get the currently active paths as stored in the display database
2021-06-29 10:15:57 +00:00
QDC_VIRTUAL_MODE_AWARE = 0x00000010 , // Get the virtual mode aware paths
2021-07-24 03:19:24 +00:00
QDC_INCLUDE_HMD = 0x00000020 ,
2021-06-29 10:15:57 +00:00
}
2021-07-24 04:05:38 +00:00
[Flags]
public enum SDC : uint
{
Zero = 0x0 ,
SDC_TOPOLOGY_public = 0x00000001 ,
SDC_TOPOLOGY_CLONE = 0x00000002 ,
SDC_TOPOLOGY_EXTEND = 0x00000004 ,
SDC_TOPOLOGY_EXTERNAL = 0x00000008 ,
SDC_TOPOLOGY_SUPPLIED = 0x00000010 ,
SDC_USE_DATABASE_CURRENT = ( SDC_TOPOLOGY_public | SDC_TOPOLOGY_CLONE | SDC_TOPOLOGY_EXTEND | SDC_TOPOLOGY_EXTERNAL ) ,
SDC_USE_SUPPLIED_DISPLAY_CONFIG = 0x00000020 ,
SDC_VALIDATE = 0x00000040 ,
SDC_APPLY = 0x00000080 ,
SDC_NO_OPTIMIZATION = 0x00000100 ,
SDC_SAVE_TO_DATABASE = 0x00000200 ,
SDC_ALLOW_CHANGES = 0x00000400 ,
SDC_PATH_PERSIST_IF_REQUIRED = 0x00000800 ,
SDC_FORCE_MODE_ENUMERATION = 0x00001000 ,
SDC_ALLOW_PATH_ORDER_CHANGES = 0x00002000 ,
SDC_VIRTUAL_MODE_AWARE = 0x00008000 ,
// Special common combinations (only set in this library)
TEST_IF_VALID_DISPLAYCONFIG = ( SDC_VALIDATE | SDC_USE_SUPPLIED_DISPLAY_CONFIG ) ,
TEST_IF_VALID_DISPLAYCONFIG_WITH_TWEAKS = ( SDC_VALIDATE | SDC_USE_SUPPLIED_DISPLAY_CONFIG | SDC_ALLOW_CHANGES ) ,
SET_DISPLAYCONFIG_AND_SAVE = ( SDC_APPLY | SDC_USE_SUPPLIED_DISPLAY_CONFIG | SDC_SAVE_TO_DATABASE ) ,
SET_DISPLAYCONFIG_WITH_TWEAKS_AND_SAVE = ( SDC_APPLY | SDC_USE_SUPPLIED_DISPLAY_CONFIG | SDC_ALLOW_CHANGES | SDC_SAVE_TO_DATABASE ) ,
DISPLAYMAGICIAN_SET = ( SDC_APPLY | SDC_USE_SUPPLIED_DISPLAY_CONFIG | SDC_ALLOW_CHANGES | SDC_SAVE_TO_DATABASE ) ,
DISPLAYMAGICIAN_VALIDATE = ( SDC_VALIDATE | SDC_USE_SUPPLIED_DISPLAY_CONFIG | SDC_ALLOW_CHANGES | SDC_SAVE_TO_DATABASE ) ,
//DISPLAYMAGICIAN_SET = (SDC_APPLY | SDC_TOPOLOGY_SUPPLIED | SDC_ALLOW_CHANGES | SDC_ALLOW_PATH_ORDER_CHANGES ),
//DISPLAYMAGICIAN_VALIDATE = (SDC_VALIDATE | SDC_TOPOLOGY_SUPPLIED | SDC_ALLOW_CHANGES | SDC_ALLOW_PATH_ORDER_CHANGES ),
SET_DISPLAYCONFIG_BUT_NOT_SAVE = ( SDC_APPLY | SDC_USE_SUPPLIED_DISPLAY_CONFIG ) ,
TEST_IF_CLONE_VALID = ( SDC_VALIDATE | SDC_TOPOLOGY_CLONE ) ,
SET_CLONE_TOPOLOGY = ( SDC_APPLY | SDC_TOPOLOGY_CLONE ) ,
SET_CLONE_TOPOLOGY_WITH_PATH_PERSISTENCE = ( SDC_APPLY | SDC_TOPOLOGY_CLONE | SDC_PATH_PERSIST_IF_REQUIRED ) ,
RESET_DISPLAYCONFIG_TO_LAST_SAVED = ( SDC_APPLY | SDC_USE_DATABASE_CURRENT ) ,
SET_DISPLAYCONFIG_USING_PATHS_ONLY_AND_SAVE = ( SDC_APPLY | SDC_TOPOLOGY_SUPPLIED | SDC_ALLOW_PATH_ORDER_CHANGES ) ,
}
[Flags]
public enum DISPLAYCONFIG_SCANLINE_ORDERING : uint
2021-06-29 10:15:57 +00:00
{
DISPLAYCONFIG_SCANLINE_ORDERING_UNSPECIFIED = 0 ,
DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE = 1 ,
DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED = 2 ,
DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_UPPERFIELDFIRST = DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED ,
DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_LOWERFIELDFIRST = 3 ,
2021-07-24 04:05:38 +00:00
DISPLAYCONFIG_SCANLINE_ORDERING_FORCEUINT32 = 0xFFFFFFFF ,
2021-06-29 10:15:57 +00:00
}
2021-07-24 04:05:38 +00:00
[Flags]
public enum DISPLAYCONFIG_PIXELFORMAT : uint
2021-06-29 10:15:57 +00:00
{
2021-07-24 04:05:38 +00:00
Zero = 0x0 ,
2021-06-29 10:15:57 +00:00
DISPLAYCONFIG_PIXELFORMAT_8BPP = 1 ,
DISPLAYCONFIG_PIXELFORMAT_16BPP = 2 ,
DISPLAYCONFIG_PIXELFORMAT_24BPP = 3 ,
DISPLAYCONFIG_PIXELFORMAT_32BPP = 4 ,
DISPLAYCONFIG_PIXELFORMAT_NONGDI = 5 ,
2021-07-24 04:05:38 +00:00
DISPLAYCONFIG_PIXELFORMAT_FORCEUINT32 = 0xFFFFFFFF ,
2021-06-29 10:15:57 +00:00
}
2021-07-24 04:05:38 +00:00
[Flags]
public enum DISPLAYCONFIG_MODE_INFO_TYPE : uint
2021-06-29 10:15:57 +00:00
{
2021-07-24 04:05:38 +00:00
Zero = 0x0 ,
2021-06-29 10:15:57 +00:00
DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE = 1 ,
DISPLAYCONFIG_MODE_INFO_TYPE_TARGET = 2 ,
DISPLAYCONFIG_MODE_INFO_TYPE_DESKTOP_IMAGE = 3 ,
2021-07-24 04:05:38 +00:00
DISPLAYCONFIG_MODE_INFO_TYPE_FORCEUINT32 = 0xFFFFFFFF ,
}
[Flags]
public enum D3D_VIDEO_SIGNAL_STANDARD : uint
{
Uninitialized = 0 ,
VesaDmt = 1 ,
VesaGtf = 2 ,
VesaCvt = 3 ,
Ibm = 4 ,
Apple = 5 ,
NtscM = 6 ,
NtscJ = 7 ,
Ntsc443 = 8 ,
PalB = 9 ,
PalB1 = 10 ,
PalG = 11 ,
PalH = 12 ,
PalI = 13 ,
PalD = 14 ,
PalN = 15 ,
PalNc = 16 ,
SecamB = 17 ,
2021-08-21 09:46:36 +00:00
SecNVIDIA = 18 ,
2021-07-24 04:05:38 +00:00
SecamG = 19 ,
SecamH = 20 ,
SecamK = 21 ,
SecamK1 = 22 ,
SecamL = 23 ,
SecamL1 = 24 ,
Eia861 = 25 ,
Eia861A = 26 ,
Eia861B = 27 ,
PalK = 28 ,
PalK1 = 29 ,
PalL = 30 ,
PalM = 31 ,
Other = 255
2021-06-29 10:15:57 +00:00
}
[StructLayout(LayoutKind.Sequential)]
2021-07-24 03:19:24 +00:00
public struct DISPLAYCONFIG_DEVICE_INFO_HEADER : IEquatable < DISPLAYCONFIG_DEVICE_INFO_HEADER >
2021-06-29 10:15:57 +00:00
{
2021-07-24 03:19:24 +00:00
public DISPLAYCONFIG_DEVICE_INFO_TYPE Type ;
2021-07-24 04:05:38 +00:00
public uint Size ;
2021-07-24 03:19:24 +00:00
public LUID AdapterId ;
public uint Id ;
2021-08-31 09:06:08 +00:00
public override bool Equals ( object obj ) = > obj is DISPLAYCONFIG_DEVICE_INFO_HEADER other & & this . Equals ( other ) ;
2021-07-24 03:19:24 +00:00
public bool Equals ( DISPLAYCONFIG_DEVICE_INFO_HEADER other )
= > Type = = other . Type & &
Size = = other . Size & &
2021-07-24 04:05:38 +00:00
// AdapterId.Equals(other.AdapterId) && // Removed the AdapterId from the Equals, as it changes after reboot.
2021-07-24 03:19:24 +00:00
Id = = other . Id ;
public override int GetHashCode ( )
{
return ( Type , Size , AdapterId , Id ) . GetHashCode ( ) ;
}
2021-08-31 09:06:08 +00:00
public static bool operator = = ( DISPLAYCONFIG_DEVICE_INFO_HEADER lhs , DISPLAYCONFIG_DEVICE_INFO_HEADER rhs ) = > lhs . Equals ( rhs ) ;
public static bool operator ! = ( DISPLAYCONFIG_DEVICE_INFO_HEADER lhs , DISPLAYCONFIG_DEVICE_INFO_HEADER rhs ) = > ! ( lhs = = rhs ) ;
2021-06-29 10:15:57 +00:00
}
[StructLayout(LayoutKind.Sequential)]
2021-07-24 03:19:24 +00:00
public struct DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO : IEquatable < DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO >
2021-06-29 10:15:57 +00:00
{
2021-07-24 03:19:24 +00:00
public DISPLAYCONFIG_DEVICE_INFO_HEADER Header ;
2021-07-24 04:05:38 +00:00
//[MarshalAs(UnmanagedType.U4)]
2021-07-24 03:19:24 +00:00
public uint Value ;
public DISPLAYCONFIG_COLOR_ENCODING ColorEncoding ;
2021-07-24 04:05:38 +00:00
//[MarshalAs(UnmanagedType.U4)]
public uint BitsPerColorChannel ;
2021-06-29 10:15:57 +00:00
2021-07-24 03:19:24 +00:00
public bool AdvancedColorSupported = > ( Value & 0x1 ) = = 0x1 ;
public bool AdvancedColorEnabled = > ( Value & 0x2 ) = = 0x2 ;
public bool WideColorEnforced = > ( Value & 0x4 ) = = 0x4 ;
public bool AdvancedColorForceDisabled = > ( Value & 0x8 ) = = 0x8 ;
2021-08-31 09:06:08 +00:00
public override bool Equals ( object obj ) = > obj is DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO other & & this . Equals ( other ) ;
2021-07-24 03:19:24 +00:00
public bool Equals ( DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO other )
= > Header . Equals ( other . Header ) & &
Value = = other . Value & &
ColorEncoding . Equals ( other . ColorEncoding ) & &
BitsPerColorChannel = = other . BitsPerColorChannel ;
public override int GetHashCode ( )
{
return ( Header , Value , ColorEncoding , BitsPerColorChannel ) . GetHashCode ( ) ;
}
2021-08-31 09:06:08 +00:00
public static bool operator = = ( DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO lhs , DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO rhs ) = > lhs . Equals ( rhs ) ;
public static bool operator ! = ( DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO lhs , DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO rhs ) = > ! ( lhs = = rhs ) ;
2021-06-29 10:15:57 +00:00
}
[StructLayout(LayoutKind.Sequential)]
2021-07-24 03:19:24 +00:00
public struct POINTL : IEquatable < POINTL >
2021-06-29 10:15:57 +00:00
{
2021-07-24 03:19:24 +00:00
public int X ;
public int Y ;
2021-08-31 09:06:08 +00:00
public override bool Equals ( object obj ) = > obj is POINTL other & & this . Equals ( other ) ;
2021-07-24 03:19:24 +00:00
public bool Equals ( POINTL other )
= > X = = other . X & &
Y = = other . Y ;
public override int GetHashCode ( )
{
return ( X , Y ) . GetHashCode ( ) ;
}
2021-08-31 09:06:08 +00:00
public static bool operator = = ( POINTL lhs , POINTL rhs ) = > lhs . Equals ( rhs ) ;
public static bool operator ! = ( POINTL lhs , POINTL rhs ) = > ! ( lhs = = rhs ) ;
2021-06-29 10:15:57 +00:00
}
[StructLayout(LayoutKind.Sequential)]
2021-07-24 03:19:24 +00:00
public struct LUID : IEquatable < LUID >
2021-06-29 10:15:57 +00:00
{
public uint LowPart ;
2021-07-24 04:05:38 +00:00
public uint HighPart ;
2021-06-29 10:15:57 +00:00
2021-07-24 04:05:38 +00:00
public ulong Value = > ( ( ulong ) HighPart < < 32 ) | LowPart ;
2021-07-24 03:19:24 +00:00
2021-08-31 09:06:08 +00:00
public override bool Equals ( object obj ) = > obj is LUID other & & this . Equals ( other ) ;
2021-07-24 03:19:24 +00:00
public bool Equals ( LUID other )
2021-07-24 04:05:38 +00:00
= > LowPart = = other . LowPart & &
HighPart = = other . HighPart ;
2021-07-24 03:19:24 +00:00
public override int GetHashCode ( )
{
2021-07-24 04:05:38 +00:00
return ( LowPart , HighPart ) . GetHashCode ( ) ;
2021-07-24 03:19:24 +00:00
}
2021-08-31 09:06:08 +00:00
public static bool operator = = ( LUID lhs , LUID rhs ) = > lhs . Equals ( rhs ) ;
public static bool operator ! = ( LUID lhs , LUID rhs ) = > ! ( lhs = = rhs ) ;
2021-06-29 10:15:57 +00:00
public override string ToString ( ) = > Value . ToString ( ) ;
}
[StructLayout(LayoutKind.Sequential)]
2021-07-24 03:19:24 +00:00
public struct DISPLAYCONFIG_SOURCE_MODE : IEquatable < DISPLAYCONFIG_SOURCE_MODE >
2021-06-29 10:15:57 +00:00
{
2021-07-24 03:19:24 +00:00
public uint Width ;
public uint Height ;
public DISPLAYCONFIG_PIXELFORMAT PixelFormat ;
public POINTL Position ;
2021-08-31 09:06:08 +00:00
public override bool Equals ( object obj ) = > obj is DISPLAYCONFIG_SOURCE_MODE other & & this . Equals ( other ) ;
2021-07-24 03:19:24 +00:00
public bool Equals ( DISPLAYCONFIG_SOURCE_MODE other )
= > Width = = other . Width & &
Height = = other . Height & &
PixelFormat . Equals ( other . PixelFormat ) & &
Position . Equals ( other . Position ) ;
public override int GetHashCode ( )
{
return ( Width , Height , PixelFormat , Position ) . GetHashCode ( ) ;
}
2021-08-31 09:06:08 +00:00
public static bool operator = = ( DISPLAYCONFIG_SOURCE_MODE lhs , DISPLAYCONFIG_SOURCE_MODE rhs ) = > lhs . Equals ( rhs ) ;
public static bool operator ! = ( DISPLAYCONFIG_SOURCE_MODE lhs , DISPLAYCONFIG_SOURCE_MODE rhs ) = > ! ( lhs = = rhs ) ;
2021-07-24 03:19:24 +00:00
2021-06-29 10:15:57 +00:00
}
[StructLayout(LayoutKind.Sequential)]
2021-07-24 03:19:24 +00:00
public struct DISPLAYCONFIG_RATIONAL : IEquatable < DISPLAYCONFIG_RATIONAL >
2021-06-29 10:15:57 +00:00
{
public uint Numerator ;
public uint Denominator ;
2021-08-31 09:06:08 +00:00
public override bool Equals ( object obj ) = > obj is DISPLAYCONFIG_RATIONAL other & & this . Equals ( other ) ;
2021-07-24 03:19:24 +00:00
public bool Equals ( DISPLAYCONFIG_RATIONAL other )
= > Numerator = = other . Numerator & &
2021-10-14 21:01:21 +00:00
Denominator = = other . Denominator ;
2021-07-24 03:19:24 +00:00
public override int GetHashCode ( )
{
return ( Numerator , Denominator ) . GetHashCode ( ) ;
}
2021-08-31 09:06:08 +00:00
public static bool operator = = ( DISPLAYCONFIG_RATIONAL lhs , DISPLAYCONFIG_RATIONAL rhs ) = > lhs . Equals ( rhs ) ;
public static bool operator ! = ( DISPLAYCONFIG_RATIONAL lhs , DISPLAYCONFIG_RATIONAL rhs ) = > ! ( lhs = = rhs ) ;
2021-07-24 03:19:24 +00:00
2021-06-29 10:15:57 +00:00
public override string ToString ( ) = > Numerator + " / " + Denominator ;
}
[StructLayout(LayoutKind.Sequential)]
2021-07-24 03:19:24 +00:00
public struct DISPLAYCONFIG_2DREGION : IEquatable < DISPLAYCONFIG_2DREGION >
2021-06-29 10:15:57 +00:00
{
2021-07-24 03:19:24 +00:00
public uint Cx ;
public uint Cy ;
2021-08-31 09:06:08 +00:00
public override bool Equals ( object obj ) = > obj is DISPLAYCONFIG_2DREGION other & & this . Equals ( other ) ;
2021-07-24 03:19:24 +00:00
public bool Equals ( DISPLAYCONFIG_2DREGION other )
= > Cx = = other . Cx & &
Cy = = other . Cy ;
public override int GetHashCode ( )
{
return ( Cx , Cy ) . GetHashCode ( ) ;
}
2021-08-31 09:06:08 +00:00
public static bool operator = = ( DISPLAYCONFIG_2DREGION lhs , DISPLAYCONFIG_2DREGION rhs ) = > lhs . Equals ( rhs ) ;
public static bool operator ! = ( DISPLAYCONFIG_2DREGION lhs , DISPLAYCONFIG_2DREGION rhs ) = > ! ( lhs = = rhs ) ;
2021-06-29 10:15:57 +00:00
}
[StructLayout(LayoutKind.Sequential)]
2021-07-24 03:19:24 +00:00
public struct DISPLAYCONFIG_DESKTOP_IMAGE_INFO : IEquatable < DISPLAYCONFIG_DESKTOP_IMAGE_INFO >
2021-06-29 10:15:57 +00:00
{
public POINTL PathSourceSize ;
2021-07-24 04:05:38 +00:00
public RECTL DesktopImageRegion ;
public RECTL DesktopImageClip ;
2021-07-24 03:19:24 +00:00
2021-08-31 09:06:08 +00:00
public override bool Equals ( object obj ) = > obj is DISPLAYCONFIG_DESKTOP_IMAGE_INFO other & & this . Equals ( other ) ;
2021-07-24 03:19:24 +00:00
public bool Equals ( DISPLAYCONFIG_DESKTOP_IMAGE_INFO other )
= > PathSourceSize . Equals ( other . PathSourceSize ) & &
DesktopImageRegion . Equals ( other . DesktopImageRegion ) & &
DesktopImageClip . Equals ( other . DesktopImageClip ) ;
public override int GetHashCode ( )
{
return ( PathSourceSize , DesktopImageRegion , DesktopImageClip ) . GetHashCode ( ) ;
}
2021-08-31 09:06:08 +00:00
public static bool operator = = ( DISPLAYCONFIG_DESKTOP_IMAGE_INFO lhs , DISPLAYCONFIG_DESKTOP_IMAGE_INFO rhs ) = > lhs . Equals ( rhs ) ;
public static bool operator ! = ( DISPLAYCONFIG_DESKTOP_IMAGE_INFO lhs , DISPLAYCONFIG_DESKTOP_IMAGE_INFO rhs ) = > ! ( lhs = = rhs ) ;
2021-06-29 10:15:57 +00:00
}
[StructLayout(LayoutKind.Sequential)]
2021-07-24 03:19:24 +00:00
public struct DISPLAYCONFIG_VIDEO_SIGNAL_INFO : IEquatable < DISPLAYCONFIG_VIDEO_SIGNAL_INFO >
{
public ulong PixelRate ;
public DISPLAYCONFIG_RATIONAL HSyncFreq ;
public DISPLAYCONFIG_RATIONAL VSyncFreq ;
public DISPLAYCONFIG_2DREGION ActiveSize ;
public DISPLAYCONFIG_2DREGION TotalSize ;
2021-07-24 04:05:38 +00:00
public D3D_VIDEO_SIGNAL_STANDARD VideoStandard ;
2021-07-24 03:19:24 +00:00
public DISPLAYCONFIG_SCANLINE_ORDERING ScanLineOrdering ;
2021-08-31 09:06:08 +00:00
public override bool Equals ( object obj ) = > obj is DISPLAYCONFIG_VIDEO_SIGNAL_INFO other & & this . Equals ( other ) ;
2021-07-24 03:19:24 +00:00
public bool Equals ( DISPLAYCONFIG_VIDEO_SIGNAL_INFO other )
= > PixelRate = = other . PixelRate & &
HSyncFreq . Equals ( other . HSyncFreq ) & &
VSyncFreq . Equals ( other . VSyncFreq ) & &
ActiveSize . Equals ( other . ActiveSize ) & &
TotalSize . Equals ( other . TotalSize ) & &
VideoStandard = = other . VideoStandard & &
ScanLineOrdering . Equals ( other . ScanLineOrdering ) ;
public override int GetHashCode ( )
{
return ( PixelRate , HSyncFreq , VSyncFreq , ActiveSize , TotalSize , VideoStandard , ScanLineOrdering ) . GetHashCode ( ) ;
}
2021-08-31 09:06:08 +00:00
public static bool operator = = ( DISPLAYCONFIG_VIDEO_SIGNAL_INFO lhs , DISPLAYCONFIG_VIDEO_SIGNAL_INFO rhs ) = > lhs . Equals ( rhs ) ;
public static bool operator ! = ( DISPLAYCONFIG_VIDEO_SIGNAL_INFO lhs , DISPLAYCONFIG_VIDEO_SIGNAL_INFO rhs ) = > ! ( lhs = = rhs ) ;
2021-06-29 10:15:57 +00:00
}
[StructLayout(LayoutKind.Sequential)]
2021-07-24 03:19:24 +00:00
public struct DISPLAYCONFIG_TARGET_MODE : IEquatable < DISPLAYCONFIG_TARGET_MODE >
2021-06-29 10:15:57 +00:00
{
2021-07-24 03:19:24 +00:00
public DISPLAYCONFIG_VIDEO_SIGNAL_INFO TargetVideoSignalInfo ;
2021-08-31 09:06:08 +00:00
public override bool Equals ( object obj ) = > obj is DISPLAYCONFIG_TARGET_MODE other & & this . Equals ( other ) ;
2021-07-24 03:19:24 +00:00
public bool Equals ( DISPLAYCONFIG_TARGET_MODE other )
= > TargetVideoSignalInfo . Equals ( other . TargetVideoSignalInfo ) ;
public override int GetHashCode ( )
{
return ( TargetVideoSignalInfo ) . GetHashCode ( ) ;
}
2021-08-31 09:06:08 +00:00
public static bool operator = = ( DISPLAYCONFIG_TARGET_MODE lhs , DISPLAYCONFIG_TARGET_MODE rhs ) = > lhs . Equals ( rhs ) ;
public static bool operator ! = ( DISPLAYCONFIG_TARGET_MODE lhs , DISPLAYCONFIG_TARGET_MODE rhs ) = > ! ( lhs = = rhs ) ;
2021-06-29 10:15:57 +00:00
}
[StructLayout(LayoutKind.Explicit)]
2021-07-24 03:19:24 +00:00
public struct DISPLAYCONFIG_PATH_SOURCE_INFO : IEquatable < DISPLAYCONFIG_PATH_SOURCE_INFO >
2021-06-29 10:15:57 +00:00
{
2021-07-24 04:05:38 +00:00
[FieldOffset(0)]
2021-07-24 03:19:24 +00:00
public LUID AdapterId ;
2021-07-24 04:05:38 +00:00
[FieldOffset(8)]
2021-07-24 03:19:24 +00:00
public uint Id ;
2021-07-24 04:05:38 +00:00
[FieldOffset(12)]
2021-07-24 03:19:24 +00:00
public uint ModeInfoIdx ;
2021-07-24 04:05:38 +00:00
[FieldOffset(12)]
public ushort cloneGroupId ;
[FieldOffset(14)]
public ushort sourceModeInfoIdx ;
[FieldOffset(16)]
2021-07-24 03:19:24 +00:00
public DISPLAYCONFIG_SOURCE_FLAGS StatusFlags ;
2021-08-31 09:06:08 +00:00
public override bool Equals ( object obj ) = > obj is DISPLAYCONFIG_PATH_SOURCE_INFO other & & this . Equals ( other ) ;
2021-07-24 03:19:24 +00:00
public bool Equals ( DISPLAYCONFIG_PATH_SOURCE_INFO other )
2021-07-24 04:05:38 +00:00
= > // AdapterId.Equals(other.AdapterId) && // Removed the AdapterId from the Equals, as it changes after a reboot.
2021-10-07 08:08:10 +00:00
//Id == other.Id && // Removed the ID from the list as the Display ID it maps to will change after a switch from surround to non-surround profile
2021-07-24 03:19:24 +00:00
ModeInfoIdx = = other . ModeInfoIdx & &
StatusFlags . Equals ( other . StatusFlags ) ;
public override int GetHashCode ( )
{
2021-07-24 04:05:38 +00:00
//return (AdapterId, Id, ModeInfoIdx, StatusFlags).GetHashCode();
return ( ModeInfoIdx , Id , StatusFlags ) . GetHashCode ( ) ;
2021-07-24 03:19:24 +00:00
}
2021-08-31 09:06:08 +00:00
public static bool operator = = ( DISPLAYCONFIG_PATH_SOURCE_INFO lhs , DISPLAYCONFIG_PATH_SOURCE_INFO rhs ) = > lhs . Equals ( rhs ) ;
public static bool operator ! = ( DISPLAYCONFIG_PATH_SOURCE_INFO lhs , DISPLAYCONFIG_PATH_SOURCE_INFO rhs ) = > ! ( lhs = = rhs ) ;
2021-06-29 10:15:57 +00:00
}
[StructLayout(LayoutKind.Sequential)]
2021-07-24 03:19:24 +00:00
public struct DISPLAYCONFIG_PATH_TARGET_INFO : IEquatable < DISPLAYCONFIG_PATH_TARGET_INFO >
{
public LUID AdapterId ;
public uint Id ;
public uint ModeInfoIdx ;
public DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY OutputTechnology ;
public DISPLAYCONFIG_ROTATION Rotation ;
public DISPLAYCONFIG_SCALING Scaling ;
public DISPLAYCONFIG_RATIONAL RefreshRate ;
public DISPLAYCONFIG_SCANLINE_ORDERING ScanLineOrdering ;
public bool TargetAvailable ;
2021-07-24 04:05:38 +00:00
public uint StatusFlags ;
public bool TargetInUse = > ( StatusFlags & 0x1 ) = = 0x1 ;
public bool TargetForcible = > ( StatusFlags & 0x2 ) = = 0x2 ;
public bool ForcedAvailabilityBoot = > ( StatusFlags & 0x4 ) = = 0x4 ;
public bool ForcedAvailabilityPath = > ( StatusFlags & 0x8 ) = = 0x8 ;
public bool ForcedAvailabilitySystem = > ( StatusFlags & 0x10 ) = = 0x10 ;
public bool IsHMD = > ( StatusFlags & 0x20 ) = = 0x20 ;
/ * DISPLAYCONFIG_TARGET_IN_USE = 0x00000001 ,
DISPLAYCONFIG_TARGET_FORCIBLE = 0x00000002 ,
DISPLAYCONFIG_TARGET_FORCED_AVAILABILITY_BOOT = 0x00000004 ,
DISPLAYCONFIG_TARGET_FORCED_AVAILABILITY_PATH = 0x00000008 ,
DISPLAYCONFIG_TARGET_FORCED_AVAILABILITY_SYSTEM = 0x00000010 ,
DISPLAYCONFIG_TARGET_IS_HMD = 0x00000020 , * /
2021-08-31 09:06:08 +00:00
public override bool Equals ( object obj ) = > obj is DISPLAYCONFIG_PATH_TARGET_INFO other & & this . Equals ( other ) ;
2021-07-24 03:19:24 +00:00
public bool Equals ( DISPLAYCONFIG_PATH_TARGET_INFO other )
2021-07-24 04:05:38 +00:00
= > // AdapterId.Equals(other.AdapterId) && // Removed the AdapterId from the Equals, as it changes after reboot.
2021-10-20 05:06:02 +00:00
// Id == other.Id && // Removed as ID changes after reboot when the display is a cloned copy :(
2021-07-24 03:19:24 +00:00
ModeInfoIdx = = other . ModeInfoIdx & &
OutputTechnology . Equals ( other . OutputTechnology ) & &
Rotation . Equals ( other . Rotation ) & &
Scaling . Equals ( other . Scaling ) & &
RefreshRate . Equals ( other . RefreshRate ) & &
ScanLineOrdering . Equals ( other . ScanLineOrdering ) & &
TargetAvailable = = other . TargetAvailable & &
StatusFlags . Equals ( StatusFlags ) ;
public override int GetHashCode ( )
{
return ( AdapterId , Id , ModeInfoIdx , OutputTechnology , Rotation , Scaling , RefreshRate , ScanLineOrdering , TargetAvailable , StatusFlags ) . GetHashCode ( ) ;
}
2021-08-31 09:06:08 +00:00
public static bool operator = = ( DISPLAYCONFIG_PATH_TARGET_INFO lhs , DISPLAYCONFIG_PATH_TARGET_INFO rhs ) = > lhs . Equals ( rhs ) ;
public static bool operator ! = ( DISPLAYCONFIG_PATH_TARGET_INFO lhs , DISPLAYCONFIG_PATH_TARGET_INFO rhs ) = > ! ( lhs = = rhs ) ;
2021-06-29 10:15:57 +00:00
}
[StructLayout(LayoutKind.Sequential)]
2021-07-24 03:19:24 +00:00
public struct DISPLAYCONFIG_PATH_INFO : IEquatable < DISPLAYCONFIG_PATH_INFO >
2021-06-29 10:15:57 +00:00
{
2021-07-24 03:19:24 +00:00
public DISPLAYCONFIG_PATH_SOURCE_INFO SourceInfo ;
public DISPLAYCONFIG_PATH_TARGET_INFO TargetInfo ;
2021-10-20 05:06:02 +00:00
public DISPLAYCONFIG_PATH_FLAGS Flags ;
2021-07-24 03:19:24 +00:00
2021-08-31 09:06:08 +00:00
public override bool Equals ( object obj ) = > obj is DISPLAYCONFIG_PATH_INFO other & & this . Equals ( other ) ;
2021-07-24 03:19:24 +00:00
public bool Equals ( DISPLAYCONFIG_PATH_INFO other )
= > SourceInfo . Equals ( other . SourceInfo ) & &
TargetInfo . Equals ( other . TargetInfo ) & &
Flags . Equals ( other . Flags ) ;
public override int GetHashCode ( )
{
return ( SourceInfo , TargetInfo , Flags ) . GetHashCode ( ) ;
}
2021-08-31 09:06:08 +00:00
public static bool operator = = ( DISPLAYCONFIG_PATH_INFO lhs , DISPLAYCONFIG_PATH_INFO rhs ) = > lhs . Equals ( rhs ) ;
public static bool operator ! = ( DISPLAYCONFIG_PATH_INFO lhs , DISPLAYCONFIG_PATH_INFO rhs ) = > ! ( lhs = = rhs ) ;
2021-06-29 10:15:57 +00:00
}
2021-07-24 04:05:38 +00:00
[StructLayout(LayoutKind.Explicit)]
2021-07-24 03:19:24 +00:00
public struct DISPLAYCONFIG_MODE_INFO : IEquatable < DISPLAYCONFIG_MODE_INFO >
2021-06-29 10:15:57 +00:00
{
2021-07-24 04:05:38 +00:00
[FieldOffset((0))]
2021-07-24 03:19:24 +00:00
public DISPLAYCONFIG_MODE_INFO_TYPE InfoType ;
2021-07-24 04:05:38 +00:00
[FieldOffset(4)]
2021-07-24 03:19:24 +00:00
public uint Id ;
2021-07-24 04:05:38 +00:00
[FieldOffset(8)]
2021-07-24 03:19:24 +00:00
public LUID AdapterId ;
2021-07-24 04:05:38 +00:00
// These 3 fields are all a C union in wingdi.dll
[FieldOffset(16)]
public DISPLAYCONFIG_TARGET_MODE TargetMode ;
[FieldOffset(16)]
public DISPLAYCONFIG_SOURCE_MODE SourceMode ;
[FieldOffset(16)]
public DISPLAYCONFIG_DESKTOP_IMAGE_INFO DesktopImageInfo ;
2021-07-24 03:19:24 +00:00
2021-08-31 09:06:08 +00:00
public override bool Equals ( object obj ) = > obj is DISPLAYCONFIG_MODE_INFO other & & this . Equals ( other ) ;
2021-07-24 03:19:24 +00:00
public bool Equals ( DISPLAYCONFIG_MODE_INFO other )
2021-07-24 04:05:38 +00:00
{
if ( InfoType ! = other . InfoType )
return false ;
2021-10-16 21:44:03 +00:00
// This happens when it is a target mode info block
2021-07-24 04:05:38 +00:00
if ( InfoType = = DISPLAYCONFIG_MODE_INFO_TYPE . DISPLAYCONFIG_MODE_INFO_TYPE_TARGET & &
Id = = other . Id & &
TargetMode . Equals ( other . TargetMode ) )
return true ;
2021-10-16 21:44:03 +00:00
// This happens when it is a source mode info block
2021-07-24 04:05:38 +00:00
if ( InfoType = = DISPLAYCONFIG_MODE_INFO_TYPE . DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE & &
2021-09-08 08:04:37 +00:00
//Id == other.Id && // Disabling this check as as the Display ID it maps to will change after a switch from surround to non-surround profile, ruining the equality match
// Only seems to be a problem with the DISPLAYCONFIG_MODE_INFO_TYPE.DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE options weirdly enough!
2021-07-24 04:05:38 +00:00
SourceMode . Equals ( other . SourceMode ) )
return true ;
2021-10-16 21:44:03 +00:00
// This happens when it is a desktop image mode info block
2021-07-24 04:05:38 +00:00
if ( InfoType = = DISPLAYCONFIG_MODE_INFO_TYPE . DISPLAYCONFIG_MODE_INFO_TYPE_DESKTOP_IMAGE & &
Id = = other . Id & &
DesktopImageInfo . Equals ( other . DesktopImageInfo ) )
return true ;
2021-10-16 21:44:03 +00:00
// This happens when it is a clone - there is an extra entry with all zeros in it!
if ( InfoType = = DISPLAYCONFIG_MODE_INFO_TYPE . Zero & &
Id = = other . Id & &
DesktopImageInfo . Equals ( other . DesktopImageInfo ) & &
TargetMode . Equals ( other . TargetMode ) & &
SourceMode . Equals ( other . SourceMode ) )
return true ;
2021-07-24 04:05:38 +00:00
return false ;
}
2021-07-24 03:19:24 +00:00
public override int GetHashCode ( )
{
2021-07-24 04:05:38 +00:00
if ( InfoType = = DISPLAYCONFIG_MODE_INFO_TYPE . DISPLAYCONFIG_MODE_INFO_TYPE_TARGET )
return ( InfoType , Id , TargetMode ) . GetHashCode ( ) ;
if ( InfoType = = DISPLAYCONFIG_MODE_INFO_TYPE . DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE )
return ( InfoType , Id , SourceMode ) . GetHashCode ( ) ;
if ( InfoType = = DISPLAYCONFIG_MODE_INFO_TYPE . DISPLAYCONFIG_MODE_INFO_TYPE_DESKTOP_IMAGE )
return ( InfoType , Id , DesktopImageInfo ) . GetHashCode ( ) ;
// otherwise we return everything
return ( InfoType , Id , TargetMode , SourceMode , DesktopImageInfo ) . GetHashCode ( ) ;
2021-07-24 03:19:24 +00:00
}
2021-08-31 09:06:08 +00:00
public static bool operator = = ( DISPLAYCONFIG_MODE_INFO lhs , DISPLAYCONFIG_MODE_INFO rhs ) = > lhs . Equals ( rhs ) ;
public static bool operator ! = ( DISPLAYCONFIG_MODE_INFO lhs , DISPLAYCONFIG_MODE_INFO rhs ) = > ! ( lhs = = rhs ) ;
2021-06-29 10:15:57 +00:00
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
2021-07-24 04:05:38 +00:00
public struct DISPLAYCONFIG_SOURCE_DEVICE_NAME : IEquatable < DISPLAYCONFIG_SOURCE_DEVICE_NAME >
2021-06-29 10:15:57 +00:00
{
2021-07-24 03:19:24 +00:00
public DISPLAYCONFIG_DEVICE_INFO_HEADER Header ;
2021-06-29 10:15:57 +00:00
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
2021-07-24 03:19:24 +00:00
public string ViewGdiDeviceName ;
2021-08-31 09:06:08 +00:00
public override bool Equals ( object obj ) = > obj is DISPLAYCONFIG_SOURCE_DEVICE_NAME other & & this . Equals ( other ) ;
2021-07-24 04:05:38 +00:00
public bool Equals ( DISPLAYCONFIG_SOURCE_DEVICE_NAME other )
2021-07-24 03:19:24 +00:00
= > Header . Equals ( other . Header ) & &
ViewGdiDeviceName = = other . ViewGdiDeviceName ;
public override int GetHashCode ( )
{
return ( Header , ViewGdiDeviceName ) . GetHashCode ( ) ;
}
2021-08-31 09:06:08 +00:00
public static bool operator = = ( DISPLAYCONFIG_SOURCE_DEVICE_NAME lhs , DISPLAYCONFIG_SOURCE_DEVICE_NAME rhs ) = > lhs . Equals ( rhs ) ;
public static bool operator ! = ( DISPLAYCONFIG_SOURCE_DEVICE_NAME lhs , DISPLAYCONFIG_SOURCE_DEVICE_NAME rhs ) = > ! ( lhs = = rhs ) ;
2021-06-29 10:15:57 +00:00
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
2021-07-24 03:19:24 +00:00
public struct DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS : IEquatable < DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS >
2021-06-29 10:15:57 +00:00
{
2021-07-24 03:19:24 +00:00
public uint Value ;
2021-08-31 09:06:08 +00:00
public override bool Equals ( object obj ) = > obj is DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS other & & this . Equals ( other ) ;
2021-07-24 03:19:24 +00:00
public bool Equals ( DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS other )
= > Value = = other . Value ;
2021-07-24 04:05:38 +00:00
public bool FriendlyNameFromEdid = > ( Value & 0x1 ) = = 0x1 ; // Might be this broken?
2021-07-24 03:19:24 +00:00
public bool FriendlyNameForced = > ( Value & 0x2 ) = = 0x2 ;
public bool EdidIdsValid = > ( Value & 0x4 ) = = 0x4 ;
public override int GetHashCode ( )
{
return Value . GetHashCode ( ) ;
}
2021-08-31 09:06:08 +00:00
public static bool operator = = ( DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS lhs , DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS rhs ) = > lhs . Equals ( rhs ) ;
public static bool operator ! = ( DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS lhs , DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS rhs ) = > ! ( lhs = = rhs ) ;
2021-06-29 10:15:57 +00:00
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
2021-07-24 04:05:38 +00:00
public struct DISPLAYCONFIG_TARGET_DEVICE_NAME : IEquatable < DISPLAYCONFIG_TARGET_DEVICE_NAME >
2021-07-24 03:19:24 +00:00
{
public DISPLAYCONFIG_DEVICE_INFO_HEADER Header ;
public DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS Flags ;
public DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY OutputTechnology ;
public ushort EdidManufactureId ;
public ushort EdidProductCodeId ;
public uint ConnectorInstance ;
2021-06-29 10:15:57 +00:00
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
2021-07-24 03:19:24 +00:00
public string MonitorFriendlyDeviceName ;
2021-06-29 10:15:57 +00:00
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
2021-07-24 03:19:24 +00:00
public string MonitorDevicePath ;
2021-08-31 09:06:08 +00:00
public override bool Equals ( object obj ) = > obj is DISPLAYCONFIG_TARGET_DEVICE_NAME other & & this . Equals ( other ) ;
2021-07-24 04:05:38 +00:00
public bool Equals ( DISPLAYCONFIG_TARGET_DEVICE_NAME other )
2021-07-24 03:19:24 +00:00
= > Header . Equals ( other . Header ) & &
Flags . Equals ( other . Flags ) & &
OutputTechnology . Equals ( other . OutputTechnology ) & &
EdidManufactureId = = other . EdidManufactureId & &
EdidProductCodeId = = other . EdidProductCodeId & &
ConnectorInstance = = other . ConnectorInstance & &
MonitorFriendlyDeviceName = = other . MonitorFriendlyDeviceName & &
MonitorDevicePath = = other . MonitorDevicePath ;
public override int GetHashCode ( )
{
return ( Header , Flags , OutputTechnology , EdidManufactureId , EdidProductCodeId , ConnectorInstance , MonitorFriendlyDeviceName , MonitorDevicePath ) . GetHashCode ( ) ;
}
2021-08-31 09:06:08 +00:00
public static bool operator = = ( DISPLAYCONFIG_TARGET_DEVICE_NAME lhs , DISPLAYCONFIG_TARGET_DEVICE_NAME rhs ) = > lhs . Equals ( rhs ) ;
public static bool operator ! = ( DISPLAYCONFIG_TARGET_DEVICE_NAME lhs , DISPLAYCONFIG_TARGET_DEVICE_NAME rhs ) = > ! ( lhs = = rhs ) ;
2021-06-29 10:15:57 +00:00
}
[StructLayout(LayoutKind.Sequential)]
2021-07-24 04:05:38 +00:00
public struct DISPLAYCONFIG_TARGET_PREFERRED_MODE : IEquatable < DISPLAYCONFIG_TARGET_PREFERRED_MODE >
2021-06-29 10:15:57 +00:00
{
2021-07-24 03:19:24 +00:00
public DISPLAYCONFIG_DEVICE_INFO_HEADER Header ;
2021-06-29 10:15:57 +00:00
public uint Width ;
public uint Height ;
public DISPLAYCONFIG_TARGET_MODE TargetMode ;
2021-07-24 03:19:24 +00:00
2021-08-31 09:06:08 +00:00
public override bool Equals ( object obj ) = > obj is DISPLAYCONFIG_TARGET_PREFERRED_MODE other & & this . Equals ( other ) ;
2021-07-24 04:05:38 +00:00
public bool Equals ( DISPLAYCONFIG_TARGET_PREFERRED_MODE other )
2021-07-24 03:19:24 +00:00
= > Header . Equals ( other . Header ) & &
Width = = other . Width & &
Height = = other . Height & &
TargetMode . Equals ( other . TargetMode ) ;
public override int GetHashCode ( )
{
return ( Header , Width , Height , TargetMode ) . GetHashCode ( ) ;
}
2021-08-31 09:06:08 +00:00
public static bool operator = = ( DISPLAYCONFIG_TARGET_PREFERRED_MODE lhs , DISPLAYCONFIG_TARGET_PREFERRED_MODE rhs ) = > lhs . Equals ( rhs ) ;
public static bool operator ! = ( DISPLAYCONFIG_TARGET_PREFERRED_MODE lhs , DISPLAYCONFIG_TARGET_PREFERRED_MODE rhs ) = > ! ( lhs = = rhs ) ;
2021-06-29 10:15:57 +00:00
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
2021-07-24 04:05:38 +00:00
public struct DISPLAYCONFIG_ADAPTER_NAME : IEquatable < DISPLAYCONFIG_ADAPTER_NAME >
2021-06-29 10:15:57 +00:00
{
2021-07-24 03:19:24 +00:00
public DISPLAYCONFIG_DEVICE_INFO_HEADER Header ;
2021-06-29 10:15:57 +00:00
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string AdapterDevicePath ;
2021-07-24 03:19:24 +00:00
2021-08-31 09:06:08 +00:00
public override bool Equals ( object obj ) = > obj is DISPLAYCONFIG_ADAPTER_NAME other & & this . Equals ( other ) ;
2021-07-24 04:05:38 +00:00
public bool Equals ( DISPLAYCONFIG_ADAPTER_NAME other )
2021-07-24 03:19:24 +00:00
= > Header . Equals ( other . Header ) & &
AdapterDevicePath = = other . AdapterDevicePath ;
public override int GetHashCode ( )
{
return ( Header , AdapterDevicePath ) . GetHashCode ( ) ;
}
2021-08-31 09:06:08 +00:00
public static bool operator = = ( DISPLAYCONFIG_ADAPTER_NAME lhs , DISPLAYCONFIG_ADAPTER_NAME rhs ) = > lhs . Equals ( rhs ) ;
public static bool operator ! = ( DISPLAYCONFIG_ADAPTER_NAME lhs , DISPLAYCONFIG_ADAPTER_NAME rhs ) = > ! ( lhs = = rhs ) ;
2021-06-29 10:15:57 +00:00
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
2021-07-24 04:05:38 +00:00
public struct DISPLAYCONFIG_SUPPORT_VIRTUAL_RESOLUTION : IEquatable < DISPLAYCONFIG_SUPPORT_VIRTUAL_RESOLUTION >
2021-06-29 10:15:57 +00:00
{
2021-07-24 03:19:24 +00:00
public DISPLAYCONFIG_DEVICE_INFO_HEADER Header ;
2021-07-24 04:05:38 +00:00
public uint Value ;
2021-06-29 10:15:57 +00:00
public bool IsMonitorVirtualResolutionDisabled
{
2021-07-24 04:05:38 +00:00
get = > ( Value & 0x1 ) = = 0x1 ;
2021-06-29 10:15:57 +00:00
}
2021-08-31 09:06:08 +00:00
public override bool Equals ( object obj ) = > obj is DISPLAYCONFIG_SUPPORT_VIRTUAL_RESOLUTION other & & this . Equals ( other ) ;
2021-07-24 03:19:24 +00:00
public bool Equals ( DISPLAYCONFIG_SUPPORT_VIRTUAL_RESOLUTION other )
= > Header . Equals ( other . Header ) & &
2021-07-24 04:05:38 +00:00
Value = = other . Value ;
2021-07-24 03:19:24 +00:00
public override int GetHashCode ( )
{
2021-07-24 04:05:38 +00:00
return ( Header , Value ) . GetHashCode ( ) ;
2021-07-24 03:19:24 +00:00
}
2021-08-31 09:06:08 +00:00
public static bool operator = = ( DISPLAYCONFIG_SUPPORT_VIRTUAL_RESOLUTION lhs , DISPLAYCONFIG_SUPPORT_VIRTUAL_RESOLUTION rhs ) = > lhs . Equals ( rhs ) ;
public static bool operator ! = ( DISPLAYCONFIG_SUPPORT_VIRTUAL_RESOLUTION lhs , DISPLAYCONFIG_SUPPORT_VIRTUAL_RESOLUTION rhs ) = > ! ( lhs = = rhs ) ;
2021-07-24 03:19:24 +00:00
2021-06-29 10:15:57 +00:00
}
[StructLayout(LayoutKind.Sequential)]
2021-07-24 04:05:38 +00:00
public struct DISPLAYCONFIG_SET_TARGET_PERSISTENCE : IEquatable < DISPLAYCONFIG_SET_TARGET_PERSISTENCE >
2021-06-29 10:15:57 +00:00
{
2021-07-24 03:19:24 +00:00
public DISPLAYCONFIG_DEVICE_INFO_HEADER Header ;
2021-07-24 04:05:38 +00:00
public uint Value ;
2021-06-29 10:15:57 +00:00
public bool IsBootPersistenceOn
{
2021-07-24 04:05:38 +00:00
get = > ( Value & 0x1 ) = = 0x1 ;
2021-07-24 03:19:24 +00:00
}
2021-08-31 09:06:08 +00:00
public override bool Equals ( object obj ) = > obj is DISPLAYCONFIG_SET_TARGET_PERSISTENCE other & & this . Equals ( other ) ;
2021-07-24 03:19:24 +00:00
public bool Equals ( DISPLAYCONFIG_SET_TARGET_PERSISTENCE other )
= > Header . Equals ( other . Header ) & &
2021-07-24 04:05:38 +00:00
Value = = other . Value ;
2021-07-24 03:19:24 +00:00
public override int GetHashCode ( )
{
2021-07-24 04:05:38 +00:00
return ( Header , Value ) . GetHashCode ( ) ;
2021-06-29 10:15:57 +00:00
}
2021-08-31 09:06:08 +00:00
public static bool operator = = ( DISPLAYCONFIG_SET_TARGET_PERSISTENCE lhs , DISPLAYCONFIG_SET_TARGET_PERSISTENCE rhs ) = > lhs . Equals ( rhs ) ;
public static bool operator ! = ( DISPLAYCONFIG_SET_TARGET_PERSISTENCE lhs , DISPLAYCONFIG_SET_TARGET_PERSISTENCE rhs ) = > ! ( lhs = = rhs ) ;
2021-07-24 03:19:24 +00:00
2021-06-29 10:15:57 +00:00
}
[StructLayout(LayoutKind.Sequential)]
2021-07-24 04:05:38 +00:00
public struct DISPLAYCONFIG_TARGET_BASE_TYPE : IEquatable < DISPLAYCONFIG_TARGET_BASE_TYPE >
2021-06-29 10:15:57 +00:00
{
2021-07-24 03:19:24 +00:00
public DISPLAYCONFIG_DEVICE_INFO_HEADER Header ;
2021-07-24 04:05:38 +00:00
//[MarshalAs(UnmanagedType.U4)]
2021-06-29 10:15:57 +00:00
public DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY BaseOutputTechnology ;
2021-08-31 09:06:08 +00:00
public override bool Equals ( object obj ) = > obj is DISPLAYCONFIG_TARGET_BASE_TYPE other & & this . Equals ( other ) ;
2021-07-24 04:05:38 +00:00
public bool Equals ( DISPLAYCONFIG_TARGET_BASE_TYPE other )
2021-07-24 03:19:24 +00:00
= > Header . Equals ( other . Header ) & &
BaseOutputTechnology = = other . BaseOutputTechnology ;
public override int GetHashCode ( )
{
return ( Header , BaseOutputTechnology ) . GetHashCode ( ) ;
}
2021-08-31 09:06:08 +00:00
public static bool operator = = ( DISPLAYCONFIG_TARGET_BASE_TYPE lhs , DISPLAYCONFIG_TARGET_BASE_TYPE rhs ) = > lhs . Equals ( rhs ) ;
public static bool operator ! = ( DISPLAYCONFIG_TARGET_BASE_TYPE lhs , DISPLAYCONFIG_TARGET_BASE_TYPE rhs ) = > ! ( lhs = = rhs ) ;
2021-06-29 10:15:57 +00:00
}
[StructLayout(LayoutKind.Sequential)]
2021-07-24 04:05:38 +00:00
public struct DISPLAYCONFIG_SET_ADVANCED_COLOR_STATE : IEquatable < DISPLAYCONFIG_SET_ADVANCED_COLOR_STATE >
2021-06-29 10:15:57 +00:00
{
2021-07-24 03:19:24 +00:00
public DISPLAYCONFIG_DEVICE_INFO_HEADER Header ;
public uint Value ;
2021-06-29 10:15:57 +00:00
2021-07-24 03:19:24 +00:00
public bool EnableAdvancedColor
2021-06-29 10:15:57 +00:00
{
2021-07-24 03:19:24 +00:00
get = > ( Value & 0x1 ) = = 0x1 ;
2021-07-24 04:05:38 +00:00
set
{
if ( value )
{
Value = 0x1 ;
}
else
{
Value = 0x0 ;
}
}
2021-06-29 10:15:57 +00:00
}
2021-08-31 09:06:08 +00:00
public override bool Equals ( object obj ) = > obj is DISPLAYCONFIG_SET_ADVANCED_COLOR_STATE other & & this . Equals ( other ) ;
2021-07-24 03:19:24 +00:00
public bool Equals ( DISPLAYCONFIG_SET_ADVANCED_COLOR_STATE other )
= > Header . Equals ( other . Header ) & &
Value = = other . Value ;
public override int GetHashCode ( )
{
return ( Header , Value ) . GetHashCode ( ) ;
}
2021-08-31 09:06:08 +00:00
public static bool operator = = ( DISPLAYCONFIG_SET_ADVANCED_COLOR_STATE lhs , DISPLAYCONFIG_SET_ADVANCED_COLOR_STATE rhs ) = > lhs . Equals ( rhs ) ;
public static bool operator ! = ( DISPLAYCONFIG_SET_ADVANCED_COLOR_STATE lhs , DISPLAYCONFIG_SET_ADVANCED_COLOR_STATE rhs ) = > ! ( lhs = = rhs ) ;
2021-06-29 10:15:57 +00:00
}
[StructLayout(LayoutKind.Sequential)]
2021-07-24 04:05:38 +00:00
public struct DISPLAYCONFIG_SDR_WHITE_LEVEL : IEquatable < DISPLAYCONFIG_SDR_WHITE_LEVEL >
2021-06-29 10:15:57 +00:00
{
2021-07-24 03:19:24 +00:00
public DISPLAYCONFIG_DEVICE_INFO_HEADER Header ;
2021-06-29 10:15:57 +00:00
// SDRWhiteLevel represents a multiplier for standard SDR white
// peak value i.e. 80 nits represented as fixed point.
// To get value in nits use the following conversion
// SDRWhiteLevel in nits = (SDRWhiteLevel / 1000 ) * 80
2021-07-24 04:05:38 +00:00
// NOTE! Weirdly this is supposed to be a ulong, but there is an error in Win10 64-bit
// where it actually returns a uint! So had to engineer in a bug :(
2021-07-24 03:19:24 +00:00
public uint SDRWhiteLevel ;
2021-08-31 09:06:08 +00:00
public override bool Equals ( object obj ) = > obj is DISPLAYCONFIG_SDR_WHITE_LEVEL other & & this . Equals ( other ) ;
2021-07-24 03:19:24 +00:00
public bool Equals ( DISPLAYCONFIG_SDR_WHITE_LEVEL other )
= > Header . Equals ( other . Header ) & &
SDRWhiteLevel = = other . SDRWhiteLevel ;
public override int GetHashCode ( )
{
return ( Header , SDRWhiteLevel ) . GetHashCode ( ) ;
}
2021-08-31 09:06:08 +00:00
public static bool operator = = ( DISPLAYCONFIG_SDR_WHITE_LEVEL lhs , DISPLAYCONFIG_SDR_WHITE_LEVEL rhs ) = > lhs . Equals ( rhs ) ;
public static bool operator ! = ( DISPLAYCONFIG_SDR_WHITE_LEVEL lhs , DISPLAYCONFIG_SDR_WHITE_LEVEL rhs ) = > ! ( lhs = = rhs ) ;
2021-06-29 10:15:57 +00:00
}
[StructLayout(LayoutKind.Sequential)]
2021-07-24 04:05:38 +00:00
public struct RECTL : IEquatable < RECTL >
2021-06-29 10:15:57 +00:00
{
2021-07-24 03:19:24 +00:00
public int Left ;
public int Top ;
public int Right ;
public int Bottom ;
2021-08-31 09:06:08 +00:00
public override bool Equals ( object obj ) = > obj is RECTL other & & this . Equals ( other ) ;
2021-07-24 04:05:38 +00:00
public bool Equals ( RECTL other )
2021-07-24 03:19:24 +00:00
= > Left = = other . Left & &
Top = = other . Top & &
Right = = other . Right & &
Bottom = = other . Bottom ;
public override int GetHashCode ( )
{
return ( Left , Top , Right , Bottom ) . GetHashCode ( ) ;
}
2021-08-31 09:06:08 +00:00
public static bool operator = = ( RECTL lhs , RECTL rhs ) = > lhs . Equals ( rhs ) ;
public static bool operator ! = ( RECTL lhs , RECTL rhs ) = > ! ( lhs = = rhs ) ;
2021-06-29 10:15:57 +00:00
}
2021-07-24 03:19:24 +00:00
2021-06-29 10:15:57 +00:00
class CCDImport
{
2021-07-24 04:05:38 +00:00
// Set some useful constants
public const SDC SDC_CCD_TEST_IF_VALID = ( SDC . SDC_VALIDATE | SDC . SDC_USE_SUPPLIED_DISPLAY_CONFIG ) ;
2021-10-20 05:06:02 +00:00
public const uint DISPLAYCONFIG_PATH_MODE_IDX_INVALID = 0xffffffff ;
2021-07-24 04:05:38 +00:00
2021-06-29 10:15:57 +00:00
// GetDisplayConfigBufferSizes
[DllImport("user32")]
2021-07-24 03:19:24 +00:00
public static extern WIN32STATUS GetDisplayConfigBufferSizes ( QDC flags , out int numPathArrayElements , out int numModeInfoArrayElements ) ;
2021-06-29 10:15:57 +00:00
// QueryDisplayConfig
[DllImport("user32")]
2021-07-24 03:19:24 +00:00
public static extern WIN32STATUS QueryDisplayConfig ( QDC flags , ref int numPathArrayElements , [ In , Out ] DISPLAYCONFIG_PATH_INFO [ ] pathArray , ref int numModeInfoArrayElements , [ In , Out ] DISPLAYCONFIG_MODE_INFO [ ] modeInfoArray , out DISPLAYCONFIG_TOPOLOGY_ID currentTopologyId ) ;
2021-06-29 10:15:57 +00:00
[DllImport("user32")]
2021-07-24 03:19:24 +00:00
public static extern WIN32STATUS QueryDisplayConfig ( QDC flags , ref int numPathArrayElements , [ In , Out ] DISPLAYCONFIG_PATH_INFO [ ] pathArray , ref int numModeInfoArrayElements , [ In , Out ] DISPLAYCONFIG_MODE_INFO [ ] modeInfoArray , IntPtr currentTopologyId ) ;
2021-06-29 10:15:57 +00:00
// DisplayConfigGetDeviceInfo
[DllImport("user32")]
2021-07-24 04:05:38 +00:00
public static extern WIN32STATUS DisplayConfigGetDeviceInfo ( ref DISPLAYCONFIG_SOURCE_DEVICE_NAME requestPacket ) ;
2021-06-29 10:15:57 +00:00
[DllImport("user32")]
2021-07-24 04:05:38 +00:00
public static extern WIN32STATUS DisplayConfigGetDeviceInfo ( ref DISPLAYCONFIG_TARGET_DEVICE_NAME requestPacket ) ;
2021-06-29 10:15:57 +00:00
[DllImport("user32")]
2021-07-24 04:05:38 +00:00
public static extern WIN32STATUS DisplayConfigGetDeviceInfo ( ref DISPLAYCONFIG_TARGET_PREFERRED_MODE requestPacket ) ;
2021-06-29 10:15:57 +00:00
[DllImport("user32")]
2021-07-24 04:05:38 +00:00
public static extern WIN32STATUS DisplayConfigGetDeviceInfo ( ref DISPLAYCONFIG_ADAPTER_NAME requestPacket ) ;
2021-06-29 10:15:57 +00:00
[DllImport("user32")]
2021-07-24 03:19:24 +00:00
public static extern WIN32STATUS DisplayConfigGetDeviceInfo ( ref DISPLAYCONFIG_SET_TARGET_PERSISTENCE requestPacket ) ;
2021-06-29 10:15:57 +00:00
[DllImport("user32")]
2021-07-24 04:05:38 +00:00
public static extern WIN32STATUS DisplayConfigGetDeviceInfo ( ref DISPLAYCONFIG_TARGET_BASE_TYPE requestPacket ) ;
2021-06-29 10:15:57 +00:00
[DllImport("user32")]
2021-07-24 03:19:24 +00:00
public static extern WIN32STATUS DisplayConfigGetDeviceInfo ( ref DISPLAYCONFIG_SUPPORT_VIRTUAL_RESOLUTION requestPacket ) ;
2021-06-29 10:15:57 +00:00
/ * [ DllImport ( "user32" ) ]
2021-07-24 03:19:24 +00:00
public static extern WIN32STATUS DisplayConfigGetDeviceInfo ( ref DISPLAYCONFIG_SET_SUPPORT_VIRTUAL_RESOLUTION requestPacket ) ;
2021-06-29 10:15:57 +00:00
* /
[DllImport("user32")]
2021-07-24 03:19:24 +00:00
public static extern WIN32STATUS DisplayConfigGetDeviceInfo ( ref DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO requestPacket ) ;
2021-06-29 10:15:57 +00:00
[DllImport("user32")]
2021-07-24 03:19:24 +00:00
public static extern WIN32STATUS DisplayConfigGetDeviceInfo ( ref DISPLAYCONFIG_SET_ADVANCED_COLOR_STATE requestPacket ) ;
2021-06-29 10:15:57 +00:00
[DllImport("user32")]
2021-07-24 03:19:24 +00:00
public static extern WIN32STATUS DisplayConfigGetDeviceInfo ( ref DISPLAYCONFIG_SDR_WHITE_LEVEL requestPacket ) ;
2021-06-29 10:15:57 +00:00
// DisplayConfigSetDeviceInfo
[DllImport("user32")]
2021-07-24 04:05:38 +00:00
public static extern WIN32STATUS DisplayConfigSetDeviceInfo ( ref DISPLAYCONFIG_SET_TARGET_PERSISTENCE requestPacket ) ;
[DllImport("user32")]
public static extern WIN32STATUS DisplayConfigSetDeviceInfo ( ref DISPLAYCONFIG_SET_ADVANCED_COLOR_STATE requestPacket ) ;
2021-06-29 10:15:57 +00:00
// Have disabled the DisplayConfigSetDeviceInfo options except for SET_TARGET_PERSISTENCE, as per the note
// from https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-displayconfigsetdeviceinfo
// "DisplayConfigSetDeviceInfo can currently only be used to start and stop boot persisted force projection on an analog target."
/ * [ DllImport ( "user32" ) ]
public static extern int DisplayConfigSetDeviceInfo ( ref DISPLAYCONFIG_SUPPORT_VIRTUAL_RESOLUTION targetSupportVirtualResolution ) ; * /
// SetDisplayConfig
[DllImport("user32")]
2021-07-24 04:05:38 +00:00
public static extern WIN32STATUS SetDisplayConfig ( [ In ] uint numPathArrayElements , [ In ] DISPLAYCONFIG_PATH_INFO [ ] pathArray , [ In ] uint numModeInfoArrayElements , [ In ] DISPLAYCONFIG_MODE_INFO [ ] modeInfoArray , [ In ] SDC flags ) ;
2021-06-29 10:15:57 +00:00
}
2021-07-24 04:05:38 +00:00
}