Winapi 捕获隐藏或最小化的窗口

Winapi 捕获隐藏或最小化的窗口,winapi,screen-capture,Winapi,Screen Capture,我遵循了这一点(比这里列出的要多一些,因为在我的代码中,我通过鼠标点击获得了一个窗口),用于获取一个窗口作为位图,然后在另一个窗口中渲染该位图 我的问题: 当窗口被最小化或隐藏(SW_HIDE)时,我的屏幕捕获不起作用,那么当窗口被最小化或隐藏时,是否可以捕获窗口 您可以向该窗口发送WM_PRINT和WM_PRINTCLIENT消息,从而将其内容呈现到您选择的HDC中 然而,这些并不完美:虽然标准Win32控件可以正确处理这些问题,但应用程序中的任何自定义控件都可能无法正确处理这些问题。api运

我遵循了这一点(比这里列出的要多一些,因为在我的代码中,我通过鼠标点击获得了一个窗口),用于获取一个窗口作为位图,然后在另一个窗口中渲染该位图

我的问题:


当窗口被最小化或隐藏(SW_HIDE)时,我的屏幕捕获不起作用,那么当窗口被最小化或隐藏时,是否可以捕获窗口

您可以向该窗口发送
WM_PRINT
WM_PRINTCLIENT
消息,从而将其内容呈现到您选择的
HDC


然而,这些并不完美:虽然标准Win32控件可以正确处理这些问题,但应用程序中的任何自定义控件都可能无法正确处理这些问题。

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;
    }

我正在尝试获取部分隐藏控件的位图

我以前使用代码绘制图形,但包括重叠的窗口。所以也许你想试试这个。 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);
之前的代码现在被注释掉了。它基于以下代码:(接受答案)。这与Tim Robinson在这篇文章中的建议基本相同

还有,看看这里

有趣的是,我试过了,但没有结果。你能发一些代码或者链接什么的吗?感谢这对最小化/隐藏窗口不起作用,至少在我的情况下不起作用。但是,在窗口关闭时使用
PrintWindow
是一个很好的选择。Ruud,是的,你是对的,你需要在屏幕外显示窗口,PrintWindow,然后再次最小化它。有人能用完整的代码编辑这个答案吗?我的意思是当我复制粘贴这段代码时,我会犯很多错误。可能有一些dll被包括在内等等。这里是新手。“除了DirectX/WPF窗口外,它几乎适用于所有窗口。”-新标志可能会有所帮助。根据Dave Anderson的评论(),Win8.1+上的PW_RENDERFULLCONTENT标志适用于“使用DirectX或DirectComposition的窗口”。