GetDeviceCaps 函数获取屏幕物理宽度(毫米)不准,求解决。

kasumi_kxq 2014-10-29 03:44:59
public static double MillimetersToPixels(double length)
{
System.Windows.Forms.Control ctrl = new System.Windows.Forms.Control();
System.Drawing.Graphics g = System.Drawing.Graphics.FromHwnd(ctrl.Handle);
IntPtr hdc = g.GetHdc();
int width = GetDeviceCaps(hdc, 4);//屏幕物理宽度 毫米
int pixels = GetDeviceCaps(hdc, 8);//屏幕水平分辨率 像素
g.ReleaseHdc(hdc);
return (((double)pixels / (double)width) * (double)length);
}

这是我从网上看到的一段获取当前屏幕(pixel / 毫米)的代码,这样可以通过传进来的毫米获得当前屏幕对应多少像素。

但是我现在遇到的问题是 int width = GetDeviceCaps(hdc, 4) 这里获得的屏幕物理宽度(毫米)在Windows8系统下是准的,但是在Windows7下就明显不准。

哪位告知这是为什么(试验了好几台电脑,windows8下都是正确的,windows7全部不正确)?或者有什么其他办法获得屏幕物理宽度(毫米)
...全文
979 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
比尔咔咔 2014-10-30
  • 打赏
  • 举报
回复
屏幕宽度与屏幕像素 无法对应的 24寸的屏幕 可能是1680×1050 也可能是 1920×1200 这可以手动调整的 So你想用屏幕宽度来知道屏幕像素本身就是个错误的想法。 另Windows API 可以直接知道当前屏幕的分辨率 :)
winnowc 2014-10-30
  • 打赏
  • 举报
回复
准确值可以从EDID取,能找到的最好的解决方案是http://ofekshilon.com/2014/06/19/reading-specific-monitor-dimensions/ 我这有个次优的版本(没用SetupAPI,而是直接读注册表),放在https://code.csdn.net/snippets/501503,用法如下:

int width, height;
if (MonitorInfo.GetPhysicalSize(@"\\.\DISPLAY1", out width, out height))
    Console.WriteLine("{0}, {1}", width, height);
返回的也是毫米。不过这种方式不确保始终有值,如果显示器不支持,或者注册表中的EDID值由于某种原因不存在,那就取不到。
泡泡龙 2014-10-29
  • 打赏
  • 举报
回复
http://blog.sina.com.cn/s/blog_638dd78201018663.html 注意dpi设置
kasumi_kxq 2014-10-29
  • 打赏
  • 举报
回复
刚刚又在几台机器上试了下发现 XP 也没有问题,就只有 WIndows7 有问题,现在总共实验了2台XP,5台windos8,3台Windows7,现在只有Windows7下有问题,XP和Windows8均没有问题,太诡异了。

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧