Я использую BitBlt, чтобы получить скриншоты окон на рабочем столе пользователя. Я обнаружил, что все работает хорошо для окон из большинства программ. Однако BitBlt возвращает пустые пиксели для любых окон Office 2013 (Word, Powerpoint и т. Д.).
PrintWindow работает для этих окон Office 2013, но имеет более высокую нагрузку на процессор. Я бы предпочел использовать BitBlt, если это возможно.
Есть идеи, почему BitBlt не будет работать с окнами Office 2013?
Фрагмент кода ниже.
Спасибо
ОБНОВИТЬ: BitBlt (…) возвращает true. Изменение кода для захвата всего рабочего стола вместо appWin правильно захватывает окно Office 2013, см. Это сообщение. Я могу захватить весь рабочий стол и извлечь нужное окно. Тем не менее, это теряет одну классную вещь с новым 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);
}
Задача ещё не решена.