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#工作
按要求:-)尝试将ReleaseHdc直接放在PrintWinow()调用之后。
。
我不得不猜测原因,但它可能类似于"只要HDC被非托管代码锁定,托管代码就不能访问它。"因此,必须释放HDC才能看到c#中的位图