如何在.NET中确定我的Monitor的真实像素大小?

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

我知道窗口显示分辨率名义上是96dpi,但为了我的目的,我想要一个更好的猜测。 我知道这些信息可能并不总是可用或准确的(例如较旧的CRT显示器),但是我想用液晶显示器的前景来想象这应该是可能的!

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

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

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

Solutions Collecting From Web of "如何在.NET中确定我的Monitor的真实像素大小?"

对于显示大小,您需要Screen Screen.GetBounds(myform)Screen.GetBounds(myform) )。

如果您需要DPI,请使用Graphics的DpiX和DpiY属性:

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

等一下! 你想要实际的,拿着一个统治者的显示器和措施,大小?! 不可以。使用任何 OS服务都不可能。 操作系统不知道显示器的实际尺寸,或者用户如何校准。 这些信息中的一部分在理论上是可以检测到的,但是对于操作系统来说它是不可靠的,所以不能。

作为一个解决办法,你可以尝试一些事情。

  • 你可以尝试查询已安装的监视器设备的显示字符串(我不知道该怎么做),看看你能否解析出一个合理的大小。 例如,显示器可能是一个“ValueBin E17p”,你可能会推断出它是一个17“的显示器,当然,这个显示字符串可能是”即插即用显示器“。 。
  • 你可以用户他们有多大的显示器。 也许他们会知道。

一旦你知道(或者认为你知道)显示器的对角线尺寸,你需要找到它的物理纵横比。 再次,几件事情:

  • 假设当前的像素宽高比与显示器的物理宽高比相匹配。 这假设(A)用户选择了对于他们的显示器是理想的分辨率,并且(B)显示器具有正方形像素。 我不知道目前消费者导向的电脑显示器没有正方形的像素,但是老的和新的可能。
  • 询问用户。 也许他们会知道。

一旦你知道(或者认为你知道)显示器的对角线尺寸和物理宽高比,那么你可以计算出它的物理宽度和高度。 A 2 + B 2 = C 2 ,所以一些计算会给你带来好处:

如果你发现它是一个17“的显示器,它的当前分辨率是1280×1024:
1280 2 + 1024 2 = 2686976
Sqrt(2686976)= 1639.1998047828092637409837247032
17“* 1280 / 1639.2 = 13.274768179599804782820888238165”
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毫米。)

对不起,您必须对此信息进行P / Invoke。

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

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

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

这会给你的像素宽度英寸

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

您可以使用存储在注册表中的EDID信息获取显示器的物理尺寸。 您可以使用EnumDisplayDevices窗口API调用获取适当的监视器的注册表项。

物理尺寸到屏幕对象 :