@@ -4,6 +4,8 @@ namespace flutter {
44
55namespace {
66
7+ constexpr UINT kDefaultDpi = 96 ;
8+
79template <typename T>
810bool AssignProcAddress (HMODULE comBaseModule, const char * name, T*& outProc) {
911 outProc = reinterpret_cast <T*>(GetProcAddress (comBaseModule, name));
@@ -13,60 +15,57 @@ bool AssignProcAddress(HMODULE comBaseModule, const char* name, T*& outProc) {
1315} // namespace
1416
1517Win32DpiHelper::Win32DpiHelper () {
16- // TODO ensure that this helper works correctly on downlevel builds.
1718 user32_module_ = LoadLibraryA (" User32.dll" );
1819 if (user32_module_ == nullptr ) {
1920 return ;
2021 }
2122
22- if (!AssignProcAddress (user32_module_, " EnableNonClientDpiScaling" ,
23- enable_non_client_dpi_scaling_)) {
23+ if (AssignProcAddress (user32_module_, " GetDpiForWindow" ,
24+ get_dpi_for_window_)) {
25+ dpi_for_window_supported_ = true ;
2426 return ;
2527 }
2628
27- if (! AssignProcAddress (user32_module_, " GetDpiForWindow " ,
28- get_dpi_for_window_) ) {
29+ shlib_module_ = LoadLibraryA ( " Shcore.dll " );
30+ if (shlib_module_ == nullptr ) {
2931 return ;
3032 }
3133
32- if (!AssignProcAddress (user32_module_, " SetProcessDpiAwarenessContext" ,
33- set_process_dpi_awareness_context_)) {
34- return ;
34+ if (AssignProcAddress (shlib_module_, " GetDpiForMonitor" ,
35+ get_dpi_for_monitor_) &&
36+ AssignProcAddress (user32_module_, " MonitorFromWindow" ,
37+ monitor_from_window_)) {
38+ dpi_for_monitor_supported_ = true ;
3539 }
36-
37- permonitorv2_supported_ = true ;
3840}
3941
4042Win32DpiHelper::~Win32DpiHelper () {
4143 if (user32_module_ != nullptr ) {
4244 FreeLibrary (user32_module_);
4345 }
44- }
45-
46- bool Win32DpiHelper::IsPerMonitorV2Available () {
47- return permonitorv2_supported_;
48- }
49-
50- BOOL Win32DpiHelper::EnableNonClientDpiScaling (HWND hwnd) {
51- if (!permonitorv2_supported_) {
52- return false ;
46+ if (shlib_module_ != nullptr ) {
47+ FreeLibrary (shlib_module_);
5348 }
54- return enable_non_client_dpi_scaling_ (hwnd);
5549}
5650
57- UINT Win32DpiHelper::GetDpiForWindow (HWND hwnd) {
58- if (!permonitorv2_supported_) {
59- return false ;
51+ UINT Win32DpiHelper::GetDpi (HWND hwnd) {
52+ // GetDpiForWindow returns the DPI for any awareness mode. If not available,
53+ // fallback to a per monitor, system, or default DPI.
54+ if (dpi_for_window_supported_) {
55+ return get_dpi_for_window_ (hwnd);
6056 }
61- return get_dpi_for_window_ (hwnd);
62- }
6357
64- BOOL Win32DpiHelper::SetProcessDpiAwarenessContext (
65- DPI_AWARENESS_CONTEXT context) {
66- if (!permonitorv2_supported_) {
67- return false ;
58+ if (dpi_for_monitor_supported_) {
59+ HMONITOR monitor = monitor_from_window_ (hwnd, MONITOR_DEFAULTTONEAREST );
60+ UINT dpi_x = 0 , dpi_y = 0 ;
61+ HRESULT result =
62+ get_dpi_for_monitor_ (monitor, MDT_EFFECTIVE_DPI , &dpi_x, &dpi_y);
63+ return SUCCEEDED (result) ? dpi_x : kDefaultDpi ;
6864 }
69- return set_process_dpi_awareness_context_ (context);
70- }
7165
66+ HDC hdc = GetDC (hwnd);
67+ UINT dpi = GetDeviceCaps (hdc, LOGPIXELSX );
68+ ReleaseDC (hwnd, hdc);
69+ return dpi;
70+ }
7271} // namespace flutter
0 commit comments