我使用BitBlt在用户桌面上获取Windows的屏幕截图。我发现大多数程序都适用于Windows。但是,BitBlt返回任何Office 2013窗口(Word,Powerpoint等)的空白像素。
PrintWindow适用于这些Office 2013窗口,但它具有更高的处理器开销。如果可能,我宁愿使用BitBlt。
为什么BitBlt无法与Office 2013窗口一起使用?
下面的代码段。
由于
UPDATE: BitBlt(...)返回true。更改代码以捕获整个桌面而不是appWin会正确捕获Office 2013窗口,请参阅此post。我可以捕获整个桌面并提取所需的窗口。然而,这使用新的DWM失去了一个很酷的东西,它允许软件从不在前台的窗口捕获图像。
是否有更好的方法可以让系统捕获Office 2013类型的窗口并从不在前台的窗口捕获图像?
更新2:在appWin上执行BitBlt时,看起来第一个BitBlt会提供有效的像素数据,但后续BitBlts会显示空白像素。不确定原因,但可能是一个重要的数据点。
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);
}