2

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

另一个进程绘制之前的窗口:

在此处输入图像描述

涂漆后的窗户:

在此处输入代码

当我这样做PrintWindow或 BitBlt 时得到的窗口:

在此处输入图像描述

是否可以直接从窗口读取窗口绘制而不发送绘制参数?可以直接从显卡读取吗?

4

3 回答 3

4

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

您需要回退到BitBlt(). 关键选项是CopyPixelOperation.CaptureBlt让视频叠加层包含在副本中。您将在此答案中找到所需的代码。

于 2014-04-04T14:34:22.153 回答
1

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

您可以这样做,但您需要了解您不能直接从窗口复制内存,因为 winows 表单没有您的图像,它只有一个用于渲染图像的占位符。图像在形式中呈现只是一种错觉。您需要做的是从图形卡复制内存,但不幸的是我不知道该怎么做。

最简单的想法是获取像 alt+print screen 这样的窗口截图,删除边框并将该图像复制到您的窗口。

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

于 2014-03-31T10:19:31.317 回答
0

德米特里是对的。
您只能按照他的建议制作 CopyFromScreen:
将屏幕捕获为位图
您可以修改源代码以创建与窗口一样大的位图并仅复制屏幕的该部分

于 2014-04-01T13:39:53.267 回答