2010-10-25 53 views

回答

5

Ther're几种方法。

(1)屏幕轮询。

您可以查询屏幕(即创建一个DIB,从屏幕到它的每个时间段BitBlt),然后把它作为-是

优点:

  • 很简单实施

缺点:

  • 高CPU负载。每秒轮询整个屏幕的次数非常繁重(应该传输大量数据)。因此它会很沉重并且很慢。
  • 高网络带宽

(2)同上,除了现在你做的调查屏幕上看到的不同的一些分析。然后你可以只发送差异(如果没有改变,显然不发送任何东西),再加上你可以选择压缩差异流。

优点:

  • 还没太复杂,实现
  • 显着降低网络带宽

缺点:

  • 甚至更​​高的CPU使用率。

(3)和上面一样,不同之处在于您不会持续轮询屏幕。相反,你可以为你的控件做一些钩子(比如监视控件收到的Windows消息)。然后你试着学习什么时候你的控件应该重绘,并且只在这些场景中进行屏幕轮询。

优点:

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

缺点:

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

(4) 挂钩处于较低级别:截取对绘图函数的调用。由于用户模式中有这么多功能,因此唯一可行的方法是在内核模式下进行。

您可能写一个虚拟视频驱动器(无论是“镜像”的视频驱动程序,或钩的现有的一个)接收所有图中的系统。然后,无论何时您在特定区域收到图纸请求 - 您都会知道它已更改。

优点:

  • 降低CPU使用率。
  • 保证100%拦截所有图纸,没有启发式
  • 有些清洁剂 - 无需注入钩到应用程序/控制

缺点:

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

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

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

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

优点:

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

缺点:

  • 这是一个驱动程序开发处于最佳状态!发展的几个月保证
  • 需要最先进的编程,深刻理解二维图纸
  • 需要在主机写代码,它将“绘制”所有“记录”命令。
+0

谢谢您的回答。对于我的任务第三种方法将接近(侦察窗口消息)。我知道wm_paint,但这还不够。你可以通过这种方式发表更多评论吗? – Schnider 2010-10-25 12:20:57

+0

“WM_PAINT”还不够,因为控件可能会自己绘制,(它只会“GetDC”并绘制自己)。你还应该用'WM_COMMAND'来查看特定的情况。有时候也应该考虑鼠标消息。 – valdo 2010-10-25 12:56:08

+0

这只是我尝试了所有描述的场景。而且,我必须说,在“一般情况下”(未知的控制或应用程序) - 它不会可靠地工作。然而,特定的控制可以以这种方式完成。 – valdo 2010-10-25 12:57:14