我需要编写一个screencast,并且需要检测窗口内容何时发生变化,即使只选择了文本。这个窗口是第三方控制。如何检测窗口内容何时发生变化
2
A
回答
5
Ther're几种方法。
(1)屏幕轮询。
您可以查询屏幕(即创建一个DIB,从屏幕到它的每个时间段BitBlt
),然后把它作为-是
优点:
- 很简单实施
缺点:
- 高CPU负载。每秒轮询整个屏幕的次数非常繁重(应该传输大量数据)。因此它会很沉重并且很慢。
- 高网络带宽
(2)同上,除了现在你做的调查屏幕上看到的不同的一些分析。然后你可以只发送差异(如果没有改变,显然不发送任何东西),再加上你可以选择压缩差异流。
优点:
- 还没太复杂,实现
- 显着降低网络带宽
缺点:
- 甚至更高的CPU使用率。
(3)和上面一样,不同之处在于您不会持续轮询屏幕。相反,你可以为你的控件做一些钩子(比如监视控件收到的Windows消息)。然后你试着学习什么时候你的控件应该重绘,并且只在这些场景中进行屏幕轮询。
优点:
- 显着降低CPU使用率
- 仍是可接受的网络带宽
缺点:
- 实施变得复杂。像注入钩子等
- 由于这是基于一些启发式 - 你不能保证(一般来说)涵盖所有可能的情况。在某些情况下,您可能会错过更改。
(4) 挂钩处于较低级别:截取对绘图函数的调用。由于用户模式中有这么多功能,因此唯一可行的方法是在内核模式下进行。
您可能写一个虚拟视频驱动器(无论是“镜像”的视频驱动程序,或钩的现有的一个)接收所有图中的系统。然后,无论何时您在特定区域收到图纸请求 - 您都会知道它已更改。
优点:
- 降低CPU使用率。
- 保证100%拦截所有图纸,没有启发式
- 有些清洁剂 - 无需注入钩到应用程序/控制
缺点:
- 这是一个驱动程序开发!除非你有经验 - 这真是一场噩梦。
- 更复杂的安装。需要管理员权限,最有可能需要重启。
- 仍然相当大的CPU负载和带宽
(5) 事情与驱动程序的开发。只要您现在知道哪些绘图功能被调用 - 您现在就可以切换策略。而不是“记住”肮脏的区域并轮询屏幕 - 您可以“记住”用所有参数调用的绘图函数,然后在主机端“重复”它。
通过这样你就不必在所有轮询屏幕。你使用“矢量”方法(而不是“栅格”)。
然而这实现起来要复杂得多。一些绘图函数将另一个位图作为参数,而这些位图又是使用另一个绘图函数等绘制的。您必须窥探位图和屏幕。
优点:
- 零CPU负荷
- 最佳的网络流量
- 保证始终工作
缺点:
- 这是一个驱动程序开发处于最佳状态!发展的几个月保证
- 需要最先进的编程,深刻理解二维图纸
- 需要在主机写代码,它将“绘制”所有“记录”命令。
相关问题
- 1. 如何检测,当一个元素的内容发生变化
- 2. 检测PropertyChangedEventHandler何时发生变化
- 3. 如何检测X11窗口的内容何时更改?
- 4. Javascript:如何检测变量的引用何时发生变化
- 5. 用户检测窗口时间变化
- 6. Coffeescript:如何检索元素内容后发生变化
- 7. 如何流化gnome窗口的内容
- 8. 当内容发生变化
- 9. PHP:检测变量值何时发生变化
- 10. 如何在div内容发生变化时调用js函数
- 11. 如何使用wxPython检测我的窗口何时最小化?
- 12. 检测窗口文本变化与pinvoke
- 13. 检测窗口外壳变化
- 14. 如何检测窗口哈希的变化?
- 15. 如果窗口内容发生变化,自动截取x服务器
- 16. 变化WPF窗口的标签内容
- 17. 如何检测变量是否发生了变化?
- 18. 如何使方法检测变量是否发生了变化?
- 19. 如果CKEditor的内容发生变化
- 20. 如何检测内容何时加载?
- 21. 如何检测当前的网址当发生任何变化
- 22. 检测CControlBar的对接状态何时发生变化
- 23. 当StackPanel的内容发生变化时,如何触发一个触发器?
- 24. 当我最小化窗口时,元素位置发生变化
- 25. 如何检测“状态”的变化并显示一些内容?
- 26. 当窗口变小时CSS发生变化
- 27. 如何检测元素的字体家族何时发生变化
- 28. 智能检测html内容变化
- 29. 检测ul列表内容变化jQuery
- 30. iOS - 检测CALayer内容的变化
谢谢您的回答。对于我的任务第三种方法将接近(侦察窗口消息)。我知道wm_paint,但这还不够。你可以通过这种方式发表更多评论吗? – Schnider 2010-10-25 12:20:57
“WM_PAINT”还不够,因为控件可能会自己绘制,(它只会“GetDC”并绘制自己)。你还应该用'WM_COMMAND'来查看特定的情况。有时候也应该考虑鼠标消息。 – valdo 2010-10-25 12:56:08
这只是我尝试了所有描述的场景。而且,我必须说,在“一般情况下”(未知的控制或应用程序) - 它不会可靠地工作。然而,特定的控制可以以这种方式完成。 – valdo 2010-10-25 12:57:14