Delphi 3报告的屏幕宽度和高度不正确

ins*_*lly 0 delphi

我有一个Delphi 3应用程序,已经广泛分发至少十年.今天我收到一份报告称该应用程序在华硕Transformer T100TA-C1-GR(S)Windows 8平板电脑上无法正常运行.具体来说,该应用程序拒绝运行,因为它检测到的屏幕分辨率太小,无法让应用程序正确显示自己.在应用程序中,我有以下条件检查:

 if (Screen.Width < 800) or (Screen.Height < 600) then begin
    // display a message reporting screen resolution too low
    ShowMessage('blah blah...');
    Application.Terminate;
Run Code Online (Sandbox Code Playgroud)

当我编译我的应用程序的特殊版本以帮助调试问题,并将应用程序提供给抱怨用户时,他们会报告以下数字:

    Width: 980
    Height: 550
Run Code Online (Sandbox Code Playgroud)

这是我添加了特殊编译的额外代码,然后我给用户:

 ShowMessage('Width: ' + IntToStr(Screen.Width) + #13#10 +
    'Height: ' + IntToStr(Screen.Height));
Run Code Online (Sandbox Code Playgroud)

但是,用户发誓他们的平板电脑配置为1368x768.他们甚至切换到1024x768并且Delphi报告了相同的错误数字.

所有TForm.Scaled属性都设置为False.

一条可能有帮助的线索......屏幕宽度和高度检测代码(上图)在以下过程中运行:

 procedure TForm1.WMDisaplayChange(var m: TWMDisplayChange);
Run Code Online (Sandbox Code Playgroud)

知道可能会发生什么吗?

Dav*_*nan 8

您的应用程序受DPI虚拟化的影响.您的应用尚未向系统表明它知道并支持高DPI显示设备.有问题的机器使用大于125%的字体缩放.那是DPI的高点截止点.除了这种扩展,系统还可以虚拟化非DPI感知应用的字体缩放.从文档:

Windows Vista引入了一项称为DPI虚拟化的功能,该功能为不支持DPI的应用程序提供了一定程度的自动扩展支持.通过此功能,Windows可以扩展不支持DPI的应用程序的文本和UI元素的大小,以便在高DPI设置下适当调整大小,而无需更改应用程序.这可以防止在高DPI屏幕上应用程序渲染太小时发生的潜在可用性和可读性问题.

在Windows Vista到Windows 8中,此功能为不支持DPI的应用程序提供"虚拟化"系统指标和UI元素,就好像它们以96 DPI运行一样.然后,应用程序渲染到96 DPI离屏表面,DWM缩放生成的应用程序窗口以匹配DPI设置.例如,如果DPI显示设置为144,则DWM将应用程序的窗口缩放150%或144/96.

这样做的结果是系统伪造了屏幕尺寸.当您的应用程序进行DPI虚拟化时,系统会报告虚拟化维度而不是真实维度.

最佳做法是声明您的应用程序具有高DPI感知能力,并根据用户的字体缩放首选项缩放UI.当然,这对你来说是一个很大的变化.可能不是你想要的人之一.

另一种选择是要求用户使用缩小的字体缩放.他们可能也不会非常热衷于此.

另一个选择是显示您的应用程序高DPI意识并继续不扩展它.然后它肯定会运行,但它不会尊重用户的字体缩放首选项.再次,我想用户将是非加号的.

如果您当前没有显示您的应用,那么现在这样做将导致它不被虚拟化.我的意思是应用虚拟化而不是DPI虚拟化.虽然您确实不应该仍在运行虚拟化,但如果禁用虚拟化,则可能会遇到麻烦.

而Sertac建议另一种选择.让用户为您的应用程序应用兼容性设置以禁用DPI虚拟化.您可以将其应用到今天的应用程序,而无需重新编译,至少您的用户将能够取得进展.

从根本上说,用户的机器设置存在问题.如果它有768个垂直像素和大约140%的缩放比例,那么它实际上是100%缩放,相当于550像素.这不是很多像素.你的应用程序是反对的,因为屏幕太小了,好吧,也许情况确实如此.

这里的各种答案可能对您有用:当Windows字体缩放大于100%时,如何使我的GUI表现良好