针对特定应用程序禁用Windows 10缩放

3
我遇到了一些应用程序问题(主要是仪表板),因为某些用户使用Windows显示缩放功能使其图标变大,但这会在我的软件中引起巨大问题。我正在寻找一种完全禁用应用程序缩放并将应用程序按照显示分辨率的像素进行缩放的方法。
我找到了这个帖子,但它已经有8年历史了,当时还不存在Windows 10,另一个用户给出了答案,但也不起作用。
这种行为的简单示例主要发生在仪表板上,因为这些屏幕上有很多控件和小部件,并且对于机器人机械控制器等关键任务非常重要。
一个示例仪表板窗口的最小尺寸为1900 x 980(在两个方向上可能会小4-5个像素,但我们四舍五入以获得圆整的XY值)。此分辨率略小于1920 x 1080。它不能更小,但如果您拥有更大的屏幕,例如4K,则可以使其更大,从而获得更多的树形视图数据,在3D引擎渲染器中获得更好的显示等。
因此,一些用户使用最大分辨率为1920 x 1080的小型笔记本电脑屏幕,但他们使用150%的缩放,因此我的屏幕最小尺寸在他们的屏幕上变为2850 x 1470,使应用程序比屏幕还要大并超出屏幕范围。
另一个例子是,如果我使用具有2736 x 1824分辨率的Windows Surface Pro,它的大小约比1920 x 1080大80%,则窗口确实仍然占据屏幕上原始的1900 x 980像素,这使其看起来相当小,因此如果您全屏它,则可以在所有控件中看到更多信息。但是,如果您将缩放比例更改为150%,则屏幕现在会再次占据屏幕上的2850 x 1470像素,它在高度上完全适合,但在宽度上我短了100个像素,100个像素足以失去屏幕的右侧部分,您将无法看到最左边或最右边的屏幕部分。
我尝试了三种自动缩放模式:DPI、字体和无,但它根本不起作用。无论如何,它仍会拉伸屏幕。更改窗体的字体也没有帮助,我设法让它在窗体中直接工作了几个标签,但组合框内的任何内容都无法更改或增长两倍。
重要要点:
  • 项目使用的是 .net 4.54.6,但如果需要特定功能,编译在 4.7 也没有问题。
  • WPF 不可行。我们花了3年时间实现它,最终由于第三方 DLL 的性能问题和 3D CAD 性能极差,我们不得不放弃。
  • 屏幕已经尽可能地优化,控件数量最少。在数百个屏幕和成千上万个用户控件中,有一半非常接近 1920 x 1080 的限制,这约占我们客户的90%。
  • 我收到了一个建议,在客户端电脑上以100%的缩放运行虚拟机,这不受主机电脑的影响。这可能是我的最后手段,因为通过VM特别是CAD卡(如Quadro和FireGL)处理专用视频卡非常困难。
  • 一半的用户使用触摸屏,我们试图将所有内容放入一个带有2个滚动条的面板中,但效果很差,并且几乎不能使用。因此,这仅适用于鼠标用户,而这些用户都使用桌面,所以99%的人不会使用缩放,因此他们不会遇到此问题。

所以,现在有什么可以解决或绕过这个问题的方法吗?


2
您可能不想听这个,但我认为那些不尊重我的操作系统配置缩放比例的应用程序是很反社会的,以至于我会寻找替代方案。许多人使用此设置,因为他们的眼睛无法处理较小尺寸的东西。倾斜来看屏幕上的小细节可能导致长期的背部问题。不要忽视用户的需求。 - spender
但是,你的app.manifest文件中是否有<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">false</dpiAware>来自同一“作者”我写的一些笔记 - Jimi
你说不用WPF,但是你遇到了缩放问题,没有比它更合适的解决方案了。WinForms并不是最好的选择,结果最多只能是笨拙的。 - Michael Puckett II
一个 GUI 窗口应该很容易地调整大小,能缩小到合理的最小尺寸。先解决这个问题,你也会解决这个问题。如果你之前有过可预测的显示器尺寸和分辨率的奢侈条件,那么这个问题说起来比做起来容易得多,你已经在借来的时间里生活了。是的,那段时期已经结束,不会再回来了。 - Hans Passant
@Jimi 看起来很不错,我会试一试。而且Hans,我已经有了合理的最小尺寸。这些窗口已经被压缩到极限了。我有一些下拉列表,宽35像素,高25像素。这只够大以便有下拉图标,并能看到下拉列表中的第一个字符。我不能再把它们做得更小了。这些仪表板需要那么多控件,我们正在像素级别上对齐和保存每个像素,以适应所有内容。 - Franck
1
@Jimi,你的额外注释部分非常完美。你是唯一一个指定每个操作系统版本并且它可以在Windows 10上工作的人。即使窗体标题栏占用了额外的像素,但由于仍然恰当地缩放,因此窗口的高度仍完美地适配。 - Franck
1个回答

0

你尝试过使你的进程DPI感知吗?

你可以通过pinvoke来实现:

[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool SetProcessDPIAware();

并调用

SetProcessDPIAware();

在你的主要代码中或创建一个清单并添加

<dpiAware>true</dpiAware>

这里有一个 教程。将其声明为 DPIAware 将阻止 Windows 自行缩放。


它在Windows 10上不起作用,我已经尝试过了。我也尝试了清单,但它也不起作用。 - Franck
链接已经失效了^^ - Taki7o7

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