From e82883aa88bfccf2669e914eab9deef6cecfd0db Mon Sep 17 00:00:00 2001 From: Matt Oliver Date: Mon, 5 Oct 2015 20:00:37 +1100 Subject: [PATCH] gdigrab: grab right desktop size if DPI in use, based on patch from Alexander Brotzge Signed-off-by: Matt Oliver --- libavdevice/gdigrab.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/libavdevice/gdigrab.c b/libavdevice/gdigrab.c index 9a185d4c79..4428a34ee7 100644 --- a/libavdevice/gdigrab.c +++ b/libavdevice/gdigrab.c @@ -235,6 +235,8 @@ gdigrab_read_header(AVFormatContext *s1) AVStream *st = NULL; int bpp; + int vertres; + int desktopvertres; RECT virtual_rect; RECT clip_rect; BITMAP bmp; @@ -263,13 +265,26 @@ gdigrab_read_header(AVFormatContext *s1) goto error; } + /* This will get the device context for the selected window, or if + * none, the primary screen */ + source_hdc = GetDC(hwnd); + if (!source_hdc) { + WIN32_API_ERROR("Couldn't get window device context"); + ret = AVERROR(EIO); + goto error; + } + bpp = GetDeviceCaps(source_hdc, BITSPIXEL); + if (hwnd) { GetClientRect(hwnd, &virtual_rect); } else { + /* desktop -- get the right height and width for scaling DPI */ + vertres = GetDeviceCaps(source_hdc, VERTRES); + desktopvertres = GetDeviceCaps(source_hdc, DESKTOPVERTRES); virtual_rect.left = GetSystemMetrics(SM_XVIRTUALSCREEN); virtual_rect.top = GetSystemMetrics(SM_YVIRTUALSCREEN); - virtual_rect.right = virtual_rect.left + GetSystemMetrics(SM_CXVIRTUALSCREEN); - virtual_rect.bottom = virtual_rect.top + GetSystemMetrics(SM_CYVIRTUALSCREEN); + virtual_rect.right = (virtual_rect.left + GetSystemMetrics(SM_CXVIRTUALSCREEN)) * desktopvertres / vertres; + virtual_rect.bottom = (virtual_rect.top + GetSystemMetrics(SM_CYVIRTUALSCREEN)) * desktopvertres / vertres; } /* If no width or height set, use full screen/window area */ @@ -299,15 +314,6 @@ gdigrab_read_header(AVFormatContext *s1) goto error; } - /* This will get the device context for the selected window, or if - * none, the primary screen */ - source_hdc = GetDC(hwnd); - if (!source_hdc) { - WIN32_API_ERROR("Couldn't get window device context"); - ret = AVERROR(EIO); - goto error; - } - bpp = GetDeviceCaps(source_hdc, BITSPIXEL); if (name) { av_log(s1, AV_LOG_INFO,