关于本文
本文是通过利用生成式 AI 的自动化生成流程创建的。我们查阅了 Microsoft Learn 上的 GetDpiForSystem,并将其整理为一个最小化尝试(TRY),即从 PowerShell 调用 Win32 API 来观察 Windows 的 DPI 值。
验证状态:📘 已确认 Microsoft 官方规范,尚未在 Windows 实机上验证
本次尝试成功的条件是:能够从 PowerShell 调用 GetDpiForSystem 并显示非 0 的 DPI 值。
冒烟测试
Add-Type @'
using System.Runtime.InteropServices;
public static class DpiApi {
[DllImport("user32.dll")]
public static extern uint GetDpiForSystem();
}
'@
$dpi = [DpiApi]::GetDpiForSystem()
if ($dpi -eq 0) { throw '[FAILED] DPI = 0' }
"[SUCCESS] SystemDpi = $dpi"
观察
检查是否会显示 96、120、144 等根据环境而异的值。通过返回值而不是“没有错误”来判断 API 是否调用成功。
为什么?
Windows 的 UI 大小不仅仅由物理像素决定。由于涉及到 DPI 和缩放比例,因此在制作 GUI 时,如果只考虑固定像素,就会产生环境差异。
更改一处
请不要修改 Windows 的显示缩放比例,而是先在其他电脑或其他设置环境中比较数值。如果涉及更改设置,请记录更改前的值。
失败 / 边界
根据 DPI 感知(DPI awareness)的状态,API 的含义或推荐的 API 会有所不同。对于需要 per-monitor DPI 的应用程序,也可以考虑使用 GetDpiForWindow 等其他 API。
如果在工作中应用
在通过 PowerShell + WPF 制作内部工具时,这将成为理解为什么文字和按钮的大小在不同电脑上会发生变化的一个入口。
