From 2425033a2fd70dbe05087cb6a187b0d4702ab252 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 22 May 2021 06:07:11 +0200 Subject: [PATCH] #93 support SetProcessDpiAwarenessContext for newer versions of windows --- inc/dllmain.h | 11 +++++++++++ src/dllmain.c | 40 ++++++++++++++++++++++------------------ 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/inc/dllmain.h b/inc/dllmain.h index b323a6a..f23fef6 100644 --- a/inc/dllmain.h +++ b/inc/dllmain.h @@ -16,4 +16,15 @@ typedef enum PROCESS_DPI_AWARENESS { PROCESS_PER_MONITOR_DPI_AWARE = 2 } PROCESS_DPI_AWARENESS; +DECLARE_HANDLE(DPI_AWARENESS_CONTEXT); +#define DPI_AWARENESS_CONTEXT_UNAWARE ((DPI_AWARENESS_CONTEXT)-1) +#define DPI_AWARENESS_CONTEXT_SYSTEM_AWARE ((DPI_AWARENESS_CONTEXT)-2) +#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE ((DPI_AWARENESS_CONTEXT)-3) +#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((DPI_AWARENESS_CONTEXT)-4) +#define DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED ((DPI_AWARENESS_CONTEXT)-5) + +typedef HRESULT(__stdcall* SETPROCESSDPIAWERENESSPROC)(PROCESS_DPI_AWARENESS); +typedef BOOL(__stdcall* SETPROCESSDPIAWAREPROC)(); +typedef BOOL(__stdcall* SETPROCESSDPIAWARENESSCONTEXTPROC)(DPI_AWARENESS_CONTEXT); + #endif diff --git a/src/dllmain.c b/src/dllmain.c index 170c624..14572c9 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -61,14 +61,25 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) } BOOL set_dpi_aware = FALSE; - HMODULE hshcore = GetModuleHandle("shcore.dll"); - - if (hshcore) - { - typedef HRESULT(__stdcall* SETPROCESSDPIAWERENESSPROC)(PROCESS_DPI_AWARENESS value); + HMODULE shcore_dll = GetModuleHandle("shcore.dll"); + HMODULE user32_dll = GetModuleHandle("user32.dll"); + + if (user32_dll) + { + SETPROCESSDPIAWARENESSCONTEXTPROC set_awareness_context = + (SETPROCESSDPIAWARENESSCONTEXTPROC)GetProcAddress(user32_dll, "SetProcessDpiAwarenessContext"); + + if (set_awareness_context) + { + set_dpi_aware = set_awareness_context(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2); + } + } + + if (!set_dpi_aware && shcore_dll) + { SETPROCESSDPIAWERENESSPROC set_awareness = - (SETPROCESSDPIAWERENESSPROC)GetProcAddress(hshcore, "SetProcessDpiAwareness"); + (SETPROCESSDPIAWERENESSPROC)GetProcAddress(shcore_dll, "SetProcessDpiAwareness"); if (set_awareness) { @@ -78,20 +89,13 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) } } - if (!set_dpi_aware) + if (!set_dpi_aware && user32_dll) { - HMODULE huser32 = GetModuleHandle("user32.dll"); - - if (huser32) - { - typedef BOOL(__stdcall* SETPROCESSDPIAWAREPROC)(); + SETPROCESSDPIAWAREPROC set_aware = + (SETPROCESSDPIAWAREPROC)GetProcAddress(user32_dll, "SetProcessDPIAware"); - SETPROCESSDPIAWAREPROC set_aware = - (SETPROCESSDPIAWAREPROC)GetProcAddress(huser32, "SetProcessDPIAware"); - - if (set_aware) - set_aware(); - } + if (set_aware) + set_aware(); } timeBeginPeriod(1);