[英]How to Change DPI Scaling behavior in C#
在我们的应用程序中,我们的功能在 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++;
}
}
如果您不想弄乱 win32-api,您可以在 app-manifest 中为您的应用程序设置 dpi-awareness。 例如,每个监视器 dpi 感知:
<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-我们/windows-hardware/manufacture/desktop/dpi-related-apis-and-registry-settings
编辑:第一种方法是使用清单使应用程序 DPI 感知,然后如果您需要应用程序处理 dpi 更改并使其真正感知 DPI,您将需要查询 GetDpiForMonitor(对于每个监视器感知)。 这里有一个带有包装器的类似问题: How to get DPI scale for all screen?
2:nd 编辑:这里的评论后是在每个屏幕上显示监视器数字的示例: https : //gitlab.com/mattincode/wpf_dpi_aware.git
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.