mirror of
https://github.com/microsoft/PowerToys.git
synced 2024-12-15 20:19:17 +08:00
f3e25ae3e6
* Use DPIAware::DEFAULT_DPI * Make runner DPI-unaware, since it doesn't need to use a Per Monitor V2 DPI. * Programmatically enable "Per Monitor V2 DPI" for the runner proccess and use a separate DPI-unaware thread for the corresponding API calls * Increase PCH memory limit for settings project * Address review issues * Draw zoneWindows properly scaled
45 lines
1.3 KiB
C++
45 lines
1.3 KiB
C++
#include "pch.h"
|
|
#include "dpi_aware.h"
|
|
#include "monitors.h"
|
|
#include <ShellScalingApi.h>
|
|
|
|
HRESULT DPIAware::GetScreenDPIForWindow(HWND hwnd, UINT &dpi_x, UINT &dpi_y) {
|
|
auto monitor_handle = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
|
|
dpi_x = 0;
|
|
dpi_y = 0;
|
|
if (monitor_handle != nullptr) {
|
|
return GetDpiForMonitor(monitor_handle, MDT_EFFECTIVE_DPI, &dpi_x, &dpi_y);
|
|
} else {
|
|
return E_FAIL;
|
|
}
|
|
}
|
|
|
|
HRESULT DPIAware::GetScreenDPIForPoint(POINT p, UINT& dpi_x, UINT& dpi_y) {
|
|
auto monitor_handle = MonitorFromPoint(p, MONITOR_DEFAULTTONEAREST);
|
|
dpi_x = 0;
|
|
dpi_y = 0;
|
|
if (monitor_handle != nullptr) {
|
|
return GetDpiForMonitor(monitor_handle, MDT_EFFECTIVE_DPI, &dpi_x, &dpi_y);
|
|
}
|
|
else {
|
|
return E_FAIL;
|
|
}
|
|
}
|
|
|
|
void DPIAware::Convert(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 * dpi_x / DEFAULT_DPI;
|
|
height = height * dpi_y / DEFAULT_DPI;
|
|
}
|
|
}
|
|
|
|
void DPIAware::EnableDPIAwarenessForThisProcess() {
|
|
SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
|
|
}
|