Windows DPI相关问题

时间:2015-10-15 19:55:28

标签: windows cursor resolution dpi

抱歉,我没有提供具体的问题标题。

我的开发环境是带有Visual Studio 2010的Windows 7.该产品的目标是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?

2 个答案:

答案 0 :(得分:0)

对于问题1,你试过这个吗?

monitorhandle = MonitorFromWindow(winH, MONITOR_DEFAULTTONEAREST)

winH是程序窗口的句柄

MONITOR_DEFAULTTONEAREST = 2

然后:

GetDpiForMonitor(monitorhandle, MDT_EFFECTIVE_DPI, PointerToX, PointerToY)

MDT_EFFECTIVE_DPI = 0

这将检索PointerToX和PointerToY

中的DPI设置

如果您需要Windows缩放值(当然百分比为100),则可以除以96

我很惊讶如果在开始时设置SetProcessDpiAwareness(1)没有帮助,因为这应该不需要设置兼容性标志,但我不希望它在程序中自动扩展GUI - 因此回答问题1!

答案 1 :(得分:0)

问题是您的应用程序不知道DPI 要使其意识到,您需要在应用程序的清单文件中将ngOnInit() { //This gets the products from the API this.drinkSubscription = this.drinkService.getAllDrinks().switchMap(drinks => { this.allDrinks = drinks; return this.route.params) }) .switchMap((params: Params) => { const filteredDrinks = this.filterService.filter(drinks, params['filter'], params['name']); return this.sorter.initialize(filteredDrinks) }) .switchMap(sortedDrinks => this.pagerService.initializePaginatedItems(sortedDrinks, 10, 5)) .subscribe(pager => { this.pager = pager; this.paginatedDrinks = pager.paginatedItems; }); }); }); }); 标记设为TRUE

在这种情况下,您仍然可以获得实际的分辨率

这是您可以怎么做

<dpiaware>

在MSDN中未提及DESKTOPHORZRES和DESKTOPVERTRES索引,但它们会为您提供实际的宽度和高度

有一个函数actualWidth = GetDeviceCaps(hdc, DESKTOPHORZRES); actualHeight = GetDeviceCaps(hdc, DESKTOPVERTRES); 可为您提供DPI的实际值 但只能在Windows 10或更高版本中使用