抱歉,我没有提供具体的问题标题。
我的开发环境是带有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?
答案 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或更高版本中使用