我使用下面的代码使用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;
}
编辑: 我正在显示屏幕截图的窗口将覆盖整个桌面,并将不断更新窗口后面的窗口的屏幕截图。此外,显示屏幕截图的窗口将始终是最顶层的窗口。
答案 0 :(得分:0)
您想要的信息并非全部来自DC窗口。主题画在上面。
如果你想要一个完全可视化的表示,你需要找到窗口的屏幕坐标(或它的一部分),然后从屏幕DC上进行blit。
如果未显示窗口,则可能存在难以克服的问题。据我所知,主题(因为至少Windows Vista)不是Window DC的一部分,而是使用非GDI技术绘制在顶部。 GDI根本没有能力绘制复杂的混合和透明效果。在Windows 8之前,仍然可以选择旧的经典主题,但现在它们已经消失了。您可能会发现标题栏不再在NCPAINT处理程序中绘制。