我添加了一个对SetProcessDpiAwareness窗口函数的调用,作为我的Delphi XE7应用程序中的第一件事(在dynamic加载shcore DLL之后)。 我知道最好使用一个清单来设置DPIAware的价值,我已经分开工作,并将最终使用它。 然而,在开发过程中,我想使用命令行参数来设置DPIAwareness值,否则我不得不重build应用程序来改变这个状态。
问题是SetProcessDpiAwareness返回错误代码$ 800700A0。 这在function描述中没有记载,代码是什么意思?
啊我find了,由于看到参数的答案,我已经宣布函数types错了,我有:
TSetDPIFunc =函数(const PROCESS_DPI_AWARENESS):HRESULT; STDCALL;
但PROCESS_DPI_AWARENESS没有被定义为一个枚举。 改为以下,现在工作正常:
TSetDPIFunc =函数(const x:Integer):HRESULT; STDCALL;
0x8007XXXX
是使用HRESULT_FROM_WIN32()
封装在COM HRESULT
的Win32错误代码 。 WIN32_FROM_HRESULT(0x800700A0)
给出0xA0
,即错误代码160,这是ERROR_BAD_ARGUMENTS
(“一个或多个输入参数不正确”)。
尽管你得到这个错误对我来说没有意义,因为这个函数甚至没有任何参数 !
所以我能想到的唯一的事情就是, 这里所描述的问题有一些问题 ,假设你自己改变了DPI设置进行测试,然后失败了:
因此,为了使SetProcessDPIAware(以及相关方法:SetProcessDpiAwareness()和显示为true)正常工作,必须在更改DPI设置之后并在运行程序之前注销并重新登录。
顺便说一句,如果这是有帮助的:为了测试不需要完全重建的清单,可以使用mt.exe
从命令行将清单附加到应用程序。