覆盖/最小化窗口的屏幕截图

时间:2010-03-17 18:25:07

标签: c++ winapi graphics

我有以下代码来截取窗口的截图:

HDC WinDC;
HDC CopyDC;
HBITMAP hBitmap;
RECT rt;

GetClientRect (hwnd, &rt);
WinDC = GetDC (hwnd);
CopyDC = CreateCompatibleDC (WinDC);

hBitmap = CreateCompatibleBitmap (WinDC,
 rt.right - rt.left, //width
 rt.bottom - rt.top);//height

SelectObject (CopyDC, hBitmap);

//Copy the window DC to the compatible DC
BitBlt (CopyDC,   //destination
 0,0,
 rt.right - rt.left, //width
 rt.bottom - rt.top, //height
 WinDC,    //source
 0, 0,
 SRCCOPY);

ReleaseDC(hwnd, WinDC);
ReleaseDC(hwnd, CopyDC);

这是别人的代码,略有修改,因为我不熟悉DC以及windows如何将内容绘制到屏幕上。

当我有一个窗口略微覆盖另一个时,覆盖窗口出现在被遮盖的屏幕截图上,这有点不方便。此外,当窗口最小化时,此代码不会产生任何有趣的内容。

这有什么办法吗?我认为截取最小化应用程序的截图非常困难,但我希望获得有盖窗口的截图是可能的。也许有一种不同的方法可以解决这些问题?

1 个答案:

答案 0 :(得分:4)

不,截图正是它听起来的样子。你会从视频适配器中读出像素,你得到的是你所看到的。您必须恢复窗口并将其带到前台才能获得完整视图。 WM_SYSCOMMAND + SC_RESTORE和SetForegroundWindow()分别。还有一段时间允许应用程序在必要时重新绘制其窗口。

WM_PRINT消息可用于请求窗口将自身绘制到内存上下文中。这可以处理重叠的窗口问题。但这只有在你的窗口才有效。并且很少有预期的结果,程序员不经常正确地实现WM_PRINT。