【发布时间】:2015-02-05 08:23:50
【问题描述】:
我正在使用 Delphi XE5。我想我的笔记本电脑有问题。过了一会儿,它返回错误的值到 Screen.Width 和 GetSystemMetrics(SM_CXSCREEN) (高度相同)。我的操作系统是 Windows 7 64 位。
我的笔记本电脑的屏幕分辨率为 1920x1080 (1080p),但我的应用显示为 1280x720 (720p)。我不认为存在 DPI 问题,因为当我重新启动并在一段时间后启动时出现问题。兼容性设置也已关闭。以前有人遇到过这个问题吗?或者你知道解决方案吗?我还在下面添加了清单,但没有帮助
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<asmv3:windowsSettings
xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
</assembly>
这是我的编译方式
1 24 "mf.txt"
编辑:
好的,我编写了这个函数,但修复它的方法很棘手。我更喜欢 Screen.Width 返回正确的值:
function ScreenSize(var x, y: integer): boolean;
const
ENUM_CURRENT_SETTINGS = -1;
ENUM_REGISTRY_SETTINGS = -2;
var
dm: TDevMode;
begin
Result := False;
x := 0;
y := 0;
ZeroMemory(@dm, sizeof(dm));
if EnumDisplaySettings(nil, Cardinal(ENUM_CURRENT_SETTINGS), dm) then
begin
Result := True;
x := dm.dmPelsWidth;
y := dm.dmPelsHeight;
end else
begin
x := GetSystemMetrics(SM_CXSCREEN);
y := GetSystemMetrics(SM_CYSCREEN);
end;
end;
编辑 2:
我发现SetProcessDPIAware 解决了我的问题,但它在 XP 中不起作用
【问题讨论】:
-
如果你有一个高 dpi 缩放设置并且你的应用程序不知道 dpi,你会得到这种行为。
-
我的文本 DPI 缩放 150%,这就是它发生的原因。我用一个棘手的解决方案编辑了这个问题
-
将您的答案作为答案发布,而不是将其添加到问题中。
-
我不确定您的编辑将如何帮助您。如果在 DPI 虚拟化下运行,则无法使用非虚拟化的坐标空间。是的,您可以向用户报告这些数字,但您无能为力。
-
SetProcessDPIAware 效果很好,但不支持 XP
标签: delphi resolution getsystemmetrics