【问题标题】:Take screenshot of any external application using C#使用 C# 截取任何外部应用程序的屏幕截图
【发布时间】:2009-04-16 13:12:23
【问题描述】:

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

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

所以我的问题是这样的:

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

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

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

【问题讨论】:

    标签: c# opengl windows-xp directx screenshot


    【解决方案1】:

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

    想法 2:如果你有窗口句柄,你也许可以得到它所具有的 pixelformatdescriptor 结构并检查它。虽然从未尝试过。

    对于 3:顺便说一句,我认为没有一种通用的方法可以做到这一点而没有任何问题..

    【讨论】:

    • 我会看看那个。有没有办法获取 OpenGL 应用程序的后台缓冲区并获取这些像素的副本? re:#3 -- 我知道这是一厢情愿,但也许有人找到了办法。问一下也无妨,对吧? (除非你被否决,那就是)
    猜你喜欢
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 2021-04-15
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    相关资源
    最近更新 更多