如何检测窗口内容何时更改

时间:2010-10-25 11:04:37

标签: windows winapi

我需要编写截屏视频,并且需要检测窗口内容何时更改,甚至只选择了文本。此窗口是第三方控件。

1 个答案:

答案 0 :(得分:5)

有几种方法。

(1)屏幕轮询。

你可以轮询屏幕(也就是说,创建一个DIB,每个时间段从BitBlt从屏幕到它),然后按原样发送

优点:

  • 实施起来非常简单

缺点:

  • 高CPU负载。每秒轮询整个屏幕的次数非常多(应传输大量数据)。因此它会变得沉重而缓慢。
  • 高网络带宽

(2)与上面相同,除了现在您对轮询的屏幕进行一些分析以查看差异。然后你可以只发送差异(如果没有变化,显然不发送任何东西),另外你可以选择压缩差异流。

优点:

  • 仍然不太复杂,无法实施
  • 显着降低网络带宽

缺点:

  • CPU使用率更高。

(3)与上述相同,但不要经常轮询屏幕。相反,你会为你的控件做一些挂钩(比如监视控件收到的Windows消息)。然后你试着学习你的控件应该重绘的时候,并且仅在那些场景中进行屏幕轮询。

优点:

  • 显着降低CPU使用率
  • 仍然可以接受的网络带宽

缺点:

  • 实施变得复杂。像注射钩子等等。
  • 由于这是基于一些启发式的 - 您无法保证(一般来说)涵盖所有可能的场景。在某些情况下,您可能会错过更改。

(4) 较低级别的挂钩:拦截对绘图功能的调用。由于用户模式中存在大量此类函数 - 执行此操作的唯一现实可能性是内核模式。

您可以编写虚拟视频驱动程序(“镜像”视频驱动程序,或挂钩现有的驱动程序)以接收系统中的所有绘图。然后,只要您收到特定区域的绘图请求,您就会知道它已被更改。

优点:

  • 降低CPU使用率。
  • 100%保证在没有启发式的情况下拦截所有图纸
  • 有点干净 - 不需要在应用程序/控件中注入挂钩

缺点:

  • 这是驱动程序开发!除非你有经验,否则这是一场真正的噩梦。
  • 更复杂的安装。需要管理员权限,最有可能需要重启。
  • 仍然相当可观的CPU负载和带宽

(5) 继续开发驱动程序。只要您现在知道调用哪些绘图函数 - 您现在可以切换策略。您可以“记住”使用所有参数调用的绘图函数,而不是“记住”脏区并在那里轮询屏幕,然后在主机端“重复”它。

通过这样你根本不必轮询屏幕。你使用“矢量”方法(而不是“光栅”)。

然而,这实现起来要复杂得多。一些绘图函数将另一个位图作为参数,而这些位图又使用其他绘图函数等绘制。您将不得不监视位图和屏幕。

优点:

  • 零CPU负载
  • 最佳网络流量
  • 保证始终工作

缺点:

  • 最好的是驱动程序开发!保证几个月的发展
  • 需要最先进的编程,深入理解2D绘图
  • 需要在主机上编写代码,以便“绘制”所有“录制”命令。