我一直在使用Windows API的BitBlt
函数来执行屏幕抓取。
然而有许多缺点:
BitBlt
) – 要解决这个问题,需要禁用Aero,我不想这样做。 屏幕闪烁,事情转移。 CAPTUREBLT
标志不能捕获分层的Windows。 启用时,捕捉时鼠标光标闪烁。 这可能看起来像一个小问题,但当应用程序没有错误时,这是非常烦人的。 作为解决这个问题的方法,我打算将一个分层窗口渲染为一个额外的游标。 我已经在使用OpenGL来显示和处理捕获的屏幕数据。 BitBlt
给我的像素数据,它是相对容易加载到纹理。 然而,这有点荒谬,因为我手动将数据重新发送回GPU时,它应该在GPU上可用开始。 数据当然是存在的,但试图访问是另一回事。
我认为,供应商的待办事项清单(或可能在任何清单上)的这个function并不高,但我想问问那些知道AMD(ATI)或NVidia在读取屏幕缓冲区的驱动程序中(例如在OpenGL环境中)。 我对现代GPU架构知之甚less,不知道从哪里开始寻找答案。
OpenGL只能读取上下文framebuffer(一个窗口)以及任何已经创建的帧缓冲区或pbuffers。 OpenGL无法触摸桌面或任何其他窗口。
这是个有趣的问题。 不幸的是,我不认为这是真的支持。 我发现在创建一个全屏幕不可见窗口和用glReadPixels读取像素数据方面取得了一些成功的报告:
http://www.virtualdub.org/blog/pivot/entry.php?id=142
http://www.opentk.com/node/2430
但是,我相信这样做的行为是未定义的,只能在特定的硬件/操作系统配置上工作。