VNC源码阅读--VNC图像更新机制.docxVIP

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
VNC源码阅读--VNC图像更新机制.docx

VNC源码阅读--VNC图像更新机制(1)2009-08-2510:48 VNC的图像更新机制核心为,桌面区域更新记录策略和更新区域通知策略。桌面更新区域记录主要是通过hooks记录桌面上变化的矩形区域,只记录更新的矩形区不记录具体更新的数据。更新区域记录步骤大致如下:1.wm_hooks截获桌面变化的相关消息,并转化为自定义的消息发送给WMHooksThread线程处理。2.WMHooksThread中用SimpleUpdateTrackernew_changes记录新的更新区域.3.把SimpleUpdateTrackernew_changes更新拷贝到SDisplay中。4.每次要发送桌面更新的时候,把SDisplay中记录的更新区域传给VNCServerST对象中。更新区域的通知主要有poll和push两种机制。push是服务器每隔10ms检查有没有更新,如果有更新则主动把更新推送给客户端,poll机制则是客户端主动请求更新,客户端通过发送framebufferupdate请求某一个区域更新,服务器处理该消息发送相应的更新。详细分析如下:1.Wm_hooks截获消息并转化为自定义的消息发送给WMHooksThread线程处理。Wm_hooks自定义的消息:UINTWM_HK_WindowChanged=RegisterWindowMessage(_T(RFB.WM_Hooks.WindowChanged));UINTWM_HK_WindowClientAreaChanged=UINTWM_HK_WindowBorderChanged=RegisterWindowMessage(_T(RFB.WM_Hooks.WindowBorderChanged));UINTWM_HK_RectangleChanged=RegisterWindowMessage(_T(RFB.WM_Hooks.RectangleChanged));UINTWM_HK_CursorChanged=RegisterWindowMessage(_T(RFB.WM_Hooks.CursorChanged));钩子截获到消息以后,把它转化为自定义的消息,然后发送给WMHooksThread线程处理,消息转化如下:边框更新消息:WM_NCPAINT,WM_NCACTIVATE客户区域更新消息:BM_SETCHECK,BM_SETSTATE,EM_SETSEL,WM_CHAR,WM_ENABLE,WM_KEYUP,WM_LBUTTONUP,WM_MBUTTONUP,WM_PALETTECHANGED,WM_RBUTTONUP,WM_SYSCOLORCHANGE,WM_SETTEXT。窗口改变消息:WM_HSCROLL,WM_VSCROLL,482,485。矩形区更新消息:WM_DESTROY窗口客户区消息:WM_PAINT鼠标消息:WM_NCMOUSEMOVE,WM_MOUSEMOVE2.WMHooksThread中用SimpleUpdateTrackernew_changes记录新的更新区域WMHooksThread::run()函数中先判断出矩形区域改变的大小,然后调用NotifyHooksRegion(constRegionr)把改变的区域记录到SimpleUpdateTrackernew_changes中。NotifyHooksRegion(constRegionr){Lockl(hook_mgr_lock);std::listWMHooks*::iteratori;for(i=hooks.begin();i!=hooks.end();i++){(*i)-new_changes.add_changed(r);if(!(*i)-notified){(*i)-notified=true;PostMessage((*i)-getHandle(),WM_USER,0,0);//把消息通知到clipper见下面一个处理函数}}}3.把更新区域拷贝到SDisplay中rfb::win32::WMHooks::processMessage(UINTmsg,WPARAMwParam,LPARAMlParam){switch(msg){caseWM_USER:{Sleep(0);Lockl(hook_mgr_lock);notified=false;new_changes.get_update(*clipper);//把更新通知到clipper中new_changes.clear();}break;}returnMsgWindow::processMessage(msg,wParam,lParam);}Cliper在下面设置rfb::win32::WMHooks::setU

文档评论(0)

lnainai_sj + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档