C#PrintWindow返回黑色图像

时间:2011-07-26 08:08:51

标签: c# screen-capture graphic device-context

我在Windows XP上,我正试图限制一个窗口。

但是当我捕获一个窗口时,我得到了窗口标题(Name& Icon),但窗口的整个内容都是黑色的。

尝试保存图像时,整个图像都是透明的。

这是我的代码:

    [DllImport("User32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags);

    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
    public static extern IntPtr GetForegroundWindow();

    [DllImport("user32.dll")]
    private static extern bool GetWindowRect(IntPtr handle, ref Rectangle rect);

    public void CaptureWindow(IntPtr handle)
    {
        Rectangle rect = new Rectangle();
        GetWindowRect(handle, ref rect);
        rect.Width = rect.Width - rect.X;
        rect.Height = rect.Height - rect.Y;
        try
        {
            Bitmap bmp = new Bitmap(rect.Width, rect.Height);
            Graphics memoryGraphics = Graphics.FromImage(bmp);
            IntPtr hdc = memoryGraphics.GetHdc();
            PrintWindow(handle, hdc, 0);
            ResultsPB.Image = bmp;
            memoryGraphics.ReleaseHdc(hdc);
        }
        catch (Exception)
        {
            throw;
        }
    }

1 个答案:

答案 0 :(得分:2)

看看C# Capturing Direct 3D Screen。 打印屏幕捕获可见区域,而不是手柄。

DirectX和OpenGL通过硬件直接绘制。使用PrintScreen,您只能捕获由Windows管理的手柄屏幕。

如果您只需要可见区域,请使用Graphics.CaptureFromScreen。

我使用http://magnum.dimajix.de/download/demos.shtml的OpenGL演示尝试过BitBlt和PrintScreen但没有成功。 PrintScreen只返回一个空白位图,BitBlt返回一个旧的捕获(可能来自第一个和唯一的WM_PAINT消息)。

尝试启动游戏并收听它的窗口消息。您将看到没有WM_PAINT消息。所以Windows甚至不知道是否有任何改变。