728x90
728x170
▶ MonitorHelper.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace TestProject
{
/// <summary>
/// 모니터 헬퍼
/// </summary>
public static class MonitorHelper
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Enumeration
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 장치 구성 질의 플래그 - QUERY_DEVICE_CONFIG_FLAG
/// <summary>
/// 장치 구성 질의 플래그
/// </summary>
public enum QUERY_DEVICE_CONFIG_FLAG : uint
{
/// <summary>
/// QDC_ALL_PATHS
/// </summary>
QDC_ALL_PATHS = 0x00000001,
/// <summary>
/// QDC_ONLY_ACTIVE_PATHS
/// </summary>
QDC_ONLY_ACTIVE_PATHS = 0x00000002,
/// <summary>
/// QDC_DATABASE_CURRENT
/// </summary>
QDC_DATABASE_CURRENT = 0x00000004
}
#endregion
#region 디스플레이 구성 / 비디오 출력 기술 - DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY
/// <summary>
/// 디스플레이 구성 / 비디오 출력 기술
/// </summary>
public enum DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY : uint
{
/// <summary>
/// DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER
/// </summary>
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER = 0xFFFFFFFF,
/// <summary>
/// DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HD15
/// </summary>
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HD15 = 0,
/// <summary>
/// DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SVIDEO
/// </summary>
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SVIDEO = 1,
/// <summary>
/// DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPOSITE_VIDEO
/// </summary>
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPOSITE_VIDEO = 2,
/// <summary>
/// DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPONENT_VIDEO
/// </summary>
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPONENT_VIDEO = 3,
/// <summary>
/// DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DVI
/// </summary>
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DVI = 4,
/// <summary>
/// DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI
/// </summary>
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI = 5,
/// <summary>
/// DISPLAYCONFIG_OUTPUT_TECHNOLOGY_LVDS
/// </summary>
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_LVDS = 6,
/// <summary>
/// DISPLAYCONFIG_OUTPUT_TECHNOLOGY_D_JPN
/// </summary>
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_D_JPN = 8,
/// <summary>
/// DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDI
/// </summary>
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDI = 9,
/// <summary>
/// DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EXTERNAL
/// </summary>
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EXTERNAL = 10,
/// <summary>
/// DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED
/// </summary>
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED = 11,
/// <summary>
/// DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EXTERNAL
/// </summary>
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EXTERNAL = 12,
/// <summary>
/// DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EMBEDDED
/// </summary>
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EMBEDDED = 13,
/// <summary>
/// DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDTVDONGLE
/// </summary>
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDTVDONGLE = 14,
/// <summary>
/// DISPLAYCONFIG_OUTPUT_TECHNOLOGY_MIRACAST
/// </summary>
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_MIRACAST = 15,
/// <summary>
/// DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL
/// </summary>
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL = 0x80000000,
/// <summary>
/// DISPLAYCONFIG_OUTPUT_TECHNOLOGY_FORCE_UINT32
/// </summary>
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_FORCE_UINT32 = 0xFFFFFFFF
}
#endregion
#region 디스플레이 구성 / 스캔 라인 순서 - DISPLAYCONFIG_SCANLINE_ORDERING
/// <summary>
/// 디스플레이 구성 / 스캔 라인 순서
/// </summary>
public enum DISPLAYCONFIG_SCANLINE_ORDERING : uint
{
/// <summary>
/// DISPLAYCONFIG_SCANLINE_ORDERING_UNSPECIFIED
/// </summary>
DISPLAYCONFIG_SCANLINE_ORDERING_UNSPECIFIED = 0,
/// <summary>
/// DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE
/// </summary>
DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE = 1,
/// <summary>
/// DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED
/// </summary>
DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED = 2,
/// <summary>
/// DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_UPPERFIELDFIRST
/// </summary>
DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_UPPERFIELDFIRST = DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED,
/// <summary>
/// DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_LOWERFIELDFIRST
/// </summary>
DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_LOWERFIELDFIRST = 3,
/// <summary>
/// DISPLAYCONFIG_SCANLINE_ORDERING_FORCE_UINT32
/// </summary>
DISPLAYCONFIG_SCANLINE_ORDERING_FORCE_UINT32 = 0xFFFFFFFF
}
#endregion
#region 디스플레이 구성 / 회전 - DISPLAYCONFIG_ROTATION
/// <summary>
/// 디스플레이 구성 / 회전
/// </summary>
public enum DISPLAYCONFIG_ROTATION : uint
{
/// <summary>
/// DISPLAYCONFIG_ROTATION_IDENTITY
/// </summary>
DISPLAYCONFIG_ROTATION_IDENTITY = 1,
/// <summary>
/// DISPLAYCONFIG_ROTATION_ROTATE90
/// </summary>
DISPLAYCONFIG_ROTATION_ROTATE90 = 2,
/// <summary>
/// DISPLAYCONFIG_ROTATION_ROTATE180
/// </summary>
DISPLAYCONFIG_ROTATION_ROTATE180 = 3,
/// <summary>
/// DISPLAYCONFIG_ROTATION_ROTATE270
/// </summary>
DISPLAYCONFIG_ROTATION_ROTATE270 = 4,
/// <summary>
/// DISPLAYCONFIG_ROTATION_FORCE_UINT32
/// </summary>
DISPLAYCONFIG_ROTATION_FORCE_UINT32 = 0xFFFFFFFF
}
#endregion
#region 디스플레이 구성 / 축적 - DISPLAYCONFIG_SCALING
/// <summary>
/// 디스플레이 구성 / 축적
/// </summary>
public enum DISPLAYCONFIG_SCALING : uint
{
/// <summary>
/// DISPLAYCONFIG_SCALING_IDENTITY
/// </summary>
DISPLAYCONFIG_SCALING_IDENTITY = 1,
/// <summary>
/// DISPLAYCONFIG_SCALING_CENTERED
/// </summary>
DISPLAYCONFIG_SCALING_CENTERED = 2,
/// <summary>
/// DISPLAYCONFIG_SCALING_STRETCHED
/// </summary>
DISPLAYCONFIG_SCALING_STRETCHED = 3,
/// <summary>
/// DISPLAYCONFIG_SCALING_ASPECTRATIOCENTEREDMAX
/// </summary>
DISPLAYCONFIG_SCALING_ASPECTRATIOCENTEREDMAX = 4,
/// <summary>
/// DISPLAYCONFIG_SCALING_CUSTOM
/// </summary>
DISPLAYCONFIG_SCALING_CUSTOM = 5,
/// <summary>
/// DISPLAYCONFIG_SCALING_PREFERRED
/// </summary>
DISPLAYCONFIG_SCALING_PREFERRED = 128,
/// <summary>
/// DISPLAYCONFIG_SCALING_FORCE_UINT32
/// </summary>
DISPLAYCONFIG_SCALING_FORCE_UINT32 = 0xFFFFFFFF
}
#endregion
#region 디스플레이 구성 / 픽셀 포맷 - DISPLAYCONFIG_PIXELFORMAT
/// <summary>
/// 디스플레이 구성 / 픽셀 포맷
/// </summary>
public enum DISPLAYCONFIG_PIXELFORMAT : uint
{
/// <summary>
/// DISPLAYCONFIG_PIXELFORMAT_8BPP
/// </summary>
DISPLAYCONFIG_PIXELFORMAT_8BPP = 1,
/// <summary>
/// DISPLAYCONFIG_PIXELFORMAT_16BPP
/// </summary>
DISPLAYCONFIG_PIXELFORMAT_16BPP = 2,
/// <summary>
/// DISPLAYCONFIG_PIXELFORMAT_24BPP
/// </summary>
DISPLAYCONFIG_PIXELFORMAT_24BPP = 3,
/// <summary>
/// DISPLAYCONFIG_PIXELFORMAT_32BPP
/// </summary>
DISPLAYCONFIG_PIXELFORMAT_32BPP = 4,
/// <summary>
/// DISPLAYCONFIG_PIXELFORMAT_NONGDI
/// </summary>
DISPLAYCONFIG_PIXELFORMAT_NONGDI = 5,
/// <summary>
/// DISPLAYCONFIG_PIXELFORMAT_FORCE_UINT32
/// </summary>
DISPLAYCONFIG_PIXELFORMAT_FORCE_UINT32 = 0xffffffff
}
#endregion
#region 디스플레이 구성 / 모드 정보 타입 - DISPLAYCONFIG_MODE_INFO_TYPE
/// <summary>
/// 디스플레이 구성 / 모드 정보 타입
/// </summary>
public enum DISPLAYCONFIG_MODE_INFO_TYPE : uint
{
/// <summary>
/// DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE
/// </summary>
DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE = 1,
/// <summary>
/// DISPLAYCONFIG_MODE_INFO_TYPE_TARGET
/// </summary>
DISPLAYCONFIG_MODE_INFO_TYPE_TARGET = 2,
/// <summary>
/// DISPLAYCONFIG_MODE_INFO_TYPE_FORCE_UINT32
/// </summary>
DISPLAYCONFIG_MODE_INFO_TYPE_FORCE_UINT32 = 0xFFFFFFFF
}
#endregion
#region 디스플레이 구성 / 장치 정보 타입 - DISPLAYCONFIG_DEVICE_INFO_TYPE
/// <summary>
/// 디스플레이 구성 / 장치 정보 타입
/// </summary>
public enum DISPLAYCONFIG_DEVICE_INFO_TYPE : uint
{
/// <summary>
/// DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME
/// </summary>
DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME = 1,
/// <summary>
/// DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME
/// </summary>
DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME = 2,
/// <summary>
/// DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE
/// </summary>
DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE = 3,
/// <summary>
/// DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME
/// </summary>
DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME = 4,
/// <summary>
/// DISPLAYCONFIG_DEVICE_INFO_SET_TARGET_PERSISTENCE
/// </summary>
DISPLAYCONFIG_DEVICE_INFO_SET_TARGET_PERSISTENCE = 5,
/// <summary>
/// DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_BASE_TYPE
/// </summary>
DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_BASE_TYPE = 6,
/// <summary>
/// DISPLAYCONFIG_DEVICE_INFO_FORCE_UINT32
/// </summary>
DISPLAYCONFIG_DEVICE_INFO_FORCE_UINT32 = 0xFFFFFFFF
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Structure
////////////////////////////////////////////////////////////////////////////////////////// Public
#region LUID - LUID
/// <summary>
/// LUID
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct LUID
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// 하위 파트
/// </summary>
public uint LowPart;
/// <summary>
/// 상위 파트
/// </summary>
public int HighPart;
#endregion
}
#endregion
#region 포인트 - POINT
/// <summary>
/// 포인트
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// X
/// </summary>
public int X;
/// <summary>
/// X
/// </summary>
public int Y;
#endregion
}
#endregion
#region 디스플레이 구성 / 경로 소스 정보 - DISPLAYCONFIG_PATH_SOURCE_INFO
/// <summary>
/// 디스플레이 구성 / 경로 소스 정보
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_PATH_SOURCE_INFO
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// 어댑터 ID
/// </summary>
public LUID AdapterID;
/// <summary>
/// ID
/// </summary>
public uint ID;
/// <summary>
/// 모드 정보 인덱스
/// </summary>
public uint ModeInforIndex;
/// <summary>
/// 상태 플래그
/// </summary>
public uint StatusFlag;
#endregion
}
#endregion
#region 디스플레이 구성 / 경로 타겟 정보 - DISPLAYCONFIG_PATH_TARGET_INFO
/// <summary>
/// 디스플레이 구성 / 경로 타겟 정보
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_PATH_TARGET_INFO
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// 어댑터 ID
/// </summary>
public LUID adapterID;
/// <summary>
/// ID
/// </summary>
public uint ID;
/// <summary>
/// 모드 정보 인덱스
/// </summary>
public uint ModeInfoIndex;
/// <summary>
/// 출력 기술
/// </summary>
private DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY OutputTechnology;
/// <summary>
/// 회전
/// </summary>
private DISPLAYCONFIG_ROTATION Rotation;
/// <summary>
/// 축적
/// </summary>
private DISPLAYCONFIG_SCALING Scaling;
/// <summary>
/// 리프레쉬 비율
/// </summary>
private DISPLAYCONFIG_RATIONAL RefreshRate;
/// <summary>
/// 스캔 라인 순서
/// </summary>
private DISPLAYCONFIG_SCANLINE_ORDERING ScanLineOrdering;
/// <summary>
/// 타겟 이용 가능 여부
/// </summary>
public bool TargetAvailable;
/// <summary>
/// 상태 플래그
/// </summary>
public uint StatusFlag;
#endregion
}
#endregion
#region 디스플레이 구성 / 해석 - DISPLAYCONFIG_RATIONAL
/// <summary>
/// 디스플레이 구성 / 해석
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_RATIONAL
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// 분자
/// </summary>
public uint Numerator;
/// <summary>
/// 분모
/// </summary>
public uint Denominator;
#endregion
}
#endregion
#region 디스플레이 구성 / 경로 정보 - DISPLAYCONFIG_PATH_INFO
/// <summary>
/// 디스플레이 구성 / 경로 정보
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_PATH_INFO
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// 소스 정보
/// </summary>
public DISPLAYCONFIG_PATH_SOURCE_INFO SourceInfo;
/// <summary>
/// 타겟 정보
/// </summary>
public DISPLAYCONFIG_PATH_TARGET_INFO TargetInfo;
/// <summary>
/// 플래그
/// </summary>
public uint Flag;
#endregion
}
#endregion
#region 디스플레이 구성 / 2D 영역 - DISPLAYCONFIG_2DREGION
/// <summary>
/// 디스플레이 구성 / 2D 영역
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_2DREGION
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// X 카운트
/// </summary>
public uint CountX;
/// <summary>
/// Y 카운트
/// </summary>
public uint CountY;
#endregion
}
#endregion
#region 디스플레이 구성 / 비디오 신호 정보 - DISPLAYCONFIG_VIDEO_SIGNAL_INFO
/// <summary>
/// 디스플레이 구성 / 비디오 신호 정보
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_VIDEO_SIGNAL_INFO
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// 픽셀 비율
/// </summary>
public ulong PixelRate;
/// <summary>
/// 수평 동기화 주파수
/// </summary>
public DISPLAYCONFIG_RATIONAL HorizontalSynchronizationFrequqncy;
/// <summary>
/// 수직 동기화 주파수
/// </summary>
public DISPLAYCONFIG_RATIONAL VerticalSynchronizationFrequency;
/// <summary>
/// 활성 크기
/// </summary>
public DISPLAYCONFIG_2DREGION ActiveSize;
/// <summary>
/// 전체 크기
/// </summary>
public DISPLAYCONFIG_2DREGION TotalSize;
/// <summary>
/// 비디오 표준
/// </summary>
public uint VideoStandard;
/// <summary>
/// 스캔 라인 순서
/// </summary>
public DISPLAYCONFIG_SCANLINE_ORDERING ScanLineOrdering;
#endregion
}
#endregion
#region 디스플레이 구성 / 타겟 모드 - DISPLAYCONFIG_TARGET_MODE
/// <summary>
/// 디스플레이 구성 / 타겟 모드
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_TARGET_MODE
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// 타겟 비디오 신호 정보
/// </summary>
public DISPLAYCONFIG_VIDEO_SIGNAL_INFO TargetVideoSignalInfo;
#endregion
}
#endregion
#region 디스플레이 구성 / 소스 모드 - DISPLAYCONFIG_SOURCE_MODE
/// <summary>
/// 디스플레이 구성 / 소스 모드
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_SOURCE_MODE
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// 너비
/// </summary>
public uint Width;
/// <summary>
/// 높이
/// </summary>
public uint Height;
/// <summary>
/// 픽셀 포맷
/// </summary>
public DISPLAYCONFIG_PIXELFORMAT PixelFormat;
/// <summary>
/// 위치
/// </summary>
public POINT Position;
#endregion
}
#endregion
#region 디스플레이 구성 / 모드 정보 통합 - DISPLAYCONFIG_MODE_INFO_UNION
/// <summary>
/// 디스플레이 구성 / 모드 정보 통합
/// </summary>
[StructLayout(LayoutKind.Explicit)]
public struct DISPLAYCONFIG_MODE_INFO_UNION
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// 타겟 모드
/// </summary>
[FieldOffset(0)]
public DISPLAYCONFIG_TARGET_MODE TargetMode;
/// <summary>
/// 소스 모드
/// </summary>
[FieldOffset(0)]
public DISPLAYCONFIG_SOURCE_MODE SourceMode;
#endregion
}
#endregion
#region 디스플레이 구성 / 모드 정보 - DISPLAYCONFIG_MODE_INFO
/// <summary>
/// 디스플레이 구성 / 모드 정보
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_MODE_INFO
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// 정보 타입
/// </summary>
public DISPLAYCONFIG_MODE_INFO_TYPE InfoType;
/// <summary>
/// ID
/// </summary>
public uint ID;
/// <summary>
/// 어댑터 ID
/// </summary>
public LUID AdapterID;
/// <summary>
/// 모드 정보
/// </summary>
public DISPLAYCONFIG_MODE_INFO_UNION ModeInfo;
#endregion
}
#endregion
#region 디스플레이 구성 / 타겟 장치명 플래그 - DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAG
/// <summary>
/// 디스플레이 구성 / 타겟 장치명 플래그
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAG
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
/// <summary>
/// 값
/// </summary>
public uint Value;
}
#endregion
#region 디스플레이 구성 / 장치 정보 헤더 - DISPLAYCONFIG_DEVICE_INFO_HEADER
/// <summary>
/// 디스플레이 구성 / 장치 정보 헤더
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_DEVICE_INFO_HEADER
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// 타입
/// </summary>
public DISPLAYCONFIG_DEVICE_INFO_TYPE Type;
/// <summary>
/// 크기
/// </summary>
public uint Size;
/// <summary>
/// 어댑터 ID
/// </summary>
public LUID AdapterID;
/// <summary>
/// ID
/// </summary>
public uint ID;
#endregion
}
#endregion
#region 디스플레이 구성 / 타겟 장치명 - DISPLAYCONFIG_TARGET_DEVICE_NAME
/// <summary>
/// 디스플레이 구성 / 타겟 장치명
/// </summary>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DISPLAYCONFIG_TARGET_DEVICE_NAME
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// 헤더
/// </summary>
public DISPLAYCONFIG_DEVICE_INFO_HEADER Header;
/// <summary>
/// 플래그
/// </summary>
public DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAG Flag;
/// <summary>
/// 출력 기술
/// </summary>
public DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY OutputTechnology;
/// <summary>
/// EDID 제조자 ID
/// </summary>
public ushort EDIDManufactureID;
/// <summary>
/// EDID 제품 코드 ID
/// </summary>
public ushort EDIDProductCodeID;
/// <summary>
/// 연결자 인스턴스
/// </summary>
public uint ConnectorInstance;
/// <summary>
/// 모니터 친화적 장치명
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string MonitorFriendlyDeviceName;
/// <summary>
/// 모니터 장치 경로
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string MonitorDevicePath;
#endregion
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Import
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region 디스플레이 구성 / 버퍼 크기 구하기 - GetDisplayConfigBufferSizes(flag, pathInfoArrayElementCount, modeInfoArrayElementCount)
/// <summary>
/// 디스플레이 구성 / 버퍼 크기 구하기
/// </summary>
/// <param name="flag">플래그</param>
/// <param name="pathInfoArrayElementCount">경로 정보 배열 요소 카운트</param>
/// <param name="modeInfoArrayElementCount">모드 정보 배열 요소 카운트</param>
/// <returns>처리 결과</returns>
[DllImport("user32")]
private static extern int GetDisplayConfigBufferSizes
(
QUERY_DEVICE_CONFIG_FLAG flag,
out uint pathInfoArrayElementCount,
out uint modeInfoArrayElementCount
);
#endregion
#region 디스플레이 구성 질의하기 - QueryDisplayConfig(flag, pathInfoArrayElementCount, pathInfoArray, modeInfoArrayElementCount, modeInfoArray, currentTopologyID)
/// <summary>
/// 디스플레이 구성 질의하기
/// </summary>
/// <param name="flag">플래그</param>
/// <param name="pathInfoArrayElementCount">경로 배열 요소 카운트</param>
/// <param name="pathInfoArray">경로 정보 배열</param>
/// <param name="modeInfoArrayElementCount">모드 정보 배열 요소 카운트</param>
/// <param name="modeInfoArray">모드 정보 배열</param>
/// <param name="currentTopologyID">현재 토폴로지 ID</param>
/// <returns>처리 결과</returns>
[DllImport("user32")]
private static extern int QueryDisplayConfig
(
QUERY_DEVICE_CONFIG_FLAG flag,
ref uint pathInfoArrayElementCount,
[Out] DISPLAYCONFIG_PATH_INFO[] pathInfoArray,
ref uint modeInfoArrayElementCount,
[Out] DISPLAYCONFIG_MODE_INFO[] modeInfoArray,
IntPtr currentTopologyID
);
#endregion
#region 디스플레이 구성 / 장치 정보 구하기 - DisplayConfigGetDeviceInfo(deviceName)
/// <summary>
/// 디스플레이 구성 / 장치 정보 구하기
/// </summary>
/// <param name="deviceName">장치명</param>
/// <returns>처리 결과</returns>
[DllImport("user32")]
private static extern int DisplayConfigGetDeviceInfo(ref DISPLAYCONFIG_TARGET_DEVICE_NAME deviceName);
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// ERROR_SUCCESS
/// </summary>
public const int ERROR_SUCCESS = 0;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Public
#region 친화적 장치명 구하기 - GetFriendlyDeviceName(screen)
/// <summary>
/// 친화적 장치명 구하기
/// </summary>
/// <param name="screen">화면</param>
/// <returns>친화적 장치명</returns>
public static string GetFriendlyDeviceName(Screen screen)
{
IEnumerable<string> enumerable = GetAllMonitorFriendlyDeviceNameEnumerable();
for(int i = 0; i < Screen.AllScreens.Length; i++)
{
if(Equals(screen, Screen.AllScreens[i]))
{
return enumerable.ToArray()[i];
}
}
return null;
}
#endregion
//////////////////////////////////////////////////////////////////////////////// Private
#region 모니터 친화적 장치명 구하기 - GetMonitorFriendlyDeviceName(adapterID, targetID)
/// <summary>
/// 모니터 친화적 장치명 구하기
/// </summary>
/// <param name="adapterID">어댑터 ID</param>
/// <param name="targetID">타겟 ID</param>
/// <returns>모니터 친화적 장치명</returns>
private static string GetMonitorFriendlyDeviceName(LUID adapterID, uint targetID)
{
DISPLAYCONFIG_TARGET_DEVICE_NAME deviceName = new DISPLAYCONFIG_TARGET_DEVICE_NAME
{
Header =
{
Size = (uint)Marshal.SizeOf(typeof (DISPLAYCONFIG_TARGET_DEVICE_NAME)),
AdapterID = adapterID,
ID = targetID,
Type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME
}
};
int error = DisplayConfigGetDeviceInfo(ref deviceName);
if(error != ERROR_SUCCESS)
{
throw new Win32Exception(error);
}
return deviceName.MonitorFriendlyDeviceName;
}
#endregion
#region 모든 모니터 친화적 장치명 열거 가능형 구하기 - GetAllMonitorFriendlyDeviceNameEnumerable()
/// <summary>
/// 모든 모니터 친화적 장치명 열거 가능형 구하기
/// </summary>
/// <returns>모든 모니터 친화적 장치명 열거 가능형</returns>
private static IEnumerable<string> GetAllMonitorFriendlyDeviceNameEnumerable()
{
uint pathCount;
uint modeCount;
int error = GetDisplayConfigBufferSizes
(
QUERY_DEVICE_CONFIG_FLAG.QDC_ONLY_ACTIVE_PATHS,
out pathCount,
out modeCount
);
if(error != ERROR_SUCCESS)
{
throw new Win32Exception(error);
}
DISPLAYCONFIG_PATH_INFO[] pathInfoArray = new DISPLAYCONFIG_PATH_INFO[pathCount];
DISPLAYCONFIG_MODE_INFO[] modeInfoArray = new DISPLAYCONFIG_MODE_INFO[modeCount];
error = QueryDisplayConfig
(
QUERY_DEVICE_CONFIG_FLAG.QDC_ONLY_ACTIVE_PATHS,
ref pathCount,
pathInfoArray,
ref modeCount,
modeInfoArray,
IntPtr.Zero
);
if(error != ERROR_SUCCESS)
{
throw new Win32Exception(error);
}
for(int i = 0; i < modeCount; i++)
{
if(modeInfoArray[i].InfoType == DISPLAYCONFIG_MODE_INFO_TYPE.DISPLAYCONFIG_MODE_INFO_TYPE_TARGET)
{
yield return GetMonitorFriendlyDeviceName(modeInfoArray[i].AdapterID, modeInfoArray[i].ID);
}
}
}
#endregion
}
}
728x90
▶ Program.cs
using System;
using System.Windows.Forms;
namespace TestProject
{
/// <summary>
/// 프로그램
/// </summary>
class Program
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region 프로그램 시작하기 - Main()
/// <summary>
/// 프로그램 시작하기
/// </summary>
private static void Main()
{
foreach(Screen screen in Screen.AllScreens)
{
Console.WriteLine(MonitorHelper.GetFriendlyDeviceName(screen));
}
Console.ReadKey(false);
}
#endregion
}
}
728x90
그리드형(광고전용)
'C# > Common' 카테고리의 다른 글
[C#/COMMON] NetworkChange 클래스 : NetworkAvailabilityChanged 정적 이벤트를 사용해 네트워크 가용 여부 변경시 처리하기 (0) | 2021.01.22 |
---|---|
[C#/COMMON] MIME 타입 딕셔너리 구하기 (0) | 2021.01.21 |
[C#/COMMON] 다른 프로세스(윈도우)에 문자열 보내기 (0) | 2021.01.21 |
[C#/COMMON] Process 클래스 : 메모장 EDIT 윈도우 핸들 구하기 (0) | 2021.01.21 |
[C#/COMMON] 액티브 디렉토리 사용자 계정 여부 구하기 (0) | 2021.01.19 |
[C#/COMMON] 윈도우즈 서비스에서 현재 사용자 계정으로 프로세스 실행하기 (0) | 2021.01.18 |
[C#/COMMON] 실행 프로세스 여부 구하기 (0) | 2021.01.18 |
[C#/COMMON] 타블렛 사용 여부 및 정보 구하기 (0) | 2021.01.17 |
[C#/COMMON] 포터블 실행 파일(Portable Executable File) 만들기 (0) | 2021.01.14 |
[C#/COMMON] Process 클래스 : 프로세스 파일 경로 리스트 구하기 (0) | 2021.01.13 |