我有一个窗体窗口正在被另一个进程绘制。如果我尝试使用PrintWindow
或设备上下文副本复制窗口图像,则只会显示下面的窗口:
窗口在被另一个过程绘制之前:
画完后的窗口:
当我执行PrintWindow
或BitBlt时,我得到的窗口:
是否可以直接从窗口中读取窗口而不发送paint参数?我可以直接从显卡上读取它吗?
答案 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)