2015-10-15 56 views
0

对不起,我没有提出具体的问题标题。Windows DPI相关问题

我的开发环境是Windows 7和Visual Studio 2010的产品目标为Windows 7,8和10

问题1: 我怎么能得到当前DPI设置?

下面的代码总是会返回96,这是100%DPI比例。

_dpiX = GetDeviceCaps(hdc, LOGPIXELSX); 

问题2: 我怎么能得到实际的分辨率?

我试图用不同的选项使用GetSystemMetrics,他们都返回相同的值,这是缩放的分辨率。例如,实际分辨率为1920 * 1080和175%DPI,它们都返回1097 * 617。

GetSystemMetrics(SM_CXFULLSCREEN) 
GetSystemMetrics(SM_CXSCREEN) 
GetSystemMetrics(SM_CXVIRTUALSCREEN) 

问题3: 我可以设置应用程序不使用DPI可视化功能?

我们有一个解决方法,在属性 - >兼容性中勾选'禁用高DPI设置的显示比例缩放'选项并使用'所有用户的更改设置'。我已经在Visual Studio中将项目DPIAwareness设置为true,但它什么也没有做。

编辑:有人说,如果产品设置为DPI意识,它不会得到DPI可视化。就我而言,这是一个GUI程序,将一些命令参数传递给另一个可执行文件。我在我的项目中将可执行文件DPIAwareness设置为true。但是GUI没有做任何事情。因此,如果GUI不是DPI,并且启动了其他进程,其他进程是否也不知道DPI?

+0

只要你不回答问题3,你就不会在乎1和2.很多很多方法可以让你自己找到这个,Google“windows启用dpiawareness”。 –

+0

事实是,如果我可以解决问题3,我可能只是解决问题。关于问题3的核心思想是如何在我的项目中禁用DPI可视化。有人说将DPIAwareness设置为true会禁用它。但它似乎并不奏效。 – Jerry

回答

0

问题1,你有没有试过?

monitorhandle = MonitorFromWindow(winH, MONITOR_DEFAULTTONEAREST) 

winH是你的程序的窗口的句柄

MONITOR_DEFAULTTONEAREST = 2

则:

GetDpiForMonitor(monitorhandle, MDT_EFFECTIVE_DPI, PointerToX, PointerToY) 

MDT_EFFECTIVE_DPI = 0

这将检索PointerToX的DPI设置和PointerToY

然后,您可以96分,如果你需要使用Windows缩放值(* 100场的百分比)

我感到惊讶,如果设置SetProcessDpiAwareness(1)在一开始并没有帮助为应删除需要设置兼容性标志,但我不希望它在您的程序中自动扩展GUI - 因此问题1的答案!