SetProcessDPIAware, похоже, не работает под Windows 10

Я пытаюсь получить реальное разрешение экрана (в пикселях) в приложении Windows C ++. При изменении настройки windows dpi я получаю виртуальное (отрегулированное) разрешение вместо реального. Я попытался использовать SetProcessDPIAware, SetProcessDpiAwareness (со всеми тремя перечисленными значениями в качестве аргументов) и истинную настройку в манифесте. Во всех трех случаях код работает нормально (т.е. показывает реальное разрешение) на моем компьютере с Windows 7, но не на Win 10 (здесь он игнорирует настройку DPI Aware и возвращает настроенное разрешение).

#define WIN32_LEAN_AND_MEAN  // Exclude rarely-used stuff from Windows headers

// Windows Header Files:
#include <windows.h>
#include <winuser.h>
#include <VersionHelpers.h>
#include <ShellScalingAPI.h>
#include <stdlib.h>
#include <stdio.h>

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR     lpCmdLine,
int       nCmdShow)
{
char *cBuffer2 ;

cBuffer2 = (char *)malloc(3000) ;
if (IsWindowsVistaOrGreater())
{
//    SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE);
int result = SetProcessDPIAware();

sprintf(cBuffer2,"SetProcessDPIAware() result: [%i]\n",result) ;

int height = GetSystemMetrics(SM_CYSCREEN);
int width = GetSystemMetrics(SM_CXSCREEN);
sprintf(cBuffer2,"%s#1:\nHeight: [%i]\nwidth: [%i]\n",cBuffer2,height,width) ;HWND hwnd = (HWND)atoi(lpCmdLine) ;
HMONITOR monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
MONITORINFO info;
info.cbSize = sizeof(MONITORINFO);
GetMonitorInfo(monitor, &info);
int monitor_width = info.rcMonitor.right - info.rcMonitor.left;
int monitor_height = info.rcMonitor.bottom - info.rcMonitor.top;
sprintf(cBuffer2,"%s#2:\nHeight: [%i]\nwidth: [%i]\n",cBuffer2,monitor_height,monitor_width) ;

}

MessageBox(0,cBuffer2,"SHOWRES.EXE",MB_OK) ;
return 0 ;
}

Манифест, который я попытался использовать, следующий:

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
</assembly>

Есть идеи?

7

Решение

Я наконец-то узнал, что происходит, с помощью Джонатана Поттера и Бармака Шемирани: Windows 10, в отличие от предыдущих версий Windows, позволяет пользователю изменять настройки dpi «на лету», без необходимости выходить из системы и снова входить в систему. , Я проводил тесты на машине с win 10, которая обычно имеет стандартные (100%) настройки. Поэтому я бы изменил настройку на 150%, запустил приложение и получил неправильные результаты.

Ответы Джонатана и Бармака показали, что в настройках конкретного компьютера есть что-то, а не программа или win 10 вообще, что вызывает мои проблемы. Поэтому я попробовал следующее:

- changed DPI settings to 150%
- logged out
- logged in again
- ran the program

И я получил правильные результаты (реальное разрешение экрана, против настроенного).

Таким образом, кажется, что для правильной работы SetProcessDPIAware (и связанных с ним подходов: SetProcessDpiAwareness () и манифеста с true) необходимо выйти из системы и войти снова после изменения настройки DPI и перед запуском программы.

Еще раз спасибо, Джонатан и Бармак!

9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]