gpt4 book ai didi

delphi - GetSystemMetrics 和 TScreen 返回错误值

转载 作者:行者123 更新时间:2023-12-03 15:49:57 26 4
gpt4 key购买 nike

我使用的是Delphi XE5。我认为我的笔记本电脑有问题。一段时间后,它向 Screen.Width 和 GetSystemMetrics(SM_CXSCREEN) 返回错误值(高度相同)。我的操作系统是 Windows 7 64 位。

我的笔记本电脑的屏幕分辨率是 1920x1080 (1080p),但我的应用程序说它是 1280x720 (720p)。我不认为存在 DPI 问题,因为当我重新启动并在一段时间后启动时,问题就出现了。兼容性设置也已关闭。以前有人遇到过这个问题吗?或者你知道解决办法吗?我还添加了下面的 list ,但没有帮助

<?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 中不起作用

最佳答案

您声明您的系统正在以 150% 字体缩放运行。如果您的应用程序以 DPI virtualization 运行那么这个虚拟化就解释了你观察到的行为。请注意,1920/1.5 = 12801080/1.5 = 720

对于您报告的行为,唯一合理的解释是该进程在 DPI 虚拟化下运行。应用 DPI 感知 list 选项将停止 DPI 虚拟化。因此, list 很可能没有正确链接到您的应用程序,或者 list 无效。

我怀疑您的应用程序可能有两个链接的 list 。其中第二个将被丢弃。如果您在 Delphi 项目中使用默认应用程序设置,就会发生这种情况。下一步是使用资源查看器查看链接到可执行文件的实际资源。这是查看链接内容的可靠方法。

解决方案可能是使用 Delphi 项目选项的应用程序节点中的自定义 list 选项并提供完整的应用程序 list 。这需要指定 comctl32 v6 来启用主题、asInvokerrequireAdministrator 选项以及 DPI 感知选项。

关于delphi - GetSystemMetrics 和 TScreen 返回错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28339257/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com