printwwindow返回空数据,在c++中工作

本文关键字:c++ 工作 返回 数据 printwwindow | 更新日期: 2023-09-27 18:07:43

我已经成功地让PrintWindow在c++中工作,但是当我尝试在c#中这样做时,我得到一个null数据的位图。使用VS 2012 Pro,在。net 4.0上。下面是我的代码:

    [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#工作

printwwindow返回空数据,在c++中工作

按要求:-)尝试将ReleaseHdc直接放在PrintWinow()调用之后。

我不得不猜测原因,但它可能类似于"只要HDC被非托管代码锁定,托管代码就不能访问它。"因此,必须释放HDC才能看到c#中的位图