如何在C#中更改DPI缩放行为

问题描述 投票:1回答:1

在我们的应用程序中,我们的功能无法与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++;
   }
}

enter image description here

c# wpf resolution dpi
1个回答
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。这里有一篇很棒的文章描述了这个:qazxsw poi

您也可以直接设置注册表项Computer \ HKEY_CURRENT_USER \ Control Panel \ Desktop(但这会影响Ben在下面的评论中指出的所有程序)这里描述的密钥:https://blogs.windows.com/buildingapps/2017/04/04/high-dpi-scaling-improvements-desktop-applications-windows-10-creators-update/

编辑:第一种方法是使用清单使应用程序感知DPI,然后如果您需要应用程序来处理dpi更改并使其真正具有DPI感知,则需要查询GetDpiForMonitor(针对每个监视器感知)。这里有一个与包装器类似的问题:https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/dpi-related-apis-and-registry-settings

2:nd编辑:这里的评论之后是一个在每个屏幕上显示监视器数字的示例:How to get DPI scale for all screens?

© www.soinside.com 2019 - 2024. All rights reserved.