我在项目中大量使用BitBlt。我创建了许多线程,在每个线程中我通过BitBlt捕获屏幕。除了以下问题之外,它现在正常运行并且正如预期的那样。
当用户单击正在运行的程序或例如已在任务栏上打开资源管理器时,会出现问题。您知道当您单击任务栏上正在运行的程序时,它会最小化或显示在屏幕上。我所谈论的问题恰好发生在这种转变中。在那一刻,类似于中断,所有线程停止捕获屏幕几秒钟,然后他们继续捕获。当您在音量控制窗口上向下或向上移动时,会发生同样的事情。你能否解释为什么会发生这种情况以及如何防止这种情况发生?
感谢。
杰
答案 0 :(得分:0)
这可能是一个调度问题。当您激活应用程序时,它会优先获得一个小的,瞬间的提升(因此它在UI中看起来很敏感)。这种提升可能持续与动画一样长,并暂时抢占你的屏幕捕获线程。
桌面管理器也可能正在序列化内容,并且在动画结束之前,您的bitblts会暂停。即使你关闭了Aero,我相信desktop window manager可能仍处于合成模式,这会影响Hans Passant在评论中所描述的效果。
如果你想从屏幕上制作视频,我认为依靠GDI是不可能的。我强烈建议阅读有关桌面窗口管理器的内容。例如,此caveat直接适用于您尝试执行的操作:
避免读取或写入显示器DC。尽管受DWM支持,但由于性能下降,我们不推荐使用它。
当您使用GDI尝试读取屏幕时,DWM必须停止正在进行的操作,可能会将桌面的新副本呈现给视频内存,并将数据从视频内存复制回系统内存。 DWM可能将这些请求视为优先级较低的请求而不是正在进行的动画,因此当它响应BitBlt时,动画结束。
这个question表明带有屏幕截图过滤器的DirectShow可能是最佳选择。