2

您好我正在实现 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 设置更改时,我应该调用一种方法吗?

4

1 回答 1

2

我不确定您的环境的 DPI 设置,但由于您正在谈论“无需注销和重新登录”更改 DPI,我假设 Windows 8.1 的 Per-Monitor DPI 功能已启用。

在 Per-Monitor DPI 环境下,显示器 DPI 可以立即更改而无需注销并重新登录,而系统 DPI 不会跟随更改,直到注销并重新登录。您的代码(虽然看起来不完整)是获取系统 DPI。相反,您需要使用P/Invoke 的GetDpiForMonitor来获取当前的监视器 DPI。

于 2014-11-23T00:39:04.973 回答