using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
/// <summary>
/// 这个可以
/// </summary>
class Program
{
static void Main()
{
//设置DPI感知
try
{
SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE);
}
catch
{
// 旧版Windows回退方案
try
{
SetProcessDPIAware();
}
catch { }
}
try
{
// 获取所有显示器信息
var monitors = GetAllMonitors();
if (monitors.Count == 0)
{
Console.WriteLine("未检测到显示器");
return;
}
// 创建或覆盖本地txt文件
string filePath = @"C:\DisplayInfo.txt";
using (StreamWriter writer = new StreamWriter(filePath))
{
writer.WriteLine("显示器信息报告");
writer.WriteLine($"获取时间: {DateTime.Now:yyyy-MM-dd HH:mm:ss}");
writer.WriteLine($"检测到 {monitors.Count} 台显示器");
foreach (var monitor in monitors)
{
writer.WriteLine($"显示器名称: {monitor.DeviceName} {(monitor.IsPrimary ? "(主显示器)" : "")}");
writer.WriteLine($"分辨率: {monitor.Width} × {monitor.Height}");
writer.WriteLine($"DPI缩放百分比: {monitor.DpiScalePercent:F0}%");
}
}
Console.WriteLine($"信息已写入文件:{filePath}");
Console.WriteLine("按任意键打开文件...");
Console.ReadKey();
Process.Start("notepad.exe", filePath);
}
catch (Exception ex)
{
Console.WriteLine($"发生错误:{ex.Message}");
}
}
//DPI感知声明
[DllImport("shcore.dll")]
private static extern int SetProcessDpiAwareness(int value);
private const int PROCESS_PER_MONITOR_DPI_AWARE = 2;
//显示器API声明
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct MONITORINFOEX
{
public int Size;
public RECT Monitor;
public RECT WorkArea;
public uint Flags;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string DeviceName;
}
[DllImport("user32.dll")]
private static extern IntPtr MonitorFromWindow(IntPtr hwnd, uint dwFlags);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern bool EnumDisplayMonitors(IntPtr hdc, IntPtr lprcClip,
MonitorEnumDelegate lpfnEnum, IntPtr dwData);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern bool GetMonitorInfo(IntPtr hMonitor, ref MONITORINFOEX lpmi);
[DllImport("shcore.dll")]
private static extern int GetDpiForMonitor(IntPtr hmonitor, int dpiType, out uint dpiX, out uint dpiY);
[DllImport("user32.dll")]
private static extern IntPtr GetDesktopWindow();
[DllImport("user32.dll")]
private static extern bool SetProcessDPIAware();
private delegate bool MonitorEnumDelegate(IntPtr hMonitor, IntPtr hdcMonitor, ref RECT lprcMonitor, IntPtr dwData);
// 常量定义
private const int MDT_EFFECTIVE_DPI = 0;
private const int MONITOR_DEFAULTTOPRIMARY = 1;
// 显示器信息类
public class DisplayInfo
{
public string DeviceName { get; set; }
public int Width { get; set; }
public int Height { get; set; }
public double DpiScalePercent { get; set; }
public bool IsPrimary { get; set; }
}
// 获取所有显示器信息的方法
private static List<DisplayInfo> GetAllMonitors()
{
var displayInfos = new List<DisplayInfo>();
MonitorEnumDelegate monitorDelegate = (IntPtr hMonitor, IntPtr hdcMonitor, ref RECT lprcMonitor, IntPtr dwData) =>
{
MONITORINFOEX mi = new MONITORINFOEX();
mi.Size = Marshal.SizeOf(mi);
if (GetMonitorInfo(hMonitor, ref mi))
{
uint dpiX = 96, dpiY = 96;
bool isPrimary = (mi.Flags & 0x1) != 0;
// 使用专用API获取DPI
if (GetDpiForMonitor(hMonitor, MDT_EFFECTIVE_DPI, out dpiX, out dpiY) != 0)
{
// API失败时使用主显示器DPI
IntPtr primaryMonitor = MonitorFromWindow(GetDesktopWindow(), MONITOR_DEFAULTTOPRIMARY);
GetDpiForMonitor(primaryMonitor, MDT_EFFECTIVE_DPI, out dpiX, out dpiY);
}
// 计算DPI百分比 (基于96 DPI为100%)
double dpiScalePercent = Math.Round((dpiX / 96.0) * 100, 0);
displayInfos.Add(new DisplayInfo
{
DeviceName = mi.DeviceName.Trim(),
Width = mi.Monitor.Right - mi.Monitor.Left,
Height = mi.Monitor.Bottom - mi.Monitor.Top,
DpiScalePercent = dpiScalePercent,
IsPrimary = isPrimary
});
}
return true;
};
EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, monitorDelegate, IntPtr.Zero);
return displayInfos;
}
}
新建控制台应用程序执行即可
如下,一台显示器:
多台显示器信息