请教:NetMeeting的“程序共享”的实现原理因最近在尝试完成一个“多媒体教室”的项目。现已把“音视频”“聊天”“白板”“传输文件”等等都完成了,惟独就是“程序共享”还找不着北。我希望能够实现的是,NetMeeting那样的效率。于是,我也揣摩了NetMetting的实现原理。我感觉它是用Windows-Hook来拦截指定进程的全部消息的。接着,分析进程的消息是否改变了窗口内容;如果改变了,就取得“更新区域”来获得最小绘制区,然后,就实时捕获到了窗口的变化,而且这样的效率也是最高的。因为我还做过一个观察:在使用NetMeeting的“程序共享”时,观察客户端的网络监视器,发现:如果服务端被共享的程序没有改变,则网络监视器的网络数据流量几乎为0。这也充分说明了NetMeeting的“程序共享”是立即反应的,而不是流式的。我现在也在使用Windows-Hook来试图实现之。目前已经能够拦截指定进程的全部消息了,但是,我发觉使用这个技术有个弊端:如果程序是使用自定义消息来画DC的,那么,就根本不能为力。
现请教各位朋友,谁能够说说NetMeeting的“程序共享”实现原理。我不需要代码,我只要知道思路和实现原理就可以了。或者,也希望有朋友能够说说他自己的思路(理论上可行就好),使我能够实现我的需求。
谢谢大家!
现请教各位朋友,谁能够说说NetMeeting的“程序共享”实现原理。我不需要代码,我只要知道思路和实现原理就可以了。或者,也希望有朋友能够说说他自己的思路(理论上可行就好),使我能够实现我的需求。
谢谢大家!
InvalidateRect()
就应该可以
如果是的话,我想netmeeting是通过mirror driver做到的(显示驱动镜象)
InvalidateRect()只能使区域无效,即触发擦背景的事件。
如果某个程序不使用这个函数,而直接画DC,就不能捕获了。比如,用一个Timer来画DC,同时不擦背景。
TO:shootingstars(流星)
mirror driver很有可能!!这个东西我以前粗略看过。现在,我想判断一点:如果使用mirror driver的话,是采用显存流式捕获,还是显存区变化才捕获?还有,就是压缩-发送的问题(当然,这些都算是小问题了)。
前段时间研究了一下vnc的代码,它就是采用的hook各个程序的消息来更新屏幕的。如果搂主采用这种方式,可以借鉴它的代码,它使用的压缩算法是比较适宜屏幕压缩的。
我奇怪的是为什么vnc不采用mirror driver,楼主如果有mirror driver方面的资料的话能否发给我看看,谢谢[email protected]
当然,vnc也意识到了这个问题,所以vnc采用了轮讯窗口的机制来补充,比如vnc默认轮讯控制台窗口(也就是每次传输屏幕信息之前先监测控制台窗口是否变化,如果变化则传输控制台信息),虽然这也不是万全之策,但采用了这种方式后绝大部分的屏幕更新都可以监测到了。
和这次的图像进行比较, 判断是否有改变.如果有改变, 是否可以自定义
一种压缩格式, 传递一个和上次的偏移量, 而不是直接将新的图像完全
传送过去.
这样网络流量比较小, 但是CPU就用的比较多.
其实我也同意你的观点,甚至都一直这么去做的。但是,我观察Netmeeting却是不怎么消耗CPU的。不知道它是怎么实现的......
来捕获窗口, 保存成一个流呢. 例如:
capCreateCaptureWindow 函数, 然后压缩, 例如:
ICCompress 来压缩.具体不知道, 没有作过. 不过我也很想知道是否这种方法可行否.
这种方法我做过,但是不合适
1。流式播放,即使窗口没有任何改变,它也会发送数据,对网络消耗大;
2。视频捕获是有固定格式的,如果程序的窗口尺寸在99.999%的情况都是非视频格式尺寸,所以不能用。
使用的dll, 好像也没有太多有用的信息.其实pcanywhere的共享桌面作得不比netmeeting差.
是否考虑从pcanywhere上面得到某些启示.另外, 从实用的角度, 我觉得,
第一, 当然,需要能够感知屏幕的变化, (这个是技术的最难点)
第二, 主要是网络流量,
最后才考虑CPU和内存, 毕竟现在的CPU的运算速度太猛了, 不用白不用.另外, 好像Video Compression Manager里面有些函数可以用来作压缩
图片使用, 这样就不必要自己来实现压缩算法了.>>如果程序是使用自定义消息来画DC的,那么,就根本不能为力
你说的"自定义消息"是不是就是Custom Draw ? 这个有什么特别吗?
窗口的内容吗? 这些窗口一般通过print-screen是无法得到内容的.如果不能, 按照 "shilong(银羽·以吻赠剑) " 说的, 是否netmeeting
是直接操作底层的显卡的显存?
用一个Timer,每隔1秒钟执行一次TextOut(),同时又不擦DC背景,这样,WINDOWS-HOOK就非常难捕获了。我现在就是想找到一种能够完全跟踪和捕获窗口内容变化(无论是DC,还是EDIT之类的控件)的方法,
就是找不到......
使用DirectX的程序和普通程序没什么明显区别,但是没有消息可以供HookCommand what is yours
Conquer what is not