You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# .NET控制台程序获取屏幕尺寸出现异常问题求助

解决C#控制台程序获取屏幕尺寸为实际一半的问题

嘿,我之前在做控制台程序的时候也碰到过完全一样的问题!这种情况十有八九是高DPI缩放搞的鬼——现在很多高分屏(比如4K屏幕)都会设置200%的系统缩放,而控制台程序默认不支持高DPI感知,导致系统自动把获取到的屏幕尺寸按缩放比例“缩小”返回给你,所以才会拿到实际高度的一半。

下面给你两个靠谱的解决办法:

方法一:通过应用程序清单(Manifest)开启高DPI感知

这是最推荐的持久化方案,步骤如下:

  1. 在你的控制台项目里添加一个app.manifest文件(右键项目→添加→新建项→搜索“应用程序清单文件”)
  2. 打开这个文件,找到<application xmlns="urn:schemas-microsoft-com:asm.v3">节点,把里面的内容替换成下面这段:
<application xmlns="urn:schemas-microsoft-com:asm.v3">
  <windowsSettings>
    <!-- 启用Per-Monitor DPI感知,支持多显示器不同缩放比例 -->
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/PM</dpiAware>
    <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor</dpiAwareness>
  </windowsSettings>
</application>
  1. 保存后重新编译项目,再运行就能拿到真实的屏幕尺寸了。

方法二:在代码中动态设置高DPI感知

如果不想修改manifest,也可以在程序启动时调用Windows API来开启感知,代码示例如下:

using System;
using System.Runtime.InteropServices;
// 别忘了添加这两个引用:PresentationFramework和System.Windows.Forms
using System.Windows;
using System.Windows.Forms;

class Program
{
    // 导入Windows API函数
    [DllImport("user32.dll", SetLastError = true)]
    private static extern bool SetProcessDpiAwarenessContext(int dpiFlag);

    // 定义Per-Monitor V2感知的标识
    private const int DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 = -4;

    static void Main(string[] args)
    {
        // 先设置高DPI感知
        SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);

        // 现在再获取屏幕尺寸
        var wpfScreenHeight = SystemParameters.PrimaryScreenHeight;
        var formsScreenHeight = Screen.PrimaryScreen.Bounds.Height;

        Console.WriteLine($"WPF获取的屏幕高度:{wpfScreenHeight}");
        Console.WriteLine($"WinForms获取的屏幕高度:{formsScreenHeight}");
    }
}

注意:如果你的项目里没有PresentationFramework和System.Windows.Forms这两个引用,需要右键项目→添加→引用,在“程序集”里找到它们并勾选。

补充说明

为什么会出现这个问题?因为控制台程序默认是DPI Unaware状态,系统会对这类程序做“兼容性缩放”——不仅会放大程序窗口,还会把程序获取的屏幕尺寸按缩放比例反向缩小。比如你系统设了200%缩放,实际屏幕高度是2160,程序拿到的就会是1080,正好是一半。开启高DPI感知后,程序就能绕过这个缩放,直接获取到真实的像素尺寸了。

内容的提问来源于stack exchange,提问作者James Kerfoot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:44:27