diff --git a/src/display.c b/src/display.c index 67f8e546c11..efabf1c86af 100644 --- a/src/display.c +++ b/src/display.c @@ -319,6 +319,8 @@ PyImaging_DisplayModeWin32(PyObject* self, PyObject* args) /* -------------------------------------------------------------------- */ /* Windows screen grabber */ +typedef HANDLE(__stdcall* Func_SetThreadDpiAwarenessContext)(HANDLE); + PyObject* PyImaging_GrabScreenWin32(PyObject* self, PyObject* args) { @@ -329,6 +331,9 @@ PyImaging_GrabScreenWin32(PyObject* self, PyObject* args) HDC screen, screen_copy; DWORD rop; PyObject* buffer; + HANDLE dpiAwareness; + HMODULE user32; + Func_SetThreadDpiAwarenessContext SetThreadDpiAwarenessContext_function; if (!PyArg_ParseTuple(args, "|ii", &includeLayeredWindows, &all_screens)) return NULL; @@ -339,6 +344,17 @@ PyImaging_GrabScreenWin32(PyObject* self, PyObject* args) screen = CreateDC("DISPLAY", NULL, NULL, NULL); screen_copy = CreateCompatibleDC(screen); + // added in Windows 10 (1607) + // loaded dynamically to avoid link errors + user32 = LoadLibraryA("User32.dll"); + SetThreadDpiAwarenessContext_function = + (Func_SetThreadDpiAwarenessContext) + GetProcAddress(user32, "SetThreadDpiAwarenessContext"); + if (SetThreadDpiAwarenessContext_function != NULL) { + // DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE = ((DPI_CONTEXT_HANDLE)-3) + dpiAwareness = SetThreadDpiAwarenessContext_function((HANDLE) -3); + } + if (all_screens) { x = GetSystemMetrics(SM_XVIRTUALSCREEN); y = GetSystemMetrics(SM_YVIRTUALSCREEN); @@ -349,6 +365,12 @@ PyImaging_GrabScreenWin32(PyObject* self, PyObject* args) height = GetDeviceCaps(screen, VERTRES); } + if (SetThreadDpiAwarenessContext_function != NULL) { + SetThreadDpiAwarenessContext_function(dpiAwareness); + } + + FreeLibrary(user32); + bitmap = CreateCompatibleBitmap(screen, width, height); if (!bitmap) goto error;