我需要编写截屏视频,并且需要检测窗口内容何时更改,甚至只选择了文本。此窗口是第三方控件。
答案 0 :(得分:5)
有几种方法。
(1)屏幕轮询。
你可以轮询屏幕(也就是说,创建一个DIB,每个时间段从BitBlt
从屏幕到它),然后按原样发送
优点:
缺点:
(2)与上面相同,除了现在您对轮询的屏幕进行一些分析以查看差异。然后你可以只发送差异(如果没有变化,显然不发送任何东西),另外你可以选择压缩差异流。
优点:
缺点:
(3)与上述相同,但不要经常轮询屏幕。相反,你会为你的控件做一些挂钩(比如监视控件收到的Windows消息)。然后你试着学习你的控件应该重绘的时候,并且仅在那些场景中进行屏幕轮询。
优点:
缺点:
(4) 较低级别的挂钩:拦截对绘图功能的调用。由于用户模式中存在大量此类函数 - 执行此操作的唯一现实可能性是内核模式。
您可以编写虚拟视频驱动程序(“镜像”视频驱动程序,或挂钩现有的驱动程序)以接收系统中的所有绘图。然后,只要您收到特定区域的绘图请求,您就会知道它已被更改。
优点:
缺点:
(5) 继续开发驱动程序。只要您现在知道调用哪些绘图函数 - 您现在可以切换策略。您可以“记住”使用所有参数调用的绘图函数,而不是“记住”脏区并在那里轮询屏幕,然后在主机端“重复”它。
通过这样你根本不必轮询屏幕。你使用“矢量”方法(而不是“光栅”)。
然而,这实现起来要复杂得多。一些绘图函数将另一个位图作为参数,而这些位图又使用其他绘图函数等绘制。您将不得不监视位图和屏幕。优点:
缺点: