您好,我正在实现 DPI 感知应用程序,我想根据当前分辨率计算窗口的位置。
我在 Windows 8.1 上测试了以下代码,如果我们更改 DPI 设置,操作系统不会要求重新登录。 它立即应用 DPI。
var presentationSource = PresentationSource.FromVisual(this);
transform = presentationSource.CompositionTarget.TransformToDevice;
int width = transform.m11 * SystemParameters.PrimaryScreenWidth;
int height = transform.M22* SystemParameters.PrimaryScreenHeight;
但是如果我使用 mspanel 更改 DPI 而无需注销并重新登录,TransformToDevice() 将返回旧值 而不是新的。 我认为如果 DPI 设置发生变化,这个变换矩阵也会发生变化。
当 DPI 设置更改时我应该调用一个方法吗?
最佳答案
我不确定您环境的 DPI 设置,但由于您正在谈论“无需注销和重新登录”更改 DPI,我假设 Windows 8.1 的每显示器 DPI 功能已启用。
在Per-Monitor DPI环境下,显示器DPI可以立即更改,无需注销并重新登录,而系统DPI不会跟随更改,直到注销并重新登录。您的代码(看起来不完整)不过)是为了获取系统 DPI。相反,您需要使用 GetDpiForMonitor通过P/Invoke获取当前显示器DPI。
关于wpf - TransformToDevice 在 Windows 8.1 上不返回正确的 DPI 系数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26271887/