【问题标题】:Get Image painted on Window获取在 Window 上绘制的图像
【发布时间】:2013-05-08 04:09:02
【问题描述】:

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

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

绘制后的窗口:

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

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

【问题讨论】:

  • 要截屏吗?
  • 你必须展示一些代码。另外,您所说的 是什么意思...被另一个进程绘制在上面如果我尝试复制窗口图像,在哪里?
  • 可以使用CopyFromScreen方法抓取屏幕:stackoverflow.com/questions/362986/…
  • 我认为问题在于你的 PrintWindow 方法在每一帧窗口被清除并重绘并且你在清除之后和绘制之前打印,尝试在不同的地方调用 PrintWindow。

标签: c# windows windows-7 directx


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-01
        • 1970-01-01
        • 2023-03-16
        • 2017-07-05
        相关资源
        最近更新 更多