在 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 皱纹。必须在创建任何窗口之前调用它,因此“用户输入”并不是一个绝妙的主意。 @HansSetProcessDpiAwareness
与 SetProcessDpiAware
不同。
【参考方案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 感知级别的主要内容,如果未能解决你的问题,请参考以下文章