diff --git a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp index 22581530fa..94ffa0f54e 100644 --- a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp @@ -373,6 +373,32 @@ static EnableNonClientDPIScalingFunc enableNonClientDPIScaling static bool hasCheckedForDPIAwareness = false; +static void loadDPIAwarenessFunctions() +{ + setProcessDPIAware = (SetProcessDPIAwareFunc) getUser32Function ("SetProcessDPIAware"); + + constexpr auto shcore = "SHCore.dll"; + LoadLibraryA (shcore); + const auto shcoreModule = GetModuleHandleA (shcore); + + if (shcoreModule == nullptr) + return; + + getDPIForMonitor = (GetDPIForMonitorFunc) GetProcAddress (shcoreModule, "GetDpiForMonitor"); + setProcessDPIAwareness = (SetProcessDPIAwarenessFunc) GetProcAddress (shcoreModule, "SetProcessDpiAwareness"); + + #if JUCE_WIN_PER_MONITOR_DPI_AWARE + getDPIForWindow = (GetDPIForWindowFunc) getUser32Function ("GetDpiForWindow"); + getProcessDPIAwareness = (GetProcessDPIAwarenessFunc) GetProcAddress (shcoreModule, "GetProcessDpiAwareness"); + getWindowDPIAwarenessContext = (GetWindowDPIAwarenessContextFunc) getUser32Function ("GetWindowDpiAwarenessContext"); + setThreadDPIAwarenessContext = (SetThreadDPIAwarenessContextFunc) getUser32Function ("SetThreadDpiAwarenessContext"); + getThreadDPIAwarenessContext = (GetThreadDPIAwarenessContextFunc) getUser32Function ("GetThreadDpiAwarenessContext"); + getAwarenessFromDPIAwarenessContext = (GetAwarenessFromDpiAwarenessContextFunc) getUser32Function ("GetAwarenessFromDpiAwarenessContext"); + setProcessDPIAwarenessContext = (SetProcessDPIAwarenessContextFunc) getUser32Function ("SetProcessDpiAwarenessContext"); + enableNonClientDPIScaling = (EnableNonClientDPIScalingFunc) getUser32Function ("EnableNonClientDpiScaling"); + #endif +} + static void setDPIAwareness() { if (hasCheckedForDPIAwareness) @@ -383,45 +409,19 @@ static void setDPIAwareness() if (! JUCEApplicationBase::isStandaloneApp()) return; - const auto shcore = "SHCore.dll"; - LoadLibraryA (shcore); - const auto shcoreModule = GetModuleHandleA (shcore); - - if (shcoreModule != nullptr) - { - getDPIForMonitor = (GetDPIForMonitorFunc) GetProcAddress (shcoreModule, "GetDpiForMonitor"); - - #if JUCE_WIN_PER_MONITOR_DPI_AWARE - getDPIForWindow = (GetDPIForWindowFunc) getUser32Function ("GetDpiForWindow"); - getProcessDPIAwareness = (GetProcessDPIAwarenessFunc) GetProcAddress (shcoreModule, "GetProcessDpiAwareness"); - getWindowDPIAwarenessContext = (GetWindowDPIAwarenessContextFunc) getUser32Function ("GetWindowDpiAwarenessContext"); - setThreadDPIAwarenessContext = (SetThreadDPIAwarenessContextFunc) getUser32Function ("SetThreadDpiAwarenessContext"); - getThreadDPIAwarenessContext = (GetThreadDPIAwarenessContextFunc) getUser32Function ("GetThreadDpiAwarenessContext"); - getAwarenessFromDPIAwarenessContext = (GetAwarenessFromDpiAwarenessContextFunc) getUser32Function ("GetAwarenessFromDpiAwarenessContext"); - setProcessDPIAwareness = (SetProcessDPIAwarenessFunc) GetProcAddress (shcoreModule, "SetProcessDpiAwareness"); - setProcessDPIAwarenessContext = (SetProcessDPIAwarenessContextFunc) getUser32Function ("SetProcessDpiAwarenessContext"); - - if (setProcessDPIAwarenessContext != nullptr - && setProcessDPIAwarenessContext (DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2)) - return; - - enableNonClientDPIScaling = (EnableNonClientDPIScalingFunc) getUser32Function ("EnableNonClientDpiScaling"); - - if (setProcessDPIAwareness != nullptr && enableNonClientDPIScaling != nullptr - && SUCCEEDED (setProcessDPIAwareness (DPI_Awareness::DPI_Awareness_Per_Monitor_Aware))) - return; - #endif + loadDPIAwarenessFunctions(); - if (setProcessDPIAwareness == nullptr) - setProcessDPIAwareness = (SetProcessDPIAwarenessFunc) GetProcAddress (shcoreModule, "SetProcessDpiAwareness"); + if (setProcessDPIAwarenessContext != nullptr + && setProcessDPIAwarenessContext (DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2)) + return; - if (setProcessDPIAwareness != nullptr && getDPIForMonitor != nullptr - && SUCCEEDED (setProcessDPIAwareness (DPI_Awareness::DPI_Awareness_System_Aware))) - return; - } + if (setProcessDPIAwareness != nullptr && enableNonClientDPIScaling != nullptr + && SUCCEEDED (setProcessDPIAwareness (DPI_Awareness::DPI_Awareness_Per_Monitor_Aware))) + return; - // fallback for pre Windows 8.1 - equivalent to Process_System_DPI_Aware - setProcessDPIAware = (SetProcessDPIAwareFunc) getUser32Function ("SetProcessDPIAware"); + if (setProcessDPIAwareness != nullptr && getDPIForMonitor != nullptr + && SUCCEEDED (setProcessDPIAwareness (DPI_Awareness::DPI_Awareness_System_Aware))) + return; if (setProcessDPIAware != nullptr) setProcessDPIAware(); @@ -436,6 +436,9 @@ static bool isPerMonitorDPIAwareProcess() { setDPIAwareness(); + if (! JUCEApplication::isStandaloneApp()) + return false; + if (getProcessDPIAwareness == nullptr) return false;