使用C#截取任何外部应用程序

时间:2009-04-16 13:12:23

标签: c# opengl windows-xp directx screenshot

我们有一个C#(WPF)应用程序,我们想在其中截取我们发布的任意应用程序的截图(即我们引用了我们开始的流程)。 应用程序可以最小化或在其他窗口后面,但我们仍然只想要单个应用程序的图像,而不是重叠的像素。

我知道使用BitBlt或PrintWindow的典型P / Invoke解决方案大部分时间都可以工作,但是在处理直接吸引到DirectX或OpenGL应用程序的DirectX或OpenGL应用程序时,这些解决方案会失败(我只会得到黑/透明像素)图形设备。我发现这个article从C#截取Direct3D应用程序的截图,所以我认为我已经覆盖了这个案例。

所以我的问题是:

  1. 我如何为OpenGL应用程序执行此操作?
  2. 确定合适的使用方法(PW / DX / GL)的最简单方法是什么?
  3. 有没有一种通用的方法可以做到这一点?
  4. 对于#2,我是否会降级检查可执行文件加载的模块,看看是否加载了DirectX或OpenGL DLL / Assembly?

    这只需要在Windows XP上运行(不是跨平台的,如果有的话,不会很快转到Vista / 7)。

1 个答案:

答案 0 :(得分:1)

答案1:在OpenGL中,您可以调用glReadBuffer和glReadPixels来获取屏幕位图。但是,这很慢(因此您不会每帧重复调用它),并且当GL窗口与另一个应用程序/窗口重叠时,您可能也会遇到问题。正确的方法是使用pbuffer“渲染到纹理”(谷歌)。

2的想法:如果你有窗口句柄,你或许可以获得它拥有的pixelformatdescriptor结构并进行检查。从来没有尝试过。

For 3:顺便说一下,我认为没有任何问题可以通过这种方式实现这一目标。