【问题标题】:Is there a way to capture a bitmap from a WPF window using native C++?有没有办法使用本机 C++ 从 WPF 窗口捕获位图?
【发布时间】:2011-02-05 22:08:52
【问题描述】:

想象一个包含子 WPF 窗口的 MDI 应用程序中的文档窗口,例如边栏。如何获得同时包含 WPF 像素和 GDI(非 wpf)像素的位图?

我发现,在为 Win7 任务栏应用程序图标悬停进行缩略图预览时,我在 WPF 像素应位于的预览部分中变黑。我当前的方法只是抓取文档窗口的位图捕获。然后我得到一个用于预览的 DC,从中制作一个内存 DC,然后将我的位图选择到其中。然后我做了一些大小调整,并将内存 dc bitblt 到真正的 dc。我猜 BitBlt 操作没有考虑 WPF 像素是硬件加速的事实,因此需要从图形硬件中获取。 GDI 中的所有东西都管理得很好,但是当没有 WPF 子窗口时,预览图像看起来很好。

我想知道是否有可能从本机 C++ 中获取 WPF 窗口的位图。然后我可以把它放到上一个预览的黑色区域。

【问题讨论】:

  • 我在想,由于 WPF 是硬件加速的,所以应该有一种方法可以从 DirectX 获取像素。不知道我会怎么做...
  • 是否有原生版本的 RenderTargetBitmap?
  • 有人告诉我,也许最好的方法是创建一个 C++/CLI 互操作层,我可以从 C++ 调用它,它会为我返回一个 CBitmap。在这种情况下,我可以使用 RenderTargetBitmap 来获取 WPF 像素。

标签: wpf windows visual-c++ graphics bitmap


【解决方案1】:

也许我没有正确理解您当前的方法,但是您可以从屏幕 DC 到内存 DC 执行 BitBlt() 吗?您需要获取窗口的屏幕矩形,但这应该不会太糟糕。

【讨论】:

  • 这不适用于 WPF,因为 WPF 呈现给图形硬件,而不是设备上下文。这就是我目前使用的过程,我得到的只是黑色像素。
  • 好的,根据您的问题,我不确定您当前的方法是什么。我希望你能很好地回答你的问题。 :)
  • 您可以将您的硬件级别修改为低于 2,然后 WPF 将生成软件渲染。
【解决方案2】:

为了解决这个问题,我必须在本机代码中创建一个抽象类,其中包含一个虚拟方法来获取在 C++/CLI 中实现的位图。在托管实现中,我使用 .NET 的 RenderTargetBitmap 类来获取 WPF 窗口的位图捕获,然后填充传入的 CBitmap 对象(请参阅How to get an BITMAP struct from a RenderTargetBitmap in C++/CLI?)。在非托管调用例程中,我使用虚方法获取位图。

简而言之,没有办法通过简单地使用非托管 C++ 来获取位图,因为 WPF 和 GDI 确实不能在所有实际用途中一起工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 2016-12-04
    • 1970-01-01
    • 2010-10-12
    相关资源
    最近更新 更多