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

Sch*_*der 2 windows winapi

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

val*_*ldo 5

有几种方法.

(1)屏幕轮询.

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

优点:

  • 实现起来非常简单

缺点:

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

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

优点:

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

缺点:

  • 甚至更高的CPU使用率.

(3)与上述相同,但不要经常轮询屏幕.相反,你会为你的控件做一些挂钩(比如监视控件收到的Windows消息).然后,您尝试了解您的控件何时应重绘,并仅在这些场景中进行屏幕轮询.

优点:

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

缺点:

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

(4)较低级别的挂钩:拦截对绘图功能的调用.由于在用户模式中存在大量此类功能 - 这样做的唯一现实可能性是内核模式.

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

优点:

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

缺点:

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

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

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

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

优点:

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

缺点:

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