Files
PowerToys/src/common/Display/dpi_aware.cpp

114 lines
3.5 KiB
C++
Raw Normal View History

#include "dpi_aware.h"
#include "monitors.h"
#include <ShellScalingApi.h>
#include <array>
namespace DPIAware
{
HRESULT GetScreenDPIForMonitor(HMONITOR targetMonitor, UINT& dpi)
2019-12-17 12:32:56 +03:00
{
if (targetMonitor != nullptr)
2019-12-17 12:32:56 +03:00
{
UINT dummy = 0;
return GetDpiForMonitor(targetMonitor, MDT_EFFECTIVE_DPI, &dpi, &dummy);
2019-12-17 12:32:56 +03:00
}
else
{
dpi = DPIAware::DEFAULT_DPI;
2019-12-17 12:32:56 +03:00
return E_FAIL;
}
}
HRESULT GetScreenDPIForWindow(HWND hwnd, UINT& dpi)
2019-12-17 12:32:56 +03:00
{
auto targetMonitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
return GetScreenDPIForMonitor(targetMonitor, dpi);
}
HRESULT GetScreenDPIForPoint(POINT point, UINT& dpi)
{
auto targetMonitor = MonitorFromPoint(point, MONITOR_DEFAULTTONEAREST);
return GetScreenDPIForMonitor(targetMonitor, dpi);
}
HRESULT GetScreenDPIForCursor(UINT& dpi)
{
HMONITOR targetMonitor = nullptr;
POINT currentCursorPos{ 0 };
if (GetCursorPos(&currentCursorPos))
2019-12-17 12:32:56 +03:00
{
targetMonitor = MonitorFromPoint(currentCursorPos, MONITOR_DEFAULTTOPRIMARY);
2019-12-17 12:32:56 +03:00
}
return GetScreenDPIForMonitor(targetMonitor, dpi);
2019-12-17 12:32:56 +03:00
}
2019-12-17 12:32:56 +03:00
void Convert(HMONITOR monitor_handle, int& width, int& height)
{
if (monitor_handle == NULL)
{
const POINT ptZero = { 0, 0 };
monitor_handle = MonitorFromPoint(ptZero, MONITOR_DEFAULTTOPRIMARY);
}
2019-12-17 12:32:56 +03:00
UINT dpi_x, dpi_y;
if (GetDpiForMonitor(monitor_handle, MDT_EFFECTIVE_DPI, &dpi_x, &dpi_y) == S_OK)
{
width = width * static_cast<int>(dpi_x) / DEFAULT_DPI;
height = height * static_cast<int>(dpi_y) / DEFAULT_DPI;
}
}
void ConvertByCursorPosition(int& width, int& height)
{
HMONITOR targetMonitor = nullptr;
POINT currentCursorPos{ 0 };
if (GetCursorPos(&currentCursorPos))
{
targetMonitor = MonitorFromPoint(currentCursorPos, MONITOR_DEFAULTTOPRIMARY);
}
Convert(targetMonitor, width, height);
}
void InverseConvert(HMONITOR monitor_handle, int& width, int& height)
{
if (monitor_handle == NULL)
{
const POINT ptZero = { 0, 0 };
monitor_handle = MonitorFromPoint(ptZero, MONITOR_DEFAULTTOPRIMARY);
}
UINT dpi_x, dpi_y;
if (GetDpiForMonitor(monitor_handle, MDT_EFFECTIVE_DPI, &dpi_x, &dpi_y) == S_OK)
{
width = width * DEFAULT_DPI / static_cast<int>(dpi_x);
height = height * DEFAULT_DPI / static_cast<int>(dpi_y);
2019-12-17 12:32:56 +03:00
}
}
2019-12-17 12:32:56 +03:00
void EnableDPIAwarenessForThisProcess()
{
SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
}
AwarenessLevel GetAwarenessLevel(DPI_AWARENESS_CONTEXT system_returned_value)
{
2019-12-17 12:32:56 +03:00
const std::array levels{ DPI_AWARENESS_CONTEXT_UNAWARE,
DPI_AWARENESS_CONTEXT_SYSTEM_AWARE,
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE,
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2,
DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED };
for (size_t i = 0; i < size(levels); ++i)
{
2019-12-17 12:32:56 +03:00
if (AreDpiAwarenessContextsEqual(levels[i], system_returned_value))
{
return static_cast<DPIAware::AwarenessLevel>(i);
2019-12-17 12:32:56 +03:00
}
}
return AwarenessLevel::UNAWARE;
}
}