Очень большая часть окна обрезается при захвате изображения в Windows 7 - PullRequest
0 голосов
/ 11 февраля 2011

У нас есть некоторый код внутри нашего приложения, который захватывает изображение окна и сохраняет его в файл PNG и копирует его в буфер обмена (код C ++ API).

Отлично работает на Windows XP. Он также работает в Windows 7, за исключением того, что выглядит так, как если бы несколько верхних пиксельных линий изображения были обрезаны, как если бы захваченная область не включала верхние несколько строк окна. И все же наш код четко копируется с верхней части изображения, показанного ниже.

enter image description here

(В Windows XP вы видите полный X с правой стороны плюс верхнюю границу окна)

Это какой-то аэро или другой эффект отображения в Windows 7, или есть способ это компенсировать? Или что-то в нашем коде может быть причиной этого?

Конечно, мы можем определить область окна и захватить ее из окна клиента, и захватить несколько строк выше, но как может быть строки, и это кажется произвольным.

Здесь должен быть какой-то фундаментальный недостаток или проблема?

Наш код примерно такой:

RECT wndRect;
GetWindowRect(hwnd, &wndRect);
int Width = wndRect.right - wndRect.left;
int Height = wndRect.bottom - wndRect.top;
BYTE *pBits = 0;
BITMAPINFO bmpinfo = {sizeof(BITMAPINFO)};
bmpinfo.bmiHeader.biWidth = Width;
bmpinfo.bmiHeader.biHeight = Height;
bmpinfo.bmiHeader.biPlanes = 1;
bmpinfo.bmiHeader.biBitCount = 24;
bmpinfo.bmiHeader.biCompression = BI_RGB;
HBITMAP hBmp = CreateDIBSection(NULL, &bmpinfo, DIB_RGB_COLORS, (void**)&pBits, NULL, 0);
HDC hWndDC = GetWindowDC(hwnd);
HDC hDC = CreateCompatibleDC(hWndDC);
HBITMAP hOldBmp = (HBITMAP)SelectObject(hDC, hBmp);
BitBlt(hDC, 0, 0, Width, Height, hWndDC, 0, 0, SRCCOPY);

1 Ответ

0 голосов
/ 11 августа 2011

Однажды я прочитал, что координаты RECT обрезают нижний пиксель, но никогда не слышали о верхнем пикселе ... Возможно, где-то есть вызов API для получения размера декорации окна или нет.

Также может помочь GetDCEx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...