Skip to content

Commit

Permalink
Merge pull request #4000 from nulano/dpi_fix
Browse files Browse the repository at this point in the history
Fix Screengrab DPI scaling on Windows 10 version 1607+
  • Loading branch information
radarhere authored Sep 30, 2019
2 parents b36c1bc + ee5c134 commit aaf2c42
Showing 1 changed file with 22 additions and 0 deletions.
22 changes: 22 additions & 0 deletions src/display.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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;
Expand All @@ -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);
Expand All @@ -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;
Expand Down

0 comments on commit aaf2c42

Please sign in to comment.