2

我已经成功地PrintWindow开始使用 C++ 工作,但是当我尝试在 C# 中进行工作时,我得到了一个包含空数据的位图。在 .NET 4.0 上使用 VS 2012 Pro。这是我的代码:

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool PrintWindow(IntPtr hWnd, IntPtr hdcBlt, int nFlags);

    [DllImport("user32.dll")]
    public static extern ushort getLastError();

    static int count = 0;
    public Bitmap getWindow(IntPtr windowHandle)
    {
        RECT rect;
        Window.GetWindowRect(windowHandle, out rect);

        Console.WriteLine(rect.X);
        Console.WriteLine(rect.Y);
        Console.WriteLine(rect.Width);
        Console.WriteLine(rect.Height);
        Console.WriteLine();

        Bitmap bmp = new Bitmap(rect.Width, rect.Height);
        Graphics gfxBmp = Graphics.FromImage(bmp);
        IntPtr hdcBitmap = gfxBmp.GetHdc();

        bool success = PrintWindow(windowHandle, hdcBitmap, 0);
        if (!success)
        {
            Console.WriteLine("Error copying image");
            Console.WriteLine(getLastError());
        }

        bmp.Save("image_" + count++ + ".bmp");

        gfxBmp.ReleaseHdc(hdcBitmap);
        gfxBmp.Dispose();

        return bmp;

    }

这是输出:

182
182
664
533

没有打印错误消息,并且看起来句柄是有效的,因为 RECT 边界是正确的。按照这个例子,我用计算器程序在 C++ 中工作,但是计算器的相同代码在 C# 中不起作用。

我需要它在 C# 中工作。

4

1 回答 1

2

根据要求:-) 尝试在 PrintWinow() 调用之后直接放置 ReleaseHdc。

看这里。

我不得不猜测原因,但它可能类似于“只要 HDC 被非托管代码锁定,托管代码就无法访问它。因此必须释放 HDC 才能在 C# 中查看位图”

于 2013-04-06T22:09:16.587 回答