-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Show monitor name instead instead of "Screen 1"
- Loading branch information
1 parent
873b8d9
commit ce3fda4
Showing
7 changed files
with
351 additions
and
31 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,6 @@ | ||
<?xml version="1.0" encoding="utf-8" ?> | ||
<?xml version="1.0" encoding="utf-8"?> | ||
<configuration> | ||
<startup> | ||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> | ||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/> | ||
</startup> | ||
</configuration> | ||
</configuration> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,316 @@ | ||
// Found this code on https://itecnote.com/tecnote/c-how-to-get-the-actual-monitor-name-as-seen-in-the-resolution-dialog/ | ||
using System; | ||
using System.Collections.Generic; | ||
using System.ComponentModel; | ||
using System.Linq; | ||
using System.Runtime.InteropServices; | ||
using System.Text; | ||
using System.Threading.Tasks; | ||
using System.Windows.Forms; | ||
|
||
namespace ScreenTemperature.Helpers | ||
{ | ||
public static class ScreenInterrogatory | ||
{ | ||
public const int ERROR_SUCCESS = 0; | ||
|
||
#region enums | ||
|
||
public enum QUERY_DEVICE_CONFIG_FLAGS : uint | ||
{ | ||
QDC_ALL_PATHS = 0x00000001, | ||
QDC_ONLY_ACTIVE_PATHS = 0x00000002, | ||
QDC_DATABASE_CURRENT = 0x00000004 | ||
} | ||
|
||
public enum DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY : uint | ||
{ | ||
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER = 0xFFFFFFFF, | ||
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_INTERNAL = 0x80000000, | ||
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_FORCE_UINT32 = 0xFFFFFFFF | ||
} | ||
|
||
public enum DISPLAYCONFIG_SCANLINE_ORDERING : uint | ||
{ | ||
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, | ||
DISPLAYCONFIG_SCANLINE_ORDERING_FORCE_UINT32 = 0xFFFFFFFF | ||
} | ||
|
||
public enum DISPLAYCONFIG_ROTATION : uint | ||
{ | ||
DISPLAYCONFIG_ROTATION_IDENTITY = 1, | ||
DISPLAYCONFIG_ROTATION_ROTATE90 = 2, | ||
DISPLAYCONFIG_ROTATION_ROTATE180 = 3, | ||
DISPLAYCONFIG_ROTATION_ROTATE270 = 4, | ||
DISPLAYCONFIG_ROTATION_FORCE_UINT32 = 0xFFFFFFFF | ||
} | ||
|
||
public enum DISPLAYCONFIG_SCALING : uint | ||
{ | ||
DISPLAYCONFIG_SCALING_IDENTITY = 1, | ||
DISPLAYCONFIG_SCALING_CENTERED = 2, | ||
DISPLAYCONFIG_SCALING_STRETCHED = 3, | ||
DISPLAYCONFIG_SCALING_ASPECTRATIOCENTEREDMAX = 4, | ||
DISPLAYCONFIG_SCALING_CUSTOM = 5, | ||
DISPLAYCONFIG_SCALING_PREFERRED = 128, | ||
DISPLAYCONFIG_SCALING_FORCE_UINT32 = 0xFFFFFFFF | ||
} | ||
|
||
public enum DISPLAYCONFIG_PIXELFORMAT : uint | ||
{ | ||
DISPLAYCONFIG_PIXELFORMAT_8BPP = 1, | ||
DISPLAYCONFIG_PIXELFORMAT_16BPP = 2, | ||
DISPLAYCONFIG_PIXELFORMAT_24BPP = 3, | ||
DISPLAYCONFIG_PIXELFORMAT_32BPP = 4, | ||
DISPLAYCONFIG_PIXELFORMAT_NONGDI = 5, | ||
DISPLAYCONFIG_PIXELFORMAT_FORCE_UINT32 = 0xffffffff | ||
} | ||
|
||
public enum DISPLAYCONFIG_MODE_INFO_TYPE : uint | ||
{ | ||
DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE = 1, | ||
DISPLAYCONFIG_MODE_INFO_TYPE_TARGET = 2, | ||
DISPLAYCONFIG_MODE_INFO_TYPE_FORCE_UINT32 = 0xFFFFFFFF | ||
} | ||
|
||
public enum DISPLAYCONFIG_DEVICE_INFO_TYPE : uint | ||
{ | ||
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_FORCE_UINT32 = 0xFFFFFFFF | ||
} | ||
|
||
#endregion | ||
|
||
#region structs | ||
|
||
[StructLayout(LayoutKind.Sequential)] | ||
public struct LUID | ||
{ | ||
public uint LowPart; | ||
public int HighPart; | ||
} | ||
|
||
[StructLayout(LayoutKind.Sequential)] | ||
public struct DISPLAYCONFIG_PATH_SOURCE_INFO | ||
{ | ||
public LUID adapterId; | ||
public uint id; | ||
public uint modeInfoIdx; | ||
public uint statusFlags; | ||
} | ||
|
||
[StructLayout(LayoutKind.Sequential)] | ||
public struct DISPLAYCONFIG_PATH_TARGET_INFO | ||
{ | ||
public LUID adapterId; | ||
public uint id; | ||
public uint modeInfoIdx; | ||
private DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology; | ||
private DISPLAYCONFIG_ROTATION rotation; | ||
private DISPLAYCONFIG_SCALING scaling; | ||
private DISPLAYCONFIG_RATIONAL refreshRate; | ||
private DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering; | ||
public bool targetAvailable; | ||
public uint statusFlags; | ||
} | ||
|
||
[StructLayout(LayoutKind.Sequential)] | ||
public struct DISPLAYCONFIG_RATIONAL | ||
{ | ||
public uint Numerator; | ||
public uint Denominator; | ||
} | ||
|
||
[StructLayout(LayoutKind.Sequential)] | ||
public struct DISPLAYCONFIG_PATH_INFO | ||
{ | ||
public DISPLAYCONFIG_PATH_SOURCE_INFO sourceInfo; | ||
public DISPLAYCONFIG_PATH_TARGET_INFO targetInfo; | ||
public uint flags; | ||
} | ||
|
||
[StructLayout(LayoutKind.Sequential)] | ||
public struct DISPLAYCONFIG_2DREGION | ||
{ | ||
public uint cx; | ||
public uint cy; | ||
} | ||
|
||
[StructLayout(LayoutKind.Sequential)] | ||
public struct DISPLAYCONFIG_VIDEO_SIGNAL_INFO | ||
{ | ||
public ulong pixelRate; | ||
public DISPLAYCONFIG_RATIONAL hSyncFreq; | ||
public DISPLAYCONFIG_RATIONAL vSyncFreq; | ||
public DISPLAYCONFIG_2DREGION activeSize; | ||
public DISPLAYCONFIG_2DREGION totalSize; | ||
public uint videoStandard; | ||
public DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering; | ||
} | ||
|
||
[StructLayout(LayoutKind.Sequential)] | ||
public struct DISPLAYCONFIG_TARGET_MODE | ||
{ | ||
public DISPLAYCONFIG_VIDEO_SIGNAL_INFO targetVideoSignalInfo; | ||
} | ||
|
||
[StructLayout(LayoutKind.Sequential)] | ||
public struct POINTL | ||
{ | ||
private int x; | ||
private int y; | ||
} | ||
|
||
[StructLayout(LayoutKind.Sequential)] | ||
public struct DISPLAYCONFIG_SOURCE_MODE | ||
{ | ||
public uint width; | ||
public uint height; | ||
public DISPLAYCONFIG_PIXELFORMAT pixelFormat; | ||
public POINTL position; | ||
} | ||
|
||
[StructLayout(LayoutKind.Explicit)] | ||
public struct DISPLAYCONFIG_MODE_INFO_UNION | ||
{ | ||
[FieldOffset(0)] | ||
public DISPLAYCONFIG_TARGET_MODE targetMode; | ||
|
||
[FieldOffset(0)] | ||
public DISPLAYCONFIG_SOURCE_MODE sourceMode; | ||
} | ||
|
||
[StructLayout(LayoutKind.Sequential)] | ||
public struct DISPLAYCONFIG_MODE_INFO | ||
{ | ||
public DISPLAYCONFIG_MODE_INFO_TYPE infoType; | ||
public uint id; | ||
public LUID adapterId; | ||
public DISPLAYCONFIG_MODE_INFO_UNION modeInfo; | ||
} | ||
|
||
[StructLayout(LayoutKind.Sequential)] | ||
public struct DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS | ||
{ | ||
public uint value; | ||
} | ||
|
||
[StructLayout(LayoutKind.Sequential)] | ||
public struct DISPLAYCONFIG_DEVICE_INFO_HEADER | ||
{ | ||
public DISPLAYCONFIG_DEVICE_INFO_TYPE type; | ||
public uint size; | ||
public LUID adapterId; | ||
public uint id; | ||
} | ||
|
||
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] | ||
public struct DISPLAYCONFIG_TARGET_DEVICE_NAME | ||
{ | ||
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; | ||
|
||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)] | ||
public string monitorFriendlyDeviceName; | ||
|
||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] | ||
public string monitorDevicePath; | ||
} | ||
|
||
#endregion | ||
|
||
#region DLL-Imports | ||
|
||
[DllImport("user32.dll")] | ||
public static extern int GetDisplayConfigBufferSizes( | ||
QUERY_DEVICE_CONFIG_FLAGS flags, out uint numPathArrayElements, out uint numModeInfoArrayElements); | ||
|
||
[DllImport("user32.dll")] | ||
public static extern int QueryDisplayConfig( | ||
QUERY_DEVICE_CONFIG_FLAGS flags, | ||
ref uint numPathArrayElements, [Out] DISPLAYCONFIG_PATH_INFO[] PathInfoArray, | ||
ref uint numModeInfoArrayElements, [Out] DISPLAYCONFIG_MODE_INFO[] ModeInfoArray, | ||
IntPtr currentTopologyId | ||
); | ||
|
||
[DllImport("user32.dll")] | ||
public static extern int DisplayConfigGetDeviceInfo(ref DISPLAYCONFIG_TARGET_DEVICE_NAME deviceName); | ||
|
||
#endregion | ||
|
||
private static string MonitorFriendlyName(LUID adapterId, uint targetId) | ||
{ | ||
var 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 | ||
} | ||
}; | ||
var error = DisplayConfigGetDeviceInfo(ref deviceName); | ||
if (error != ERROR_SUCCESS) | ||
throw new Win32Exception(error); | ||
return deviceName.monitorFriendlyDeviceName; | ||
} | ||
|
||
private static IEnumerable<string> GetAllMonitorsFriendlyNames() | ||
{ | ||
uint pathCount, modeCount; | ||
var error = GetDisplayConfigBufferSizes(QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS, out pathCount, out modeCount); | ||
if (error != ERROR_SUCCESS) | ||
throw new Win32Exception(error); | ||
|
||
var displayPaths = new DISPLAYCONFIG_PATH_INFO[pathCount]; | ||
var displayModes = new DISPLAYCONFIG_MODE_INFO[modeCount]; | ||
error = QueryDisplayConfig(QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS, | ||
ref pathCount, displayPaths, ref modeCount, displayModes, IntPtr.Zero); | ||
if (error != ERROR_SUCCESS) | ||
throw new Win32Exception(error); | ||
|
||
for (var i = 0; i < modeCount; i++) | ||
if (displayModes[i].infoType == DISPLAYCONFIG_MODE_INFO_TYPE.DISPLAYCONFIG_MODE_INFO_TYPE_TARGET) | ||
yield return MonitorFriendlyName(displayModes[i].adapterId, displayModes[i].id); | ||
} | ||
|
||
public static string DeviceFriendlyName(this Screen screen) | ||
{ | ||
var allFriendlyNames = GetAllMonitorsFriendlyNames(); | ||
for (var index = 0; index < Screen.AllScreens.Length; index++) | ||
if (Equals(screen, Screen.AllScreens[index])) | ||
return allFriendlyNames.ToArray()[index]; | ||
return null; | ||
} | ||
|
||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Oops, something went wrong.