精易论坛

标题: 一文讲清楚高分屏DPI缩放模糊解决方法与存根清单设置 [打印本页]

作者: 李商隐2    时间: 2024-12-9 13:49
标题: 一文讲清楚高分屏DPI缩放模糊解决方法与存根清单设置
翻遍了论坛所有有关dpi缩放的帖子,解决方法很多,有引入第三方dpi缩放模块的,我所有模块都试过了,要么是必须在程序初始指定缩放比例,不能响应系统设置的dpi缩放,例如这个DPI适应_精易论坛要么就是能响应系统设置的dpi缩放,但部分组件有问题,超级列表框高度变低,菜单栏图标高度变低,例如这个QSSmartScale 自动界面缩放+完整字体缩放 完整DPI支持_精易论坛,引入模块的方法始终是不完美的。其中还有别的方法,就是给应用程序的属性设置高DPIdpi缩放行为为“系统(增强)”

这种方法固然有效,但你不能每次都手动设置吧,而且只要移动位置或者改名就得重新设置,发给别人用也得重新设置,这其实是在系统有关dpi缩放的注册表添加了一个文件路径,告诉系统以“系统(增强)”的方式缩放程序,因此呢还有人,在程序开始的时候自动写入注册表,程序结束的时候自动删除注册表,嗯...感觉有点不必要,频繁操作注册表实在不是明智行为。
论坛也有不少设置存根清单的帖子,但设置完都是禁用dpi缩放了,清晰是清晰了,但也窗口变小了,大小也不能跟系统缩放了,这样不同屏幕适应性太差。
然后我研究了一下微软官方的文档,得出一个结论
        <windowsSettings>
          <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>  
          <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, system</dpiAwareness>  
          <gdiScaling xmlns="http://schemas.microsoft.com/SMI/2017/WindowsSettings">true</gdiScaling>   
        </windowsSettings>
存根清单里的这个<windowsSettings>部分是关于DPI缩放设置的,第一条<dpiAware>是在较旧的系统上win8.1之前的系统上启用dpi感知,<dpiAwareness>  在win8.1之后的系统上启用dpi感知,
但是易语言程序过于古老,当初设计不支持高DPI,仅启用这两行是不够的,微软为了不支持高dpi的程序提供了一个“系统(增强)”的设置,那就是第三条<gdiScaling>,设置了这一条后,编译后的程序自带“系统(增强)”属性,不用再手动设置,或者用其他软件设置。
附上一个完整的存根清单,设置了这个即可支持高分辨率屏幕dpi缩放且不模糊。
[XML] 纯文本查看 复制代码
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <application>
        <windowsSettings>
          <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>  
          <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, system</dpiAwareness>  
          <gdiScaling xmlns="http://schemas.microsoft.com/SMI/2017/WindowsSettings">true</gdiScaling>   
        </windowsSettings>
    </application>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="x86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
      <application>
          <!--Windows Vista -->
          <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
          <!--Windows 7 -->
          <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
                  <!--Windows 8 -->  
                  <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
                  <!-- Windows 8.1 -->            
          <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>   
          <!-- Windows 10, Windows 11 -->              
          <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>   
      </application>
</compatibility>
</assembly>

作者: dangerace    时间: 2024-12-9 18:38
这么牛逼吗?我去试试的,要说有效回来给楼主加分!
作者: laihobglei    时间: 2024-12-9 20:58
感谢分享,很给力!~
作者: dangerace    时间: 2024-12-9 21:10
大佬,发现个问题,烦请您一并修复。
使用了您的存根,就无法选择程序以管理员权限启动了,这样就造成我的程序无法正常运行(是的,我的程序必须以管理员权限启动)
这点能不能在存根中进行修复或者添加?
作者: 李商隐2    时间: 2024-12-9 22:03
dangerace 发表于 2024-12-9 21:10
大佬,发现个问题,烦请您一并修复。
使用了您的存根,就无法选择程序以管理员权限启动了,这样就造成我的 ...

可以改的,一会发出来
作者: 李商隐2    时间: 2024-12-10 12:47
李商隐2 发表于 2024-12-9 22:03
可以改的,一会发出来

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <application>
        <windowsSettings>
          <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>  
          <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, system</dpiAwareness>  
          <gdiScaling xmlns="http://schemas.microsoft.com/SMI/2017/WindowsSettings">true</gdiScaling>   
        </windowsSettings>
    </application>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="x86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
      <application>
          <!--Windows Vista -->
          <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
          <!--Windows 7 -->
          <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
                  <!--Windows 8 -->  
                  <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
                  <!-- Windows 8.1 -->            
          <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>   
          <!-- Windows 10, Windows 11 -->              
          <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>   
      </application>
</compatibility>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
作者: 李商隐2    时间: 2024-12-10 12:47
dangerace 发表于 2024-12-9 21:10
大佬,发现个问题,烦请您一并修复。
使用了您的存根,就无法选择程序以管理员权限启动了,这样就造成我的 ...

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <application>
        <windowsSettings>
          <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>  
          <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, system</dpiAwareness>  
          <gdiScaling xmlns="http://schemas.microsoft.com/SMI/2017/WindowsSettings">true</gdiScaling>   
        </windowsSettings>
    </application>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="x86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
      <application>
          <!--Windows Vista -->
          <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
          <!--Windows 7 -->
          <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
                  <!--Windows 8 -->  
                  <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
                  <!-- Windows 8.1 -->            
          <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>   
          <!-- Windows 10, Windows 11 -->              
          <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>   
      </application>
</compatibility>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
作者: ノ朽默℡    时间: 2024-12-10 14:43
哪一份是最后的修复版?请以代码形式贴出来吧,这样太乱了。
作者: 2269248626    时间: 2024-12-12 22:43
李商隐2 发表于 2024-12-10 12:47
true  
          PerMonitorV2, system  
          true   

这个清单有bug win10  (桌面右键>显示设置>缩放布局>设置125%)  软件的组合框会变得看不见 可以修复一下吗
作者: 真IKUN    时间: 2024-12-13 05:48
精彩文章希望继续努力
作者: 910265444    时间: 2024-12-13 10:59
感谢分享好用
作者: 真IKUN    时间: 2024-12-15 16:16
好东西,感谢楼主分析,收藏了
作者: 真IKUN    时间: 2024-12-15 18:50
感谢分享,很给力!~
作者: p4061126    时间: 2025-1-11 19:59
水水水水水水水水水水水
作者: p4061126    时间: 2025-1-11 19:59
是顶顶顶顶顶顶顶顶顶顶
作者: lieshou123    时间: 2025-1-15 18:34
DLL载入的窗口无效
作者: 李商隐2    时间: 2025-2-9 17:14
lieshou123 发表于 2025-1-15 18:34
DLL载入的窗口无效

只能原生窗口
作者: 在看风云    时间: 2025-2-23 10:13
66666666666666666666
作者: gao110108    时间: 2025-3-12 21:17
厉害,我试过多种方法,包括改注册表,  这个方法最好,
作者: 步天有术88    时间: 2025-5-10 13:46
用了之后组合框内容就看不见了




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4