Windows显示设置为150%时仍显示96 DPI

问题描述 投票:9回答:2

在运行Win7的笔记本电脑上,当我将显示设置设为125%时,DPI显示为120(同时使用graphics.DpiX和GetDeviceCaps)。但是,显示为150%时,DPI为96(?!),就像显示为100%一样。有谁知道a)为什么会这样,b)除了检查DPI来检测显示是否设置为100%以外的其他任何方法?我正在编写一个要在显示设置为> = 150%时显示消息的应用程序。

谢谢。

windows dpi
2个回答
11
投票

在Windows Vista和Windows 7上,DPI高于120(我认为),并且它认为不具备DPI意识的应用程序,它们会切换到DPI虚拟化模式。

这完全符合您所看到的-应用程序认为它以96dpi运行,而Windows将其炸毁并呈现出更大的内容(并且更加模糊)。

更多详细信息:https://docs.microsoft.com/en-gb/windows/win32/hidpi

(原始链接(现在重定向到上面):http://msdn.microsoft.com/en-us/library/dd464660(VS.85).aspx#dpi_virtualization

本文介绍了如何针对每个应用程序禁用它。


8
投票

我刚刚遇到了同样的问题,尽管StackOverflow上有很多与DPI相关的问题,但我并没有在一个地方找到所有答案。

对[[问题a)的答案是一个简单的答案:从Windows Vista开始,Windows支持两种与DPI相关的调整大小。如果单击“显示设置”上的“设置自定义文本大小(DPI)”,则可以看到默认情况下,有125%的用户使用与Windows XP兼容的调整大小,而150%的用户没有使用。<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9oMlFrMS5wbmcifQ==” alt =“自定义DPI设置”>

问题b)

是一个比较棘手的问题。如果搜索StackOverflow,通常可以找到以下答案: using (Graphics screen = Graphics.FromHwnd(IntPtr.Zero)) { IntPtr hdc = screen.GetHdc(); int dpiX = GetDeviceCaps(hdc, DeviceCaps.LOGPIXELSX); screen.ReleaseHdc(hdc); }
但是,无论实际的DPI设置如何,它将始终返回96,除非...-使用Windows XP或在DPI设置中签入了兼容模式。 

问题

:您不能在用户处强制执行。-DWM已关闭(您使用基本或经典主题)。 问题:同上。-使用GetDeviceCaps之前,请调用SetProcessDPIAware函数。 问题:应在所有其他渲染之前调用一次此函数。如果您已有不支持DPI的应用程序,则更改感知状态将破坏整个外观。调用函数后无法将其关闭。-在使用GetDeviceCaps之前和之后调用SetProcessDpiAwareness问题:此功能至少需要Windows 8.1
实际的解决方案

[C0似乎没有在MSDN中完整记录。至少我发现GetDeviceCaps function提到了该函数可以获得的其他一些选项。最后,我提出了以下解决方案:

pinvoke.net

以及所需的附加代码:

public static int GetSystemDpi() { using (Graphics screen = Graphics.FromHwnd(IntPtr.Zero)) { IntPtr hdc = screen.GetHdc(); int virtualWidth = GetDeviceCaps(hdc, DeviceCaps.HORZRES); int physicalWidth = GetDeviceCaps(hdc, DeviceCaps.DESKTOPHORZRES); screen.ReleaseHdc(hdc); return (int)(96f * physicalWidth / virtualWidth); } }

© www.soinside.com 2019 - 2024. All rights reserved.