16constexpr UINT kEffectiveDpiMonitorType = 0;
22bool AssignProcAddress(
HMODULE comBaseModule,
const char*
name, T*& outProc) {
23 outProc =
reinterpret_cast<T*
>(GetProcAddress(comBaseModule,
name));
24 return *outProc !=
nullptr;
39 UINT GetDpiForWindow(HWND);
46 using GetDpiForWindow_ =
UINT __stdcall(HWND);
47 using GetDpiForMonitor_ = HRESULT __stdcall(HMONITOR hmonitor,
51 using EnableNonClientDpiScaling_ =
BOOL __stdcall(HWND hwnd);
53 GetDpiForWindow_* get_dpi_for_window_ =
nullptr;
54 GetDpiForMonitor_* get_dpi_for_monitor_ =
nullptr;
55 EnableNonClientDpiScaling_* enable_non_client_dpi_scaling_ =
nullptr;
57 HMODULE user32_module_ =
nullptr;
58 HMODULE shlib_module_ =
nullptr;
59 bool dpi_for_window_supported_ =
false;
60 bool dpi_for_monitor_supported_ =
false;
65DpiHelper::DpiHelper() {
66 if ((user32_module_ = LoadLibraryA(
"User32.dll")) !=
nullptr) {
67 dpi_for_window_supported_ = (AssignProcAddress(
68 user32_module_,
"GetDpiForWindow", get_dpi_for_window_));
70 if ((shlib_module_ = LoadLibraryA(
"Shcore.dll")) !=
nullptr) {
71 dpi_for_monitor_supported_ = AssignProcAddress(
72 shlib_module_,
"GetDpiForMonitor", get_dpi_for_monitor_);
76DpiHelper::~DpiHelper() {
77 if (user32_module_ !=
nullptr) {
78 FreeLibrary(user32_module_);
80 if (shlib_module_ !=
nullptr) {
81 FreeLibrary(shlib_module_);
85UINT DpiHelper::GetDpiForWindow(HWND hwnd) {
89 if (dpi_for_window_supported_ && hwnd !=
nullptr) {
90 return get_dpi_for_window_(hwnd);
93 if (dpi_for_monitor_supported_) {
94 HMONITOR monitor =
nullptr;
95 if (hwnd !=
nullptr) {
96 monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTOPRIMARY);
100 HDC hdc = GetDC(hwnd);
101 UINT dpi = GetDeviceCaps(hdc, LOGPIXELSX);
102 ReleaseDC(hwnd, hdc);
106UINT DpiHelper::GetDpiForMonitor(HMONITOR monitor) {
107 if (dpi_for_monitor_supported_) {
108 if (monitor ==
nullptr) {
109 const POINT target_point = {0, 0};
110 monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTOPRIMARY);
112 UINT dpi_x = 0, dpi_y = 0;
114 get_dpi_for_monitor_(monitor, kEffectiveDpiMonitorType, &dpi_x, &dpi_y);
122DpiHelper* GetHelper() {
123 static DpiHelper* dpi_helper =
new DpiHelper();
129 return GetHelper()->GetDpiForWindow(hwnd);
133 return GetHelper()->GetDpiForMonitor(monitor);
#define FML_DISALLOW_COPY_AND_ASSIGN(TypeName)
UINT GetDpiForHWND(HWND hwnd)
UINT GetDpiForMonitor(HMONITOR monitor)
DEF_SWITCHES_START aot vmservice shared library name
constexpr UINT kDefaultDpi