当前位置: 首页 > ops >正文

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获取DPIif (GetDpiForMonitor(hMonitor, MDT_EFFECTIVE_DPI, out dpiX, out dpiY) != 0){// API失败时使用主显示器DPIIntPtr 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;}
}

新建控制台应用程序执行即可
如下,一台显示器:


多台显示器信息

http://www.xdnf.cn/news/9901.html

相关文章:

  • Root权限:解锁Android的终极力量
  • WSL里执行python深度学习的一些方法记录
  • 如何优化Hive的查询性能?请详细说明查询优化的各个层面(SQL优化、配置优化、资源优化等)和具体方法。
  • onlyoffice docspace 协作空间企业版使用秘籍-1.如何连接外部存储
  • 数据结构之队列:原理与应用
  • 下载即转化的商业密码:解析华为应用商店CPD广告的智能投放逻辑
  • 近期知识库开发过程中遇到的一些问题
  • Spring MVC 框架
  • BERT***
  • Linux多线程(六)之线程控制4【线程ID及进程地址空间布局】
  • 记录一次apisix上cros配置跨域失败的问题
  • 如何使用windows下的vscode连接到本地虚拟机的linux
  • 浏览器指纹科普 | Canvas 指纹是什么?
  • 4.2.2 Spark SQL 默认数据源
  • React从基础入门到高级实战:React 高级主题 - React Concurrent 特性:深入探索与实践指南
  • Sublime Text 4格式化JSON无效的解决方法
  • 换宽带ip地址会变吗?同一个宽带如何切换ip地址
  • 7.3 Organizing data into training batches
  • 易路 iBuilder:解构企业 AI 落地困境,重构智能体时代生产力范式
  • 顶刊SCS | 基于视觉语言大模型推理分割的建筑足迹尺度功能分类, 样本数据和代码已开源!
  • QNAP MEMOS 域名访问 SSL(Lucky)
  • 广州邮科高频开关电源:以创新科技赋能通信能源绿色未来
  • 工控机安装lubuntu系统
  • Med-R1论文阅读理解-1
  • 我的3种AI写作节奏搭配模型,适合不同类型写作者
  • 企业级Spring MVC高级主题与实用技术讲解
  • 互联网大厂Java求职面试:云原生微服务架构设计与AI大模型集成实战
  • 页面输入数据的表格字段(如 Web 表单或表格控件)与后台数据库进行交互时常用的两种方式
  • 第十三篇:MySQL 运维自动化与可观测性建设实践指南
  • 一句话开发Chrome摸鱼插件