导读 请问谁知道哪里有远程控制软件VNC的源码? 1.Wm_hooks截获消息并转化为自定义的消息发送给WMHooksThread线程处理。 Wm_

请问谁知道哪里有远程控制软件VNC的源码?

1.Wm_hooks截获消息并转化为自定义的消息发送给WMHooksThread线程处理。 Wm_hooks自定义的消息: UINT WM_HK_WindowChanged = RegisterWindowMessage(_T("RFB.WM_Hooks.WindowChanged")); UINT WM_HK_WindowClientAreaChanged = UINT WM_HK_WindowBorderChanged = RegisterWindowMessage(_T("RFB.WM_Hooks.WindowBorderChanged")); UINT WM_HK_RectangleChanged = RegisterWindowMessage(_T("RFB.WM_Hooks.RectangleChanged")); UINT WM_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_MOUSEMOVE 2 . WMHooksThread 中用SimpleUpdateTracker new_changes记录新的更新区域 WMHooksThread::run() 函数中先判断出矩形区域改变的大小,然后调用NotifyHooksRegion(const Region& r)把改变的区域记录到SimpleUpdateTracker new_changes中。 NotifyHooksRegion(const Region& r) { Lock l(hook_mgr_lock); std::list::iterator i; 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(UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_USER: { Sleep(0); Lock l(hook_mgr_lock); notified = false; new_changes.get_update(*clipper); //把更新通知到clipper中 new_changes.clear(); } break; } return MsgWindow::processMessage(msg, wParam, lParam); } Cliper在下面设置 rfb::win32::WMHooks::setUpdateTracker(UpdateTracker* ut) { if (clipper) delete clipper; clipper = new ClippedUpdateTracker(*ut); clipper->set_clip_region(clip_region); return AddHook(this); } UpdateTracker* ut 为void SDisplay::start(VNCServer*vs)中设置 core->using_hooks = core->wm_hooks.setUpdateTracker(this); 4.把SDisplay中记录的数据传给VNCServerST 对象 在 SDisplay::processEvent(HANDLE event) { try_update = flushChangeTracker() || try_update; //把变化的区域拷贝到VNCServerST中 if (try_update) server->tryUpdate(); //把更新发送给服务器 } flushChangeTracker()实现如下: bool SDisplay::flushChangeTracker() { if (change_tracker.is_empty()) return false; change_tracker.translate(screenRect.tl.negate()); change_tracker.get_update(*server); //server 实际指向VNCServerST 对象该函数把SDisplay中的更新拷贝到VNCServerST中。 change_tracker.clear(); return true; } 两种数据更新方式:Push机制和Pull机制 Push: SdisplayCore 中IntervalTimer cursorTimer定时器,每隔10ms尝试着检查一下是否有更新,如果有更新就发送更新给客户端

vncviewer下载(vncviewer下载网址)vncviewer下载(vncviewer下载网址)


第一步: LRESULT SDisplayCore::processMessage(UINT msg, WPARAM wParam, LPARAM lParam) { case TIMER_CURSOR: display->triggerUpdate(); //SDisplay* display; } 第二步: void SDisplay::triggerUpdate() { if (core) SetEvent(updateEvent); //使事件对象为受信状态 } 第三步: SDisplay::processEvent(HANDLE event) { if (event == updateEvent) { if (try_update) server->tryUpdate(); // VNCServer* server指针 指向子类VNCServerST } } 第四步:向每一个连接的客户端发送更新 void VNCServerST::tryUpdate() { std::list::iterator ci, ci_next; for (ci = clients.begin(); ci != clients.end(); ci = ci_next) { ci_next = ci; ci_next++; (*ci)->writeFramebufferUpdateOrClose(); } }

第五步: void VNCSConnectionST::writeFramebufferUpdateOrClose() { try { writeFramebufferUpdate(); } catch(rdr::Exception &e) { close(e.str()); } } 第六步:SimpleUpdateTracker updates对象记录更新的区域,如果屏幕有更新则发送更新 void VNCSConnectionST::writeFramebufferUpdate(){ if (!update.is_empty() || writer()->needFakeUpdate() || drawRenderedCursor) { int nRects = update.numRects() + (drawRenderedCursor ? 1 : 0); writer()->writeFramebufferUpdateStart(nRects); Region updatedRegion; writer()->writeRects(update, &image_getter, &updatedRegion); // SmsgWriter * updates.subtract(updatedRegion); if (drawRenderedCursor) writeRenderedCursorRect(); writer()->writeFramebufferUpdateEnd(); requested.clear(); }

} 第七步:利用RFB协议发送更新 void SMsgWriterV3::writeFramebufferUpdateStart(int nRects) { startMsg(msgTypeFramebufferUpdate); os->pad(1); if (wsccb) nRects++; if (needSetDesktopSize) nRects++; os->writeU16(nRects); nRectsInUpdate = 0; nRectsInHeader = nRects; if (wsccb) { wsccb->writeSetCursorCallback(); wsccb = 0; } } Poll机制:客户端通过发送更新请求,请求更新某一个区域。 第一步:读取到一个更新某一个区域的请求 void SMsgReaderV3::readMsg() { case msgTypeFramebufferUpdateRequest: readFramebufferUpdateRequest(); break; } 第二步:调用网络事件处理对象handler处理事件 void SMsgReader::readFramebufferUpdateRequest() { bool inc = is->readU8(); int x = is->readU16(); int y = is->readU16(); int w = is->readU16(); int h = is->readU16(); endMsg(); handler->framebufferUpdateRequest(Rect(x, y, x+w, y+h), inc);//handler 为 SMsgHandler* handler指针 是指向VNCSConnectionST对象 } 第三步: void VNCSConnectionST::framebufferUpdateRequest(const Rect& r,bool incremental) { if (!(accessRights & AccessView)) return; SConnection::framebufferUpdateRequest(r, incremental); Region reqRgn(r); requested.assign_union(reqRgn); if (!incremental) { updates.add_changed(reqRgn); server->comparer->add_changed(reqRgn); } writeFramebufferUpdate(); } 第四步:SimpleUpdateTracker updates对象记录更新的区域,如果屏幕有更新则发送更新 void VNCSConnectionST::writeFramebufferUpdate(){ if (!update.is_empty() || writer()->needFakeUpdate() || drawRenderedCursor) { int nRects = update.numRects() + (drawRenderedCursor ? 1 : 0); writer()->writeFramebufferUpdateStart(nRects); Region updatedRegion; writer()->writeRects(update, &image_getter, &updatedRegion); // SmsgWriter * updates.subtract(updatedRegion); if (drawRenderedCursor) writeRenderedCursorRect(); writer()->writeFramebufferUpdateEnd(); requested.clear(); } } 第五步:利用RFB协议发送更新 void SMsgWriterV3::writeFramebufferUpdateStart(int nRects) { startMsg(msgTypeFramebufferUpdate); os->pad(1); if (wsccb) nRects++; if (needSetDesktopSize) nRects++; os->writeU16(nRects); nRectsInUpdate = 0; nRectsInHeader = nRects; if (wsccb) { wsccb->writeSetCursorCallback(); wsccb = 0; } }

IIS7服务器管理工具可以批量管理、定时上传下载、同步操作、数据备份、到期提醒、自动更新。

不熟悉Linux系统,怎么使用vncserver?

你安装一个带GUI版本的centos,然后上网找到相关的配置文档,按照步骤配置即可。

基本的Linux命令查看《Linux就该这么学》。服务端配置好以后,再写一个Shell,每隔一段时间修改一下权限,防止远程用户权限过大。

到网上搜使用说明,照着说明手册一步步做。

求 vnc viewer 的具体安装方法 有图片最好 谢谢

VNC(Virtual Network Computing)虚拟网络计算工具,本质上来说是一个远程显示系统,管理员通过它不仅仅可以在运行程序的本地机上察看桌面环境,而且可以从Internet上的任何地方察看远程机器的运行情况,而且它具有跨平台的特性。 Linux 要使用远程桌面需要安装VNC,好在Red Hat Enterprise Linux AS 5.0 已经自带了VNC,默认也已经安装了,只要配置一下就可以了。但是Windows客户端还是要安装的。

如何将iphone、ipad桌面同步到pc、电视、投影上显示

工具/原料iPhone、iPod

touch或iPad(需越狱);带无线网卡的电脑;无线wifi网络环境;软件:iphone端(iPod

touch或ipad,下同)为veency,电脑端为VNC

Viewer(可自行搜索下载)。步骤/方法iphone端设置过程:iphone越狱后,在Cydia程序中搜索veency并下载安装。Veency安装完成后进入iphone的“设置”,可看到增加了Mouse和Veency的设置选项。Mouse选项默认即可。Veency保证Enable处于打开状态(可用),Show

Cursor为在电脑上同步显示iphone画面时是否显示鼠标,可以根据自己的需要打开或关闭,密码建议设置,这样以后从pc访问时更加方便。iphone连上wifi,记下ip地址:以上iphone端设置完成。pc端设置过程:VNC

Viewer为绿色软件,下载即可使用。pc连上wifi,打开VNC

Viewer程序,在Server框内输入第3步中所记下的iphone的ip地址:按OK键,在密码栏输入刚才第2步在iphone上设置的密码,好了,iphone屏幕上的画面现在已经可以同步显示在电脑上了。如果显示效果有问题,可以在pc上鼠标右键当前窗口的外框,选择Options,在color

leverl选择Full(真彩色)就可以了。