BitBlt не работает для Office 2013

Я использую BitBlt для получения скриншотов окон на рабочем столе пользователя. Я обнаружил, что все хорошо работает для окон из большинства программ. Однако BitBlt возвращает пустые пиксели для любых окон Office 2013 (Word, Powerpoint и т. д.).

PrintWindow работает для этих окон Office 2013, но требует больше ресурсов процессора. Я бы предпочел использовать BitBlt, если это возможно.

Есть идеи, почему BitBlt не будет работать с окнами Office 2013?

Фрагмент кода ниже.

Спасибо

ОБНОВЛЕНИЕ: BitBlt(...) возвращает значение true. Изменение кода для захвата всего рабочего стола вместо appWin правильно захватывает окно Office 2013, см. этот post. Я могу захватить весь рабочий стол и извлечь нужное окно. Однако при этом теряется одна интересная вещь с новым DWM, который позволяет программному обеспечению захватывать изображения из окон, которые не находятся на переднем плане.

Есть ли лучший способ сделать это, который позволит системе как захватывать окна типа Office 2013, так и захватывать изображения из окон, не находящихся на переднем плане?

ОБНОВЛЕНИЕ 2: при выполнении BitBlt для appWin кажется, что первый BitBlt дает действительные данные пикселей, но последующие BitBlt дают пустые пиксели. Не уверен, почему, но может быть важной точкой данных.

INT texUSize = 1024;
INT texVSize = 1024;

RECT rect;
GetClientRect(appWin, &rect);
INT appW = rect.right - rect.left;
INT appH = rect.bottom - rect.top;

// create BITMAP in memory, write to texture pixels from BITMAP
HDC hdc = GetDC(appWin);
HDC hdc_App = CreateCompatibleDC(hdc);
HDC hdc_Tex = CreateCompatibleDC(hdc);
HBITMAP hbmp_App = CreateCompatibleBitmap(hdc, appW, appH);
HBITMAP hbmp_Tex = CreateCompatibleBitmap(hdc, texUSize, texVSize);
HBITMAP hbmp_AppOld = (HBITMAP)SelectObject(hdc_App, hbmp_App);
HBITMAP hbmp_TexOld = (HBITMAP)SelectObject(hdc_Tex, hbmp_Tex);

// Due to the new Desktop Window Manager, Windows Vista and Windows 7 can simply BitBlt the app window
// Windows XP has issues with BitBlt if app window is covered by a different window
if (false)//bVista7 || (GetForegroundWindow() == appWin))
{
    appOutputDebugStringf(TEXT("-- bitblting"));
    BitBlt(hdc_App, 0, 0, appW, appH, hdc, 0, 0, SRCCOPY);
}
else
{
    appOutputDebugStringf(TEXT("-- printwindow"));
    PrintWindow(appWin, hdc_App, NULL);
}

person Daktor    schedule 27.04.2015    source источник
comment
Убедитесь, что RC_BITBLT установлено в RASTERCAPS для HDC с помощью GetDeviceCaps. Если это не так, BitBlt просто не будет работать.   -  person Donnie    schedule 28.04.2015
comment
У него установлен этот флаг, спасибо за комментарий.   -  person Daktor    schedule 28.04.2015