Я использую 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);
}
RC_BITBLT
установлено вRASTERCAPS
дляHDC
с помощьюGetDeviceCaps
. Если это не так,BitBlt
просто не будет работать. - person Donnie   schedule 28.04.2015