【问题标题】:How to Change DPI Scaling behavior in C#如何在 C# 中更改 DPI 缩放行为
【发布时间】:2018-03-01 14:08:22
【问题描述】:

在我们的应用程序中,我们的功能无法在 4k 显示器上正常工作。当我们右键单击可执行文件并更改兼容性设置时,我们可以通过更改以下设置来使事情正常工作。

我的问题是:是否可以从 WPF 应用程序的 c# 代码中更改红色框中突出显示的这两个设置?我想执行一个方法,改变这些设置,当5秒的定时器结束时,我想把它们改回来。

这是我如何获取我正在识别的屏幕的坐标。

private void btn_identifyScreens_Click(object sender, RoutedEventArgs e)
{
   int screenNumber = 1;
   foreach (System.Windows.Forms.Screen screen in System.Windows.Forms.Screen.AllScreens)
   {
       NumberSplash numberSplash = new NumberSplash(screenNumber);
       numberSplash.Left = screen.WorkingArea.Left;
       numberSplash.Top = screen.WorkingArea.Top;
       numberSplash.Width = screen.WorkingArea.Width;
       numberSplash.Height = screen.WorkingArea.Height;
       numberSplash.Show();
       screenNumber++;
   }
}

【问题讨论】:

标签: c# wpf resolution dpi


【解决方案1】:

如果您不想弄乱 win32-api,您可以在 app-manifest 中为您的应用程序设置 dpi-awareness。例如,每个显示器的 dpi-awareness:

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
...
    <application xmlns="urn:schemas-microsoft-com:asm.v3">
        <windowsSettings>
            <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
     <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
         PerMonitor   
     </dpiAwareness>
        </windowsSettings>
    </application>
...
</assembly>

见上面的 GitHub:https://github.com/Microsoft/WPF-Samples/tree/master/PerMonitorDPI

如果您想在应用程序中进行细粒度控制,我相信您可能必须使用 win-api。这里有一篇很棒的文章描述了这一点:https://blogs.windows.com/buildingapps/2017/04/04/high-dpi-scaling-improvements-desktop-applications-windows-10-creators-update/

您也可以直接设置注册表项 Computer\HKEY_CURRENT_USER\Control Panel\Desktop (但这会影响 Ben 在下面的评论中指出的所有程序) 此处描述了密钥:https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/dpi-related-apis-and-registry-settings

编辑: 第一种方法是使用清单使应用程序可感知 DPI,然后如果您需要应用程序处理 dpi 更改并使其真正感知 DPI,则需要查询 GetDpiForMonitor(对于每个监视器的感知)。这里有一个与包装器类似的问题:How to get DPI scale for all screens?

第 2 次编辑: 在 cmets 之后是一个在每个屏幕上显示监视器数字的示例:https://gitlab.com/mattincode/wpf_dpi_aware.git

【讨论】:

  • 不要更改HKEY_CURRENT_USER\Control Panel\Desktop来尝试解决这个问题,它会搞砸计算机上的所有其他程序。
  • 我同意,我的错。 :)
  • 当我将该 xml 添加到我的清单文件时,将 true 更改为 false 并删除“PerMonitor”字符串,我得到了我想要的效果。但是,我的 4k 显示器中的应用程序看起来很荒谬。也许对这个问题的简短回答是——“这很复杂”。 ;-)
  • 您能否详细说明您所做的在 4K 显示器上看起来很奇怪的操作,是自定义绘图吗? dpi-awareness 的问题在于,一旦您设置了它,您的应用程序就会自行承担处理缩放的责任。
  • 我要做的就是通过它们的位置来识别监视器。找到位置后,我会在屏幕上显示一个数字,以便识别它是哪个监视器。因此,如果有 3 台机器连接到该程序,它将居中并在监视器 1 上放置一个巨大的“1”,在监视器 2 上放置一个巨大的“2”,在监视器 3 上放置一个巨大的“3”。算法 I' m 适用于非 4k 显示器。当您将 4k 显示器添加到混音中时,它会损坏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
  • 2014-03-01
  • 1970-01-01
  • 2020-04-27
相关资源
最近更新 更多