10

我按照本教程(这里列出的内容比这里列出的要多一点,因为在我的代码中,我通过鼠标单击获得了一个窗口)将一个窗口作为位图抓取,然后在另一个窗口中渲染该位图。

我的问题:

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

4

3 回答 3

7

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;
    }
于 2009-05-07T12:50:46.230 回答
2

您可以将一些消息发送到窗口WM_PRINTWM_PRINTCLIENT从而将其内容呈现到HDC您选择的窗口中。

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

于 2009-05-06T16:09:20.083 回答
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:将控件绘制到位图(已接受答案)。这与 Tim Robinson 在此线程中建议的基本相同。

另外,看看这里 http://www.tcx.be/blog/2004/paint-control-onto-graphics/

于 2011-06-17T16:11:10.177 回答