BitBlt无法正确捕获标题栏

时间:2014-11-06 04:15:46

标签: winapi visual-c++ gdi+ gdi

我使用下面的代码使用bltblt捕获窗口的屏幕截图。但是,标题栏在捕获的屏幕截图中显示为全黑。我在Windows 8.1上运行代码。有没有办法可以正确捕捉标题栏。

// Retrieve the handle to a display device context for the sourceWindow
hdcScreen = GetDC(ss);
// Retrieve the handle to a display device context for the dest window
hdcWindow = GetDC(hWnd);

//Get the client area for size calculation
RECT rcClient;
GetWindowRect(ss, &rcClient);

if (!BitBlt(hdcWindow,
    0, 0,
    rcClient.right - rcClient.left, rcClient.bottom - rcClient.top,
    hdcScreen,
    0, 0,
    SRCCOPY|CAPTUREBLT))
{
    MessageBox(hWnd, L"BitBlt has failed", L"Failed", MB_OK);
    goto done;
}

Screenshot, the title bar is highlighted by a read rectangular box.

编辑: 我正在显示屏幕截图的窗口将覆盖整个桌面,并将不断更新窗口后面的窗口的屏幕截图。此外,显示屏幕截图的窗口将始终是最顶层的窗口。

1 个答案:

答案 0 :(得分:0)

您想要的信息并非全部来自DC窗口。主题画在上面。

如果你想要一个完全可视化的表示,你需要找到窗口的屏幕坐标(或它的一部分),然后从屏幕DC上进行blit。


如果未显示窗口,则可能存在难以克服的问题。据我所知,主题(因为至少Windows Vista)不是Window DC的一部分,而是使用非GDI技术绘制在顶部。 GDI根本没有能力绘制复杂的混合和透明效果。在Windows 8之前,仍然可以选择旧的经典主题,但现在它们已经消失了。您可能会发现标题栏不再在NCPAINT处理程序中绘制。