【问题标题】:Actual resolution of secondary screen for custom DPI自定义 DPI 的副屏实际分辨率
【发布时间】:2016-07-12 13:24:38
【问题描述】:

我正在努力使应用程序适应自定义 DPI 值(Windows 缩放)。

如果我理解正确的话,缩放会使应用程序认为分辨率比实际要小。例如,具有 125% 的比例,如果您的分辨率为 1920x1080,则最大化窗口的实际大小将为 1536x864。当然,如果你从代码中控制一些大小和位置,它可能会导致一些问题。

目前,我正在使用下一个值进行定位等:

  • SystemParameters.FullPrimaryScreenWidthSystemParameters.FullPrimaryScreenHeight 作为“虚拟”(缩放)分辨率;
  • Screen.PrimaryScreen.WorkingArea.WidthScreen.PrimaryScreen.WorkingArea.Height 为原始分辨率;

从这些值中,很容易得到缩放值,可以用于任何定位和尺寸。

但所有这些值实际上都是针对主屏幕的。如果我需要为辅助屏幕进行定位和调整大小,它可能具有不同的实际(因此,不同的“虚拟”)分辨率?

现在我得到这样的屏幕

var screen = Screen.FromHandle(new System.Windows.Interop.WindowInteropHelper(Application.Current.MainWindow).Handle);

这允许我使用WorkingArea 矩形获得实际分辨率。但是“虚拟”分辨率呢?除了主屏幕之外,是否有类似SystemParameters.FullPrimaryScreenWidth 等的屏幕?

PS。我知道,这个比例是共享的,所以通过获取主屏幕的值,我可以将它用于任何其他屏幕,但我想知道答案,如果有直接变量来获取这个值,无论如何。

【问题讨论】:

  • 这在 WPF 应用程序中永远不会发生,它总是默认禁用 DPI 虚拟化。当然,您犯的错误是您忘记将从 Screen 类中获得的值从像素转换为英寸。 Look here.
  • @HansPassant 无论如何,主要问题是如何获得“虚拟”分辨率。

标签: c# wpf xaml


【解决方案1】:

您可以使用以下比例

        // calculates text size in that main window (i.e. 100%, 125%,...)
        var ratio = Math.Max(Screen.PrimaryScreen.WorkingArea.Width / SystemParameters.PrimaryScreenWidth,
                        Screen.PrimaryScreen.WorkingArea.Height / SystemParameters.PrimaryScreenHeight);

例如,如果您想在所有屏幕上显示最大化的窗口,您需要使用以下矩形(代码来自 App.xaml.cs):

        foreach (var screen in Screen.AllScreens)
        {
            var mainViewModel = container.Resolve<IMainWindowModel>();

            var window = new MainWindow(mainViewModel);
            if (screen.Primary)
                Current.MainWindow = window;

            window.Left = screen.WorkingArea.Left / ratio;
            window.Top = screen.WorkingArea.Top / ratio;
            window.Width = screen.WorkingArea.Width / ratio;
            window.Height = screen.WorkingArea.Height / ratio;
            window.Show();
            window.WindowState = WindowState.Maximized;
        }

另外,你可以看看我的帖子https://ireznykov.com/2017/01/13/wpf-windows-on-two-screens/,它指的是在所有屏幕上输出最大化窗口的GitHub示例应用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 2011-07-04
    • 1970-01-01
    相关资源
    最近更新 更多