我遵循了这个tutorial(这里有一些比这里列出的更多,因为在我的代码中我通过鼠标点击获得一个窗口)用于抓取窗口作为位图,然后在不同的窗口中渲染该位图。
我的问题:
当窗口最小化或隐藏(SW_HIDE)时,我的屏幕捕获不起作用,因此可以在窗口最小化或隐藏时捕获它吗?
答案 0 :(得分:6)
PrintWindow api效果很好,我用它来捕捉隐藏窗口的缩略图。尽管有名称,但它与WM_PRINT和WM_PRINTCLIENT不同,它几乎适用于除Direct X / WPF窗口之外的所有窗口。
我添加了一些代码(C#),但在查看了我如何使用代码之后,我意识到当我捕获其位图时,窗口实际上并没有被隐藏,它只是在屏幕外,所以这可能对你的情况不起作用。你可以在屏幕外显示窗口,打印然后再隐藏它吗?
public static Bitmap PrintWindow(IntPtr hwnd)
{
RECT rc;
WinUserApi.GetWindowRect(hwnd, out rc);
Bitmap bmp = new Bitmap(rc.Width, rc.Height, PixelFormat.Format32bppArgb);
Graphics gfxBmp = Graphics.FromImage(bmp);
IntPtr hdcBitmap = gfxBmp.GetHdc();
bool succeeded = WinUserApi.PrintWindow(hwnd, hdcBitmap, 0);
gfxBmp.ReleaseHdc(hdcBitmap);
if (!succeeded)
{
gfxBmp.FillRectangle(new SolidBrush(Color.Gray), new Rectangle(Point.Empty, bmp.Size));
}
IntPtr hRgn = WinGdiApi.CreateRectRgn(0, 0, 0, 0);
WinUserApi.GetWindowRgn(hwnd, hRgn);
Region region = Region.FromHrgn(hRgn);
if (!region.IsEmpty(gfxBmp))
{
gfxBmp.ExcludeClip(region);
gfxBmp.Clear(Color.Transparent);
}
gfxBmp.Dispose();
return bmp;
}
答案 1 :(得分:1)
您可以向窗口发送WM_PRINT
和WM_PRINTCLIENT
条消息,这会将其内容呈现为您选择的HDC
。
然而,这些并不完美:虽然标准的Win32控件正确处理这些,但应用程序中的任何自定义控件都可能不会。
答案 2 :(得分:0)
我正在尝试获取部分隐藏控件的位图。
我在使用代码之前完成了绘图,但是包含了重叠它的窗口。那么..也许你想试试这个。 WM_PRINTCLIENT应该(在我的理解中)重绘控件内的所有内容,即使它实际上不可见。
const int WM_PRINT = 0x317, WM_PRINTCLIENT = 0x318, PRF_CLIENT = 4,
PRF_CHILDREN = 0x10, PRF_NON_CLIENT = 2,
COMBINED_PRINTFLAGS = PRF_CLIENT | PRF_CHILDREN | PRF_NON_CLIENT;
SendMessage(handle, WM_PRINTCLIENT, (int)hdc, COMBINED_PRINTFLAGS);
//GDIStuff.BitBlt(hdc, 0, 0, width, height, hdcControl, 0, 0, (int)GDIStuff.TernaryRasterOperations.SRCCOPY);
之前的代码已被注释掉了。它基于此处的代码:Pocket PC: Draw control to bitmap(已接受的答案)。这与Tim Robinson在这篇帖子中的建议基本相同。
另外,看看这里 http://www.tcx.be/blog/2004/paint-control-onto-graphics/