获取在Window上绘制的图像

时间:2013-05-08 04:09:03

标签: c# windows windows-7 directx

我有一个窗体窗口正在被另一个进程绘制。如果我尝试使用PrintWindow或设备上下文副本复制窗口图像,则只会显示下面的窗口:

窗口在被另一个过程绘制之前:

enter image description here

画完后的窗口:

enter code here

当我执行PrintWindow或BitBlt时,我得到的窗口:

enter image description here

是否可以直接从窗口中读取窗口而不发送paint参数?我可以直接从显卡上读取它吗?

3 个答案:

答案 0 :(得分:4)

DirectX违反规则,您无法使PrintWindow()工作。使用Graphics.CopyFromScreen()也不起作用,它有一个严重的错误,阻止您传递正确的CopyPixelOperation值。在Windows 8中由Windows本身解决的问题,你不能依赖它。

您需要回退到BitBlt()。关键选项是CopyPixelOperation.CaptureBlt,因此视频叠加层包含在副本中。您可以在this answer中找到所需的代码。

答案 1 :(得分:1)

如果我是正确的,你想要复制由某些DirectX进程呈现的窗口吗?

你可以这样做,但你需要明白,你不能直接从窗口复制内存,因为winows表单没有你的图像,它只有一个占位符用于渲染图像。 图像在窗体内呈现只是一种错觉。 你需要做的是从显卡复制内存,但不幸的是我不知道如何做到这一点。

最简单的想法是获取窗口截图,如alt +打印屏幕,删除边框并将该图像复制到您的窗口。

也许它会有所帮助http://www.codeproject.com/Articles/274461/Very-fast-screen-capture-using-DirectX-in-Csharp

答案 2 :(得分:0)

德米特里是对的 您只能按照他的建议制作CopyFromScreen:
Capture the Screen into a Bitmap
您可以修改源代码以创建一个大的位图作为窗口并仅复制屏幕的那一部分