代码之家  ›  专栏  ›  技术社区  ›  Peter Tate

如何在.NET中确定监视器的实际像素大小?

  •  8
  • Peter Tate  · 技术社区  · 17 年前

    我想在我的应用程序中显示“真实大小”的图像。为此,我需要知道显示器的像素大小。

    我知道Windows的显示分辨率名义上是96dpi,但为了我的目的,我想做一个更好的猜测。我知道这些信息可能并不总是可用的或准确的(例如,旧的CRT显示器),但我认为,以LCD显示器的预见性来看,这应该是可能的!

    有没有办法得到我显示器的像素大小?

    有没有办法确定像素大小是否准确?

    .NET API是首选(我找不到它们),但Win32也可以,我很乐意P/Invoke。

    5 回复  |  直到 12 年前
        1
  •  27
  •   P Daddy    17 年前

    你想要的显示尺寸 Screen .PrimaryScreen.Bounds.Size (或) Screen.GetBounds(myform) )

    如果您需要DPI,请使用 DpiX DpiY 性质 Graphics :

    PointF dpi = PointF.Empty;
    using(Graphics g = this.CreateGraphics()){
        dpi.X = g.DpiX;
        dpi.Y = g.DpiY;
    }
    

    哦,等等!你想要实际的,拿着一把直尺到显示器前测量尺寸,尺寸?!不,不能使用 任何 操作系统服务。操作系统不知道显示器的实际尺寸,也不知道用户是如何校准的。其中一些信息在理论上是可以检测到的,但是对于操作系统来说,它还没有足够的确定性来可靠地使用它,所以它没有。

    作为一项工作,你可以尝试一些东西。

    • 您可以尝试查询已安装的监视器设备的显示字符串(我不确定如何执行此操作),并查看是否可以从中解析出一个合理的大小。例如,监视器可能是“valuebin e17p”,而您 可以 由此推断,它是一个17英寸的监视器。当然,这个显示字符串可能是“即插即用监视器”。这个计划充其量是相当粗略的。
    • 你可以 用户有多大尺寸的显示器。 也许吧 他们会知道的。

    一旦你知道(或 认为 你知道)显示器的对角线尺寸,你需要找到它的物理纵横比。同样,有两件事:

    • 假设当前像素纵横比与监视器的物理纵横比匹配。这假设(a)用户选择了适合其监视器的分辨率,并且(b)监视器具有方形像素。我不知道目前面向消费者的电脑显示器没有正方形像素,但老的显示器有,新的显示器可能有。
    • 询问用户。 也许吧 他们会知道的。

    一旦你知道(或 认为 你知道)监视器的对角线大小和物理纵横比是多少,然后你可以计算它的物理宽度和高度。一 +B = C 因此,通过一些计算,您可以得到:

    如果你发现它是一个17英寸的显示器,它的当前分辨率是1280 x 1024:
    一千二百八十 + 1024 = 2686976
    sqrt(2686976)=1639.1998047828092637409837247032
    17“*1280/1639.2=13.27476817959980472820888238165”
    17“*1024/1639.2=10.619814543679843826256710590532”

    这使得物理宽度为13.27“,物理高度为10.62”。这使得像素13.27英寸/1280=10.62英寸/1024=0.01037英寸或大约0.263毫米。

    当然,如果用户没有合适的分辨率,显示器有古怪的非方形像素,或者它是一个旧的模拟显示器,并且控件没有正确调整以使显示器充满整个物理屏幕,所有这些都是无效的。或者更糟的是,它可能是一个投影仪。

    最后,您最好在有用户的地方执行校准步骤。 把尺子举到屏幕上 然后为你量尺寸。你可以:

    • 让用户在距离为一英寸(或一厘米)的任何两点上单击鼠标。
    • 在屏幕上绘制一个框,让用户按上下箭头来调整其高度,按左箭头和右箭头来调整其宽度,直到框根据其标尺精确为一英寸(或厘米)的平方。
    • 在屏幕上画一个框,让用户告诉你每个尺寸有多少英寸/厘米。

    不管你做什么 不要期望你的结果100%准确。每次都有太多的因素在起作用,你(或用户)不可能完全正确。

    注意96 dpi通常 相当接近 准确地说。非投影屏幕上的现代像素通常都是0.25毫米左右,不管是给予还是接受,所以通常最终都是 关于 如果将显示器设置为其本机分辨率,则每英寸100个物理像素。(当然,这是一个巨大的概括 适用于所有监视器。例如,如果我能正确记住规格,EEE PC的像素大小大约为0.19毫米。)

        2
  •  1
  •   Stephen Wrighton    17 年前

    抱歉,您必须按P/Invoke获取此信息。

    这是我刚才使用的链接: http://www.davidthielen.info/programming/2007/05/get_screen_dpi_.html

        3
  •  1
  •   Pyrolistical    17 年前

    您可以通过从屏幕大小手动计算来进行检查。

    cos(45)*LCD_SCREEN_DIAGONAL_IN_INCHES/sqrt(HORZ_RES^2 + VERT_RES^2)
    

    这会给你以英寸为单位的像素宽度

        4
  •  1
  •   Rowland Shaw    17 年前

    GetDeviceCaps 可以P/Invoke'd得到一些数字,但我从未知道这些数字是值得信赖的…

        5
  •  0
  •   Breakskater    14 年前

    您可以使用注册表中存储的EDID信息获取显示器的物理尺寸。可以使用EnumDisplayDevices Windows API调用获取相应监视器的注册表项。

    Physical Dimensions to the Screen object :