我有以下代码来截取窗口的截图:
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如何将内容绘制到屏幕上。
当我有一个窗口略微覆盖另一个时,覆盖窗口出现在被遮盖的屏幕截图上,这有点不方便。此外,当窗口最小化时,此代码不会产生任何有趣的内容。
这有什么办法吗?我认为截取最小化应用程序的截图非常困难,但我希望获得有盖窗口的截图是可能的。也许有一种不同的方法可以解决这些问题?
答案 0 :(得分:4)
不,截图正是它听起来的样子。你会从视频适配器中读出像素,你得到的是你所看到的。您必须恢复窗口并将其带到前台才能获得完整视图。 WM_SYSCOMMAND + SC_RESTORE和SetForegroundWindow()分别。还有一段时间允许应用程序在必要时重新绘制其窗口。
WM_PRINT消息可用于请求窗口将自身绘制到内存上下文中。这可以处理重叠的窗口问题。但这只有在你的窗口才有效。并且很少有预期的结果,程序员不经常正确地实现WM_PRINT。