bla*_*sun 3 delphi resolution getsystemmetrics
我正在使用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>
Run Code Online (Sandbox Code Playgroud)
这是我如何编译它
1 24 "mf.txt"
Run Code Online (Sandbox Code Playgroud)
编辑:
好吧,我写了这个功能,这是修复它的棘手方法.我更喜欢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;
Run Code Online (Sandbox Code Playgroud)
编辑2:
我发现SetProcessDPIAware
解决了我的问题,但它在XP中不起作用
您声明您的系统以150%的字体缩放比例运行.如果您的应用程序使用DPI虚拟化运行,则此虚拟化将解释您观察到的行为.请注意1920 / 1.5 = 1280
和1080 / 1.5 = 720
.
您报告的行为的唯一合理解释是该进程在DPI虚拟化下运行.应用DPI感知清单选项将停止DPI虚拟化.因此,似乎很可能清单没有正确链接到您的应用程序,或者清单无效.
我怀疑您的应用程序可能有两个与之关联的清单.第二个将被丢弃.如果您在Delphi项目中使用默认应用程序设置,就会发生这种情况.下一步是使用资源查看器查看链接到可执行文件的实际资源.这是确定联系方式的可靠方法.
可能解决方案是使用Delphi项目选项的Application节点中的自定义清单选项并提供完整的应用程序清单.这将需要指定comctl32 v6以启用主题,requireAdministrator
选项asInvoker
和DPI感知选项.
归档时间: |
|
查看次数: |
1159 次 |
最近记录: |