c# 获取电脑 分辨率 及 DPI 设置

复制代码
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;
    }
}

新建控制台应用程序执行即可

如下,一台显示器:

多台显示器信息

相关推荐
江沉晚呤时16 分钟前
在 C# 中调用 Python 脚本:实现跨语言功能集成
python·microsoft·c#·.net·.netcore·.net core
Oberon39 分钟前
Avalonia硬配.NET Framework 4.8
c#·.net·avalonia·.net framework
tomorrow.hello1 小时前
Java并发测试工具
java·开发语言·测试工具
晓13132 小时前
JavaScript加强篇——第四章 日期对象与DOM节点(基础)
开发语言·前端·javascript
老胖闲聊2 小时前
Python I/O 库【输入输出】全面详解
开发语言·python
她说人狗殊途3 小时前
java.net.InetAddress
java·开发语言
天使day3 小时前
Cursor的使用
java·开发语言·ai
喵叔哟3 小时前
3. 【Blazor全栈开发实战指南】--Blazor是什么?为什么选择Blazor?
c#·.netcore
Dxy12393102163 小时前
Python ExcelWriter详解:从基础到高级的完整指南
开发语言·python
源代码•宸5 小时前
C++高频知识点(十三)
开发语言·c++·经验分享·面经