有没有一种方法可以确定显示器的物理尺寸?

8

以英寸为单位,例如21英寸的显示器。该应用程序是一个标准的WinForms应用程序。

编辑:看起来没有可靠的方法可以完成我需要的功能。


1
标题忘了提到OP想要显示器图像的物理尺寸(以英寸为单位),而不是桌面分辨率的平方像素。 - Andreas Rejbrand
我可以很容易地给你像素大小,但那就是全部了... - Evan Plaice
4
如果你在使用投影仪,屏幕的大小将取决于投影仪和观看屏幕之间的距离。那么你该如何确定这个距离呢? - Andreas Rejbrand
1
@Donal Fellows:不,这是完全不同的问题。这是关于显示器的物理尺寸... - Andreas Rejbrand
有没有调用可以获取屏幕分辨率的DPI? - David R Tribble
显示剩余5条评论
5个回答

5

这是无法保证的。除非驱动程序对显示器进行查询并将答复报告给Windows,否则Windows无法知道显示器的大小。

不过,您可以尝试

SystemInformation.PrimaryMonitorSize

或者 GetDeviceCaps(dc, HORZSIZE)GetDeviceCaps(dc, VERTSIZE),然后计算斜边上的平方。

请注意,这里在 Stack Overflow 上也有一个相同问题的 接受答案


2

网页应用或桌面应用?关于网页应用的所有信息,你只能通过使用Javascript获取浏览器的屏幕分辨率。

<script language="javascript">

var width = screen.width;
var height = screen.height;

if( width < 1280 || height < 1024)
{
    alert("This web page is best viewed with a screen resolution of 1280 by 1024 or higher.  Your current resolution is " + width + " by " + height + ".  If possible please change your resolution.");
}
else
{
    alert("Your screen resolution is pretty big!")
}
</script>

对于桌面应用程序,您需要执行以下操作:

MessageBox.Show( "Monitor Size:" +
   SystemInformation.PrimaryMonitorSize );

2

我考虑了两种在特殊条件下可能有效的方法:

  • 尝试获取显示器硬件名称。在我的双显示器系统中,我使用一个SyncMaster 205BW和一个SyncMaster 173T。这些分别是20英寸和17英寸的显示器。你明白我的意思吗?然而,有一个问题,我不确定你是否可以通过编程方式获取这些字符串。Windows似乎只能获取SyncMaster:screenres.png

  • 您可以使用GetDeviceCaps(GetDC(GetDesktopWindow), VERTSIZE)来获取“物理屏幕高度(以毫米为单位)”,并类似地使用HORZSIZE和“宽度”。但我认为,这仅适用于您已经校准了显示器。至少在我的系统上,这些值比实际高度和宽度大得多...

  • 我不知道您的上下文是什么,但如果您的应用程序确实需要最终用户输出设备的物理大小,为什么不询问他呢?您可以在设置期间轻松询问显示器的尺寸(例如使用优秀的Inno Setup),并将该值存储在注册表中。然后,编写一个简单的过程GetPhysicalMonitorSize,它只需从注册表中读取该值即可。


2

您可以使用注册表中的EDID来获取物理屏幕大小。显示器的驱动程序将物理屏幕大小报告给Windows。


1
如果没有.NET特定的方法,你总是可以使用本地的Windows API:GetSystemMetricsSM_CYSCREENSM_CXSCREEN

GetSystemMetrics只能获取分辨率等信息。我需要获取显示器的尺寸(例如21英寸显示器)。 - AngryHacker
6
那确实更加困难,难度等级可以说是不可能完成。 - Stephen P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接