c# - 使用 C# 截取任何外部应用程序的屏幕截图

标签 c# opengl windows-xp directx screenshot

我们有一个 C# (WPF) 应用程序,我们想在其中截取我们启动的任意应用程序的屏幕截图(即,我们有对我们启动的进程的引用)。 该应用程序可能会最小化或位于其他窗口后面,但我们仍然只需要单个应用程序的图像,而不是重叠像素。

我知道使用 BitBlt 或 PrintWindow 的典型 P/Invoke 解决方案大部分时间都可以工作,但是在处理直接绘制到图形设备的 DirectX 或 OpenGL 应用程序时,这些会失败(我只会得到黑色/透明像素)。我找到了这个 article关于从 C# 截取 Direct3D 应用程序的屏幕截图,所以我想我已经涵盖了这种情况。

所以我的问题是:

  1. 如何为 OpenGL 应用程序执行此操作?
  2. 确定要使用的适当方法 (PW/DX/GL) 的最简单方法是什么?
  3. 是否有一种通用的方法可以做到这一点?

对于 #2,我是否只能检查可执行文件加载的模块并查看是否加载了 DirectX 或 OpenGL DLL/程序集?

这只需要在 Windows XP 上运行(不是跨平台的,如果这个应用程序有的话,也不会很快进入 Vista/7)。

最佳答案

回答1:在OpenGL中,可以调用glReadBuffer和glReadPixels来获取屏幕位图。然而,这很慢(所以你不会在每一帧都重复调用它)并且当 GL 窗口被另一个应用程序/窗口重叠时你也可能会遇到问题。执行此操作的正确方法是使用 pbuffer 来“渲染到纹理”(谷歌搜索)。 .

想法 2:如果您有窗口的句柄,您可能能够获得 pixelformatdescriptor它的结构并检查它。虽然从未尝试过。

对于 3:顺便说一下,我认为没有一种通用的方法可以毫无问题地做到这一点..

关于c# - 使用 C# 截取任何外部应用程序的屏幕截图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/756044/

相关文章:

c# - 在 Visual Studio 中调试时出现底层连接已关闭错误

c++ - 在 openGL 中,模型坐标应该在我的 CPU 上计算还是在 GPU 上通过 OpenGL 调用计算?

c++ - GLSL 错误 : failed to preprocess the source. 我该如何解决这个问题?

sqlite - ESENT性能Vista与XP

delphi - 编写关键文本数据的技术

php - 在 IIS 5.1 中安装 PHP

c# - 这是一个大的表达式树吗? #4

c# - TabControl - 在新选项卡中加载默认 UI 元素

c# - NServiceBus - NServiceBus.Host 作为发布者,WPF 应用程序作为订阅者。如何?

java - 将 PNG 加载到 OpenGL 性能问题 - Java 和 JOGL 比 C# 和 Tao.OpenGL 慢得多