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

我需要编写一个截屏,并且需要检测窗口内容何时发生变化,即使只有文本被选中。 这个窗口是第三方控制。

Solutions Collecting From Web of "如何检测窗口内容何时更改"

有几种方法。

(1)屏幕轮询。

您可以轮询屏幕(即创建一个DIB,每个时间段从屏幕到BitBlt ),然后按原样发送

优点:

  • 实施起来非常简单

缺点:

  • 高CPU负载。 每秒轮询整个屏幕的次数非常多(应该传输大量的数据)。 因此,这将是沉重,缓慢。
  • 高网络带宽

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

优点:

  • 实施起来还不算太复杂
  • 网络带宽显着降低

缺点:

  • 更高的CPU使用率。

(3)和上面一样,只是你不会不断地轮询屏幕。 相反,你做了一些钩住你的控制(如监视控制收到的Windows消息)。 然后你试着学习什么时候你的控件应该重画自己,并且只在这些场景下进行屏幕轮询。

优点:

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

缺点:

  • 执行变得复杂。 像注射钩子等东西
  • 由于这是基于一些启发式的 – 你不能保证(一般来说)涵盖所有可能的情况。 在某些情况下,您可能会错过更改。

(4)低级挂钩:拦截对绘图功能的调用。 由于在用户模式下有这么多的功能,所以在内核模式下,唯一可行的方法就是这样做。

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

优点:

  • 降低CPU使用率。
  • 100%保证拦截所有图纸,无需启发式
  • 有点干净 – 不需要在应用程序/控件中注入钩子

缺点:

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

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

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

然而,这实施起来要复杂得多。 一些绘图函数将另一个位图作为参数,而这些位图又是使用另一个绘图函数等绘制的。您必须窥探位图以及屏幕。

优点:

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

缺点:

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