在C#中更改“覆盖高DPI缩放行为”

14

我们有一个WinForm中的控件(CefSharp控件),当用户的屏幕设置为Windows上的125%时,它会出现图像伪影。不仅仅是控件,独立的Chrome也会出现这种情况。我们唯一能够修复伪影的方法是更改下面所示的exe设置。是否有一种方式可以通过代码来更改它?

输入图像描述

编辑:这不是重复的问题。因为使应用程序DPI感知并不等同于DPI缩放行为。


1
@hans-passant 这不是重复内容。因为使应用程序具有 DPI 感知能力与 DPI 缩放行为并不相同。 - Mike_G
你想强制设备缩放因子吗?使用以下设置可以防止浏览器在使用更高的DPI时进行缩放:settings.CefCommandLineArgs.Add("force-device-scale-factor", "1"); - TEK
@TEK 感谢您的建议,但问题仍然存在。 - Mike_G
@Mike_G 你找到解决方案了吗?我也遇到了完全相同的问题。 - Juan
@Juan,很抱歉我们刚开始在XAML中构建我们的控件。 - Mike_G
程序员寻找正确解决方案的原始重复链接:https://dev59.com/A2Ys5IYBdhLWcg3wAfEi#13228495 - Hans Passant
1个回答

8

方法一:使用注册表覆盖高DPI缩放(勾选复选框)

启动注册表编辑器并导航到此键:

HKEY_CURRENT_USER\­Software\­Microsoft\­Windows NT\­CurrentVersion\­AppCompatFlags\­Layers

现在添加一个字符串值(REG_SZ),其名称为应用程序可执行文件的完整路径,其值为HIGHDPIAWARE。

代码示例:

string appPath = string.Format(@"{0}\{1}.exe", My.Application.Info.DirectoryPath, My.Application.Info.AssemblyName);       
My.Computer.Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers", appPath, "HIGHDPIAWARE");

阅读更多:Windows高DPI设置


方式2. 如何在程序集清单中改变DPI感知?

DPI感知应用不受操作系统影响。这类应用会根据屏幕的实际DPI进行渲染,提供更好的视觉体验。

<dpiAware>元素添加到清单代码中,并将其值设置为true

<?xml version="1.0" encoding="utf-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
    <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
        <security>
            <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
                <requestedExecutionLevel level="asInvoker" uiAccess="false" />
            </requestedPrivileges>
        </security>
    </trustInfo>
    <asmv3:application>
        <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
             <dpiAware>true</dpiAware> 
        </asmv3:windowsSettings>
    </asmv3:application>
</assembly>

额外资源:

  1. 高DPI支持

  2. Windows上的高DPI桌面应用程序开发 (还有应用程序清单)

  3. DPI感知 - 在一个版本中未感知,在另一个版本中系统感知[重复]

  4. 编写高DPI感知的Windows应用程序

  5. 编写DPI感知的桌面和Win32应用程序


“覆盖高 DPI 缩放行为”复选框将不会被选中。但效果与已选中相同。 - abberdeen
但是这个复选框正是我想要实现的。 - nikotromus
@Los Pollos Hermanos - 顺便说一下,这个名字很棒。清单文件的更改没有像勾选框并选择下拉菜单中的“系统”那样产生相同的效果。它没有起作用。 - nikotromus
勾选“覆盖高 DPI”框后,就可以使用下拉列表进行更改。当我勾选“覆盖高 DPI”框,并选择“系统”而非“应用程序”时,我得到了期望的结果。现在我正在尝试找出如何在清单文件中更改该设置。 - nikotromus
2
它起作用了!!!这是我所做的修改,以便在我的情况下产生期望的效果:<dpiAware>true/system</dpiAware>非常感谢!!!当系统允许时,我将在三个小时后授予奖励。 - nikotromus
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接