在Windows 7的高DPI模式下尝试使用我的Delphi 2010应用程序更多用户我已经尝试了几种方法来重新检索PixelsPerInch并与96进行比较。唉,无论我尝试什么,我总是得到96.我的问题是:< / p>
以下是我尝试的内容
dpiX := Form1.PixelsPerInch
和
dpiX := Screen.PixelsPerInch
最后:
D2DFactoryOptions.DebugLevel := D2D1_DEBUG_LEVEL_NONE;
pD2DFactoryOptions := @D2DFactoryOptions;
if D2D1CreateFactory(
D2D1_FACTORY_TYPE_SINGLE_THREADED,
IID_ID2D1Factory,
PD2DFactoryOptions,
D2DFactory
) <> S_OK then exit;
D2DFactory.GetDesktopDpi(dpiX, dpiY)
小心猜?这是正确的dpiX是100%,125%和150%的常数96
请建议。
答案 0 :(得分:9)
我认为您需要将您的应用程序标记为高DPI感知,方法是将其包含在您的应用程序清单中:
<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>
有关宣布DPI意识的详细信息,请here。
您好像正在回归所谓的DPI Virtualization。
答案 1 :(得分:4)
您的申请是DPI aware吗?如果没有,请声明。
修改强>
如果您真的只想检测当前设置,但又不想为整个应用程序启用DPI感知,那么最好的方法是编写一个小的(dpi感知)应用程序,唯一的工作就是做这个检测。运行它并将结果传输到您的主应用程序。或者提供一个启动程序,它检测并运行主应用程序,将设置作为命令行参数。这当然只有在没有其他API或“秘密”调用时,即使运行DPI虚拟化,您的应用程序也可以确定该设置。
答案 2 :(得分:4)
您可以在
查看注册表值AppliedDPIHKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\AppliedDPI
感谢Andreas Rejbrand。
答案 3 :(得分:2)
因为Delphi的IDE甚至没有提供一种方法来标记您的应用程序DPI感知,因为David已经向您展示了您需要创建自己的清单并向其添加内容,并且因为进入DPI Aware模式意味着您必须你自己处理了很多工作,你可能会发现它不值得。在大约100个没有结果的工作时间之后,我当然放弃了这一尝试。
如果您的应用使用了100%通用控件,并且您不介意重新处理所有其他应用程序直到它们正常工作,那么请继续使用。
在DPI虚拟化关闭后,即使是基于公共控件的控件(如Page控件)似乎也无法在高dpi环境中正常工作(至少它们的VCL包装器不起作用)。
简短版本:这些天最好的做法是在VCL应用程序中根本不用费心,除非你绝对必须,然后,你也可以留出时间重写和修复VCL和每个第三方控件中的每个控件,解决故障。
答案 4 :(得分:2)
请勿回复用户的 DPI 设置。
回复用户的字体偏好设置。
如果您只回复用户的DPI设置,那么如果用户使用比您在设计时使用的字体更大的字体,则表单不会变大,例如
通过回复字体大小(以像素为单位),您可以免费获得高DPI支持(并且您是一名优秀的开发人员!):
13px
Windows 2000 / XP (你设计的是什么)15px
(将您设计的表格缩放115%)15px
Windows Vista / 7 (将您设计的表格缩放115%)16px
我的家用机器(将您的表格缩放123%)16px
我的工作机器(将您设计的表格缩放123%)您希望关闭所有表单的Scaled
属性;所以他们不会尝试响应dpi设置。您希望.NET WinForms等效于AutoScaleMode.Font
。
是的,一旦您已缴纳税款,并且可以处理不同的DPI设置,请使用清单声明您的应用程序 highDpi aware - 正如其他答案所示。
不要使用SetProcessDPIAware
,因为DLLs that you depend on who already read the current DPI可能为时已晚:
注意如果DLL在初始化期间缓存dpi设置,则SetProcessDPIAware会受到可能的竞争条件的影响。因此,建议通过应用程序(.exe)清单而不是通过调用SetProcessDPIAware来设置dpi-aware。
答案 5 :(得分:0)
如果有人帮助, 我注意到Screen-&gt; PrimaryMonitor-&gt; PixelsPerInch会根据显示缩放而改变。