如何获取 WPF 中的 DPI?
如何获取 WPF 中的 DPI?
How can I get the DPI in WPF?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
如何获取 WPF 中的 DPI?
How can I get the DPI in WPF?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(11)
https://learn.microsoft .com/en-us/archive/blogs/jaimer/getting-system-dpi-in-wpf-app 似乎有效
https://learn.microsoft.com/en-us/archive/blogs/jaimer/getting-system-dpi-in-wpf-app seems to work
使用 .NET 4.6.2 Preview 及更高版本,您可以调用
VisualTreeHelper.GetDpi(视觉视觉)
。它返回DpiScale< /code>
结构,它告诉您将呈现或已经呈现给定
Visual
的 DPI。With .NET 4.6.2 Preview and higher, you can call
VisualTreeHelper.GetDpi(Visual visual)
. It returns aDpiScale
structure, which tells you the DPI at which the givenVisual
will be or has been rendered.我已经更新了 2015 年的答案。以下是一些使用 Windows 10 中最新 DPI 功能的实用程序代码(特别是 GetDpiForWindow 函数,这是支持窗口/应用程序/进程等的 DPI_AWARENESS 的唯一方法),但回退到较旧的方法(每个显示器的 dpi,和桌面 dpi),因此它应该仍然适用于 Windows 7。
它不依赖于 WPF 或 Winforms,仅依赖于 Windows 本身。
I have updated my answer from 2015. Here is some utility code that uses the latest DPI functions from Windows 10 (specifically GetDpiForWindow function which is the only method that supports the DPI_AWARENESS of the window/application/process, etc.) but falls back to older ones (dpi per monitor, and desktop dpi) so it should still work with Windows 7.
It has not dependency on WPF nor Winforms, only on Windows itself.
我发现获得“真实”显示器 dpi 的唯一方法如下。所有其他提到的技术都只是说 96,这对于大多数显示器来说是不正确的。
The only way I found to get the "real" monitor dpi is the following. All other mentioned techniques just say 96 which is not correct for the most monitors.
这就是我如何在 WPF 中获得“比例因子”。
我的笔记本电脑的分辨率是 1920x1440。
This is how I managed to get a "scale factor" in WPF.
My laptop's resolution is 1920x1440.
使用 GetDeviceCaps 函数:
Use
GetDeviceCaps
function:您可以尝试使用 ManagementClass:
You can try using ManagementClass:
WPF 现在可以本机提供 DPI 信息。
您可以使用 VisualTreeHelper.GetDpi(Visual)。
有关桌面应用程序中 DPI 缩放的更多信息,请参阅 MSDN 中的这篇文章
高 DPI 桌面应用程序Windows 上的开发
WPF can now natively provide DPI information.
You can obtain DPI information of a certain visual using VisualTreeHelper.GetDpi(Visual).
For more information on DPI scaling in Desktop applications see this article from MSDN
High DPI Desktop Application Development on Windows
有
https:// /blogs.windows.com/buildingapps/2017/01/25/calling-windows-10-apis-desktop-application/#FJtMAIFjbtXiLQAp.97
2017 年 1 月 25 日下午 3:54
“从桌面应用程序”
和
https://learn.microsoft.com/en -us/uwp/api/windows.devices.display.displaymonitor
“显示监视器类”
命名空间:Windows.Devices.Display Assemblies:Windows.Devices.Display.dll、Windows.dll
提供有关显示监视器设备的信息连接到系统。
这些数据包括来自显示器扩展显示识别数据(EDID,这是一种行业标准显示描述符块,几乎所有显示器都使用它来提供支持的模式和一般设备信息的描述)和 DisplayID(这是一种较新的行业标准)的常用信息。提供 EDID 的超集)。
原始 DpiX
获取显示器的物理水平 DPI(基于显示器的本机分辨率和物理尺寸)。
原始 DpiY
获取显示器的物理垂直 DPI(基于显示器的本机分辨率和物理尺寸)。
There are
https://blogs.windows.com/buildingapps/2017/01/25/calling-windows-10-apis-desktop-application/#FJtMAIFjbtXiLQAp.97
January 25, 2017 3:54 pm
"Calling Windows 10 APIs From a Desktop Application"
and
https://learn.microsoft.com/en-us/uwp/api/windows.devices.display.displaymonitor
"DisplayMonitor Class"
Namespace: Windows.Devices.Display Assemblies:Windows.Devices.Display.dll, Windows.dll
Provides information about a display monitor device connected to the system.
These data include commonly used information from the monitor's Extended Display Identification Data (EDID, which is an industry-standard display descriptor block that nearly all monitors use to provide descriptions of supported modes and general device information) and DisplayID (which is a newer industry standard that provides a superset of EDID).
RawDpiX
Gets the physical horizontal DPI of the monitor (based on the monitor’s native resolution and physical size).
RawDpiY
Gets the physical vertical DPI of the monitor (based on the monitor’s native resolution and physical size).
2006 年 Windows 中的基本显示器信息
https://learn.microsoft.com /en-us/windows/desktop/wmicoreprov/msmonitorclass
MSMonitorClass 类
WmiMonitorRawEEdidV1Block 类
WmiMonitorBasicDisplayParams 类
(EDID 中的大小以厘米为单位,EDID 详细时序描述符
12 中的大小以毫米为单位 水平图像大小,毫米,8 lsbits(0– 4095 毫米,161 英寸)
13 垂直图像尺寸,毫米,8 lsbits(0–4095 毫米,161 英寸)
14 位 7–4 水平图像尺寸,毫米,4 msbits
位 3–0 垂直图像大小,毫米,4 msbits
)
和
https://social.msdn.microsoft.com/Forums/vstudio/en-US/e7bb9384-b343-4543-ac0f-c98b88a7196f/ wpf-wmi-just-get-an-empty-string
Basic monitor info in Windows from 2006
https://learn.microsoft.com/en-us/windows/desktop/wmicoreprov/msmonitorclass
MSMonitorClass class
WmiMonitorRawEEdidV1Block class
WmiMonitorBasicDisplayParams class
( Sizes in EDID are in centimeters above and in millimeters in EDID Detailed Timing Descriptor
12 Horizontal image size, mm, 8 lsbits (0–4095 mm, 161 in)
13 Vertical image size, mm, 8 lsbits (0–4095 mm, 161 in)
14 Bits 7–4 Horizontal image size, mm, 4 msbits
Bits 3–0 Vertical image size, mm, 4 msbits
)
and
https://social.msdn.microsoft.com/Forums/vstudio/en-US/e7bb9384-b343-4543-ac0f-c98b88a7196f/wpf-wmi-just-get-an-empty-string