gpt4 book ai didi

c# - PrintWindow 返回空数据,适用于 C++

转载 作者:太空宇宙 更新时间:2023-11-03 11:05:51 25 4
gpt4 key购买 nike

我已经成功地让 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 边界是正确的。 Following this example我在 C++ 中使用计算器程序让它工作,但与计算器相同的代码在 C# 中不起作用。

我需要它在 C# 中工作。

最佳答案

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

See here.

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

关于c# - PrintWindow 返回空数据,适用于 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15856496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com