为什么winform在同一台4k显示器上显示不同

时间:2017-04-04 07:15:37

标签: c# winforms

我们有一个传统的.net Windows窗体应用程序。 我们已经用Web应用程序替换了大部分内容,但仍然使用Windows窗体应用程序进行管理任务。

当这个应用程序在4k显示器上使用时,它看起来非常糟糕,这是可以理解的。

但外观会根据系统上的其他显示器而变化。 测试是在lenovo 430上完成的,它有一个4k显示器通过显示端口连接。 笔记本电脑显示器的分辨率为1920/1080,而4k显示器的分辨率为3840/2160。显示比例始终为200%。

所有以下屏幕截图均在4k显示器上拍摄。

  1. 两个监视器都处于活动状态的测试
  2. 仅使用第二个屏幕进行一次测试
  3. 关闭笔记本电脑显示器的一次测试(这意味着只有一台显示器可用于系统)
  4. enter image description here enter image description here enter image description here

    我知道如果没有更改并设置dpiAware / dpiAwareness,我们的应用程序在4k上看起来不会很好。

    但我的问题是: 为什么应用程序只会根据哪些监视器处于活动状态而发生变化?有没有办法控制哪种“外观”?

3 个答案:

答案 0 :(得分:4)

Microsoft了解此问题并使用.Net 4.7 Framework修复此问题:

https://blogs.msdn.microsoft.com/dotnet/2017/04/05/announcing-the-net-framework-4-7/

答案 1 :(得分:4)

也许你已经意识到这一点,但之前没有提到过:

有三种应用程序:

  • 不支持DPI
  • 系统DPI识别
  • 每台显示器DPI识别

详细信息: https://msdn.microsoft.com/de-de/library/windows/desktop/dn469266(v=vs.85).aspx

您可以在app.config中设置应用程序的DPI感知:

void SetValue(IntPtr mhWnd, int val)
    {            
        IntPtr hWnd = mhWnd;
        int pos = SendMessage4(hWnd, TBM_GETPOS, 0, 0);            
        Console.WriteLine("pos " + pos);

        int result = SendMessage4(hWnd, TBM_SETPOS, 1, val);
        Console.WriteLine("result  " + result);
        //result = SendMessage4(hWnd, WM_HSCROLL, 0, 0);   
        //Console.WriteLine("result 2 "+ result);
    }

和app.manifest:

<appSettings>
    <add key="EnableWindowsFormsHighDpiAutoResizing" value="false" />
</appSettings>

当您有DPI&gt; = 150%时,可以通过额外控制缩放 人民币申请 - &gt;属性 - &gt;兼容性 - &gt;在高DPI上扩展

对于Windows窗体,默认情况下DPI-Scaling禁用高DPI。所以一切都应该开箱即用。也许其中一个设置不是默认设置?特别是exe上的RMB属性配置?

答案 2 :(得分:0)

在我的特殊情况下,我遇到缩放问题的应用程序正在同时使用WinForms和WPF的DevExpress组件。我在DevExpress网站上使用instruction解决了4K显示器的缩放问题。在我看来,该指令是通用的,而不是特定于DevExpress的内容。

即,我刚刚添加了 app.manifest 文件,并将其默认内容替换为以下文件:

<?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>

您可以通过右键单击项目并选择添加新项来添加 app.manifeset 文件: enter image description here

希望对您也有帮助。