BitBlt不适用于Office 2013

时间:2015-04-27 21:09:48

标签: c++ windows bitblt

我使用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);
}

0 个答案:

没有答案