在 win32 应用程序中动态设置 DPI 感知级别

Posted

技术标签:

【中文标题】在 win32 应用程序中动态设置 DPI 感知级别【英文标题】:Setting DPI awareness level dynamically in win32 Application 【发布时间】:2015-01-19 10:35:27 【问题描述】:

我正在寻找动态设置 DPI 感知级别的任何方法(基于用户输入)。我遇到了this。

它建议我应该使用setProcessDpiAwareness 函数来设置意识级别。但仅 Windows 8.1 预览版支持此 api 调用。是否有任何其他方法可以用于动态设置从 Windows 7 开始支持的 Dpi 感知级别?

提前致谢。

【问题讨论】:

SetProcessDPIAware() 从 Vista 开始可用。 Win81 刚刚添加了每个显示器的 DPI 皱纹。必须在创建任何窗口之前调用它,因此“用户输入”并不是一个绝妙的主意。 @Hans SetProcessDpiAwarenessSetProcessDpiAware 不同。 【参考方案1】:

在 Windows 8.1 中出现每显示器 DPI 感知之前,有 SetProcessDPIAware,从 Vista 开始支持。

但是,您可能希望在运行时做出此决定,这让我觉得非常不寻常。最佳做法是应用程序设计为具有高 DPI 感知能力,并将感知写入应用程序清单。

【讨论】:

感谢您的回复。但是文档说“SetProcessDPIAware 可用于要求部分中指定的操作系统。它可能会在后续版本中被更改或不可用。相反,请使用 SetProcessDPIAwareness。”这看起来有点不安全。我想要更安全的一面。 我目前正在使用清单方法。但是有很多资源(字体,控件,图形..等)。如果应用程序不适合用户,我想使用 DWM 缩放。所以我想将动态 dpi 感知设置为 false 以允许 DWM 缩放。 如果您不想要 dpi 感知,那么不要表明您的应用程序是 dpi 感知的。无需在运行时调用函数。 至于您的第一条评论毫无意义。您明确询问了在 Windows 7 上使用什么功能。好吧,那里没有 SetProcessDPIAwareness。在 Windows 7 上,您有 SetProcessDPIAware。就是这样。在 8.1 及更高版本上随时致电 SetProcessDPIAwareness,在早期版本上回退至 SetProcessDPIAware。当然,我只是从清单中删除 dpi 感知部分。 在这种情况下,如果用户的参数允许 dpi 感知,我将从清单中删除 dpi 感知并通过在启动时调用 SetProcessDPIAware 来启用它。

以上是关于在 win32 应用程序中动态设置 DPI 感知级别的主要内容,如果未能解决你的问题,请参考以下文章

设置高 DPI 时防止我的 Win32 应用程序的 UI 元素按比例放大

创建 DPI 感知应用程序

Windows DPI Awareness for WPF

设置进程 DPI 感知,以便系统补偿缩放因子

win10 dpi设置是啥意思

怎样进行Win10软件高DPI设置