BitBlt 无法正确捕获标题栏
Posted
技术标签:
【中文标题】BitBlt 无法正确捕获标题栏【英文标题】:BitBlt not able to capture the title bar correctly 【发布时间】:2015-01-02 11:53:44 【问题描述】:我正在使用下面的代码来捕获使用 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;
编辑: 我在其中显示屏幕截图的窗口将覆盖整个桌面,并将不断更新其后面窗口的屏幕截图。此外,显示屏幕截图的窗口将始终是最顶部的窗口。
【问题讨论】:
***.com/questions/1149271/… 可能感兴趣。 我检查了它..不幸的是,这对我不起作用,因为我显示屏幕截图的窗口会覆盖整个屏幕,所以我无法捕获整个桌面并将其裁剪以包含我的窗口想要在我的截图中。 也许可以看看DWM thumbnails。 我还需要像素数据。DWM
thumbnail 无法做到这一点。
为什么不直接捕获客户区,并将其放入您自己的标准最大化窗口中,并使用相同的标题栏文本?您需要额外的工作来处理最小化等问题,但效果(可能)是相同的。
【参考方案1】:
您想要的信息并非都可以从窗口 DC 获得。主题被绘制在顶部。
如果你想要一个精确的可视化表示,你需要找到窗口(或它的一部分)的屏幕坐标,然后从屏幕 DC 中 blit。
如果窗口不显示,你可能有一个无法克服的问题。据我所知,主题(至少因为 Windows Vista)不是 Window DC 的一部分,而是使用非 GDI 技术在顶部绘制的。 GDI 根本不具备绘制复杂混合和透明效果的能力。在 Windows 8 之前,仍然可以选择旧的经典主题,但现在它们已经消失了。您可能会发现标题栏不再在 NCPAINT 处理程序中绘制。
【讨论】:
桌面屏幕将被我将显示并不断更新屏幕截图的窗口完全覆盖......所以桌面屏幕只会返回我自己的屏幕截图窗口。 您应该编辑您的问题——这是您忽略提及的关键信息。如果你把它盖住了,你怎么知道窗户“真正”的样子? 我编辑了我的问题..我只会在显示屏幕截图的窗口后面显示窗口...而且显示屏幕截图的窗口将始终是最顶部的窗口。 总是有一个窗口显示在“屏幕捕捉”窗口中,因为桌面总是可见的(如果桌面顶部没有其他窗口,则只是壁纸部分)......也是有没有办法获取当前主题并在通过 BitBlt 捕获的任何内容上手动绘制它?我可能可以存储一个只有标题栏、框架和透明客户区域的位图,并使用 WindowDC 屏幕截图进行 AlphaBlend 处理,但这真的可以特别是慢,因为我正在考虑在 ScreenCapture 窗口后面显示所有可见窗口,而不仅仅是它后面的那个。 有一个专门用于主题的完整 API,但如果这是问题所在,那将是一个新问题。以上是关于BitBlt 无法正确捕获标题栏的主要内容,如果未能解决你的问题,请参考以下文章