﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-iniwf-随笔分类-VNC</title><link>http://www.cppblog.com/iniwf/category/9844.html</link><description>风是温柔的，雨是伤心的，云是快乐的，月是多情的，爱是迷失的，恋是醉人的，情是难忘的，天是长久的，地是永恒的</description><language>zh-cn</language><lastBuildDate>Mon, 19 Apr 2010 18:50:44 GMT</lastBuildDate><pubDate>Mon, 19 Apr 2010 18:50:44 GMT</pubDate><ttl>60</ttl><item><title>TightVNC分析文档 </title><link>http://www.cppblog.com/iniwf/archive/2010/04/17/112874.html</link><dc:creator>iniwf</dc:creator><author>iniwf</author><pubDate>Sat, 17 Apr 2010 14:45:00 GMT</pubDate><guid>http://www.cppblog.com/iniwf/archive/2010/04/17/112874.html</guid><wfw:comment>http://www.cppblog.com/iniwf/comments/112874.html</wfw:comment><comments>http://www.cppblog.com/iniwf/archive/2010/04/17/112874.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/iniwf/comments/commentRss/112874.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/iniwf/services/trackbacks/112874.html</trackback:ping><description><![CDATA[<p>&nbsp; TightVNC分析文档 <br><a href="http://www.cnblogs.com/piccolo/articles/251356.html">http://www.cnblogs.com/piccolo/articles/251356.html</a></p>
<p>Content List:</p>
<p>System Shell <br>IActiveDesktop <br>SetProcessShutdownParameters <br>One Instance Running by Mutex <br>sscanf <br>Kill ScreenSaver <br>Diable Nagle Algorithm<br>Screen Capture <br>Poll Schema <br>TightVNC<br>System Shell ：<br>1.1 IActiveDesktop<br>&nbsp;&nbsp;&nbsp; Allows a client program to manage the desktop items and wallpaper on a local computer.</p>
<p>#include </p>
<p>IActiveDesktop* active_desktop = 0;<br>CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER,<br>&nbsp;&nbsp;IID_IActiveDesktop, (void**)&amp;active_desktop);</p>
<p>1.2 SetProcessShutdownParameters<br>&nbsp;&nbsp;&nbsp; The SetProcessShutdownParameters function sets shutdown parameters for the currently calling process. This function sets a shutdown order for a process relative to the other processes in the system.</p>
<p>// Set this process to be the last application to be shut down.<br>SetProcessShutdownParameters(0x100, 0);</p>
<p>1.3 One Instance Running by Mutex<br>&nbsp;&nbsp;&nbsp; Use Win32 Mutex object to insure that only one instance is currently running in our OS.</p>
<p>const char mutexname [] = "WinVNC_Win32_Instance_Mutex";</p>
<p>BOOL vncInstHandler::Init()<br>{<br>&nbsp;// Create the named mutex<br>&nbsp;HANDLE mutex = CreateMutex(NULL, FALSE, mutexname);<br>&nbsp;if (mutex == NULL)<br>&nbsp;&nbsp;return FALSE;</p>
<p>&nbsp;// Check that the mutex didn't already exist<br>&nbsp;if (GetLastError() == ERROR_ALREADY_EXISTS)<br>&nbsp;&nbsp;return FALSE;</p>
<p>&nbsp;return TRUE;<br>}</p>
<p>1.4 sscanf<br>&nbsp;&nbsp;&nbsp; Read formatted data from a string.</p>
<p>// Check the protocol version<br>int major, minor;<br>sscanf((char *)&amp;protocol_ver, "RFB %03d.%03d\n", &amp;major, &amp;minor);</p>
<p>1.5 Kill Screen Saver</p>
<p><br>// How to kill the screen saver depends on the OS<br>switch (osversioninfo.dwPlatformId)<br>case VER_PLATFORM_WIN32_WINDOWS:<br>&nbsp;HWND hsswnd = FindWindow ("WindowsScreenSaverClass", NULL);<br>&nbsp;if (hsswnd != NULL)<br>&nbsp;&nbsp;PostMessage(hsswnd, WM_CLOSE, 0, 0); <br>&nbsp;break;<br>&nbsp;<br>case VER_PLATFORM_WIN32_NT:<br>&nbsp;HDESK hDesk = OpenDesktop(<br>&nbsp;&nbsp;&nbsp;&nbsp;"Screen-saver",<br>&nbsp;&nbsp;&nbsp;&nbsp;0,<br>&nbsp;&nbsp;&nbsp;&nbsp;FALSE,<br>&nbsp;&nbsp;&nbsp;&nbsp;DESKTOP_READOBJECTS | DESKTOP_WRITEOBJECTS<br>&nbsp;&nbsp;&nbsp;&nbsp;);<br>&nbsp;if (hDesk != NULL)<br>&nbsp;{<br>&nbsp;&nbsp;EnumDesktopWindows(hDesk, (WNDENUMPROC) &amp;KillScreenSaverFunc, 0);<br>&nbsp;&nbsp;CloseDesktop(hDesk);<br>&nbsp;&nbsp;// Pause long enough for the screen-saver to close<br>&nbsp;&nbsp;//Sleep(2000);<br>&nbsp;&nbsp;// Reset the screen saver so it can run again<br>&nbsp;&nbsp;SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, TRUE, 0, SPIF_SENDWININICHANGE); <br>&nbsp;}<br>&nbsp;break;<br>}&nbsp;</p>
<p>1.6 Disable Nagle Algorithm<br>&nbsp;&nbsp;&nbsp; Nagle Algorithm主要是用于优化小数据包的发送，用于在IP栈中缓冲小数据包，积累一定数量的小数据包一起发送。这样可以减少系统发包的数量，Nagle Algorithm实现时内部也有一个Timeout机制，但这个Timeout时间长度不能在外部设置。而且对每个IP栈的实现，这个Timeout Span 都有一个实现相关的值。</p>
<p>// Disable Nagle's algorithm<br>BOOL nodelayval = TRUE;<br>setsockopt(m_sock, IPPROTO_TCP, TCP_NODELAY, (const char *)&amp;nodelayval, sizeof(BOOL));</p>
<p><br>Screen Capture ：<br>2.1 Poll Schema<br>&nbsp;&nbsp;&nbsp; Poll方式就是最简单的一种方式了，也是大家在考虑截屏时最先想到一个解决方案。为取得系统的屏幕，poll方案每33ms轮询一次系统屏幕，将变化的部分添加加到一个UpdateRegion中。为获取这些屏幕变化的Rect,系统还采取了一种优化Polling算法，将屏幕分为32*32 pixel的小矩形块，算法给出了一个各个矩形块轮询的Order:</p>
<p>const int pollingOrder[32] = {<br>&nbsp;&nbsp;0, 16,&nbsp; 8, 24,&nbsp; 4, 20, 12, 28,<br>&nbsp;&nbsp;10, 26, 18,&nbsp; 2, 22,&nbsp; 6, 30, 14,<br>&nbsp;&nbsp;1, 17,&nbsp; 9, 25,&nbsp; 7, 23, 15, 31,<br>&nbsp;&nbsp;19,&nbsp; 3, 27, 11, 29, 13,&nbsp; 5, 21<br>};<br>获取当前屏幕鼠标图像的思路：<br>第一步：获取屏幕鼠标的HCURSOR<br>&nbsp;&nbsp;&nbsp; GetCursorPos获取屏幕鼠标位置，然后WindowFromPoint获取鼠标的拥有者窗口，GetWindowThreadProcessId获取相关线程ID,比较该ID和GetCurrentThreadId返回的ID，如果相同，通过GetCursor直接获取鼠标的HCURSOR；否则，通过AttachThreadInput连接上目标线程的Input Mechanism，再调用GetCursor获取鼠标的HCURSOR。 <br>第二步：获取HCURSOR的Bitmap</p>
<p><br>int :GetCursorSendBuffer(BYTE *pBuffer, int nSize)<br>{<br>&nbsp;....<br>&nbsp;ICONINFO IconInfo;<br>&nbsp;GetIconInfo(hcursor, &amp;IconInfo);<br>&nbsp;<br>&nbsp;BITMAP bmMask;<br>&nbsp;GetObject(IconInfo.hbmMask, sizeof(BITMAP), (LPVOID)&amp;bmMask);&nbsp;<br>&nbsp;GetBitmapBits(IconInfo.hbmMask,bmMask.bmWidthBytes * bmMask.bmHeight, m_mBits);<br>&nbsp;....<br>}</p>
<p>现在有必要对HRGN操作相关API做一下介绍</p>
<p>GetRgnBox&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 获取HRGN的边界矩形<br>GetRegionData&nbsp; 可以将一个HRGN分解为一个RECT数组，见RGNDATA结构体说明<br>CombineRgn&nbsp;&nbsp;&nbsp;&nbsp; 对HRGN操作RGN_AND，RGN_COPY，RGN_DIFF，RGN_OR或是RGN_XOR</p>
<p><br>2.2 TightVNC<br>&nbsp;&nbsp;&nbsp; TightVNC(Tight Virtual Network Computing)是一个远程桌面控制的开源软件,详情请参考<a href="http://www.tightvnc.com/">http://www.tightvnc.com</a>.下载了TightVNC的代码，分析了一下其Server部分的代码， WinVNC下的文件很多，但我们按照它们各自的功能做一下划分,其结构如下：<br>Kernel vncBuffer.cpp vncClient.cpp vncDesktop.cpp vncServer.cpp WinVNC.cpp <br>GUI vncAbout.cpp vncAcceptDialog.cpp vncAdvancedProperties.cpp vncConnDialog.cpp vncMenu.cpp vncProperties.cpp vncTimedMsgBox.cpp <br>Misc d3des.c Log.cpp MinMax.cpp RectList.cpp stdhdrs.cpp tableinitcmtemplate.cpp tableinittctemplate.cpp tabletranstemplate.cpp translate.cpp vncauth.c vncInstHandler.cpp vncKeymap.cpp vncRegion.cpp&lt; vncService.cpp <br>Network VSocket.cpp vncSockConnect.cpp vncHTTPConnect.cpp rfbproto.h <br>Encoding vncEncodeCoRRE.cpp vncEncodeHexT.cpp vncEncoder.cpp vncEncodeRRE.cpp vncEncodeTight.cpp vncEncodeZlib.cpp vncEncodeZlibHex.cpp </p>
<p>&nbsp;</p>
<p><br>其服务端的主要功能模块结构如下：<br>其核心框架就是四个类vncClient，vncServer，vncDesktop和vncBuffer.下面我就这四个类之间的联系和用途来作一下简单的分析：<br>vncServer：<br>&nbsp;&nbsp;&nbsp; vncServer主要是做如下的一些工作：容许vncClient动态的添加和删除；将本地vncDesktop对象内部状态的任何改变"传播"到各个客户端；传播客户端的鼠标和键盘事件到本地的vncDesktop对象。同时，其还创建了vncSockConnect，vncCORBAConnect和vncHTTPConnect来接受Socket,Corba和HTTP的连接。 vncServer为每个连接上来的客户端分配了一个ClientID（其实就是内部客户对象数组的Index），并且提供了对客户端管理的众多函数：</p>
<p>virtual void DisableClients(BOOL state);<br>virtual void KillClient(vncClientId client);<br>virtual void KillAuthClients();<br>virtual void KillUnauthClients();</p>
<p>virtual vncClient* GetClient(vncClientId clientid);<br>vncClientId AddClient(VSocket *socket, BOOL auth, BOOL shared);<br>virtual void RemoveClient(vncClientId client);<br>同时，vncServer还提供了对客户Teleport，Capability，KeyboardEnabled，PointerEnabled，Name，Authenticated属性的get/set方法。<br>下面我们来看一下vncServer对客户端连接上来和客户端认证成功这两个事件的处理流程：<br>vncServer::AddClient：<br>&nbsp;&nbsp;&nbsp; 首先vncServer在其内部的vncClient *m_clientmap[MAX_CLIENTS]数组中为新连接上的客户端分配一个空闲的slot，并将其作为此客户的 clientID. 然后，为此连接分配一个vncClient对象，根据传递过来的参数，设置vncClient对象的相关属性，然后调用vncClient::Init方法将vncServer的实例指针和 clientID传给vncClient实例。接着，m_clientmap[clientid] = client并将此用户加入vncServer的未认证用户链表。<br>vncServer::Authenticated(vncClientId clientid)：<br>&nbsp;&nbsp;&nbsp; 首先从未认证用户列表中根据clientid获取vncClient对象，并将其从unauth list 中删除。如果是vncServer的第一个用户，创建vncDesktop对象，并调用m_desktop-&gt;Init(this)来初始化该vncDesktop对象。接下来，为这个用户分配一个vncBuffer *buffer = new vncBuffer(m_desktop);并通过调用vncClient::SetBuffer为vncClient设置这个Buffer，最后将此用户添加到auth list中。<br>&nbsp;&nbsp;&nbsp; vncServer提供了一个用户列表的操作接口，这些接口通过将vncServer的方法调用映射到对auth list中各个客户的同样的方法的函数调用，这些方法有：</p>
<p>virtual void TriggerUpdate();<br>virtual void UpdateRect(RECT &amp;rect);<br>virtual void UpdateRegion(vncRegion &#174;ion);<br>virtual void CopyRect(RECT &amp;dest, POINT &amp;source);<br>virtual void UpdateMouse();<br>virtual void UpdateClipText(LPSTR text);<br>virtual void UpdatePalette();<br>vncDesktop:<br>&nbsp;&nbsp;&nbsp; vncDesktop是一个全局唯一的对象，根据注释，vncDesktop主要是处理从display buffer中获取数据；同时，它还利用RFBLib DLL为vncServer提供诸如鼠标移动和屏幕更新等信息。上面提到，vncServer在第一个用户连接上来时发现其m_desktop为空时就创建一个vncDesktip对象，并调用 vncDesktop::Init(this)对其初始化.在vcnDesktop::Init的实现中我们发现其创建了一个vncDesktopThread，vncDesktop的方法调用大部分都在这个vncDesktopThread里完成的.下面我们来分析一下这个线程都做了些什么:<br>vncDesktopThread::run_undetached(void *arg)：<br>&nbsp;&nbsp;&nbsp; 首先调用vncDesktop::Startup初始化，vncDesktop对象（见vncDesktop::Startup），然后就是处理桌面消息，调用 m_server-&gt;UpdateMouse()和m_server-&gt;UpdateRegion(rgncache) ，接下来调用vncServer::TriggerUpdate来发送屏幕更新到每个vncClient.然后就是处理RFB_SCREEN_UPDATE和RFB_MOUSE_UPDATE这两个注册消息。 </p>
<p>vncClient:<br>&nbsp;&nbsp;&nbsp; vncClient做了数据发送的工作，在vncClient::SendUpdate函数的实现中，我们可以看到vncClient调用SendRFBMsg首先发送 ,然后SendCursorShapeUpdate发送鼠标形状更新，SendCursorPosUpdate发送鼠标Pos更新，发送SendCopyRect，最后调用SendRectangles发送需要更新的矩形的相关数据。其实每个客户端vncClient在调用vncClient::Init初始化的时候都开了一个线程，客户端的行为基本上都是在vncClientThread::run里完成的。该线程在跟客户端交互完成了认证，Pixel格式，Encoding算法等信息的协商后，就进入一个loop循环开始接受和处理远程客户端发过来的rfbSetPixelFormat，rfbSetEncodings，rfbFramebufferUpdateRequest，rfbKeyEvent，rfbPointerEvent，rfbClientCutText消息。 </p>
<p>vncBuffer:<br>&nbsp;&nbsp;&nbsp; vncBuffer主要处理发送数据的Encoding工作，其提供了远程客户的本地视图，其主要是利用内部的vncDesktop指针来获取相关的数据</p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/chief1985/archive/2008/10/24/3138375.aspx">http://blog.csdn.net/chief1985/archive/2008/10/24/3138375.aspx</a></p>
<img src ="http://www.cppblog.com/iniwf/aggbug/112874.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/iniwf/" target="_blank">iniwf</a> 2010-04-17 22:45 <a href="http://www.cppblog.com/iniwf/archive/2010/04/17/112874.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VNC的Hextile编码原理及实现</title><link>http://www.cppblog.com/iniwf/archive/2010/04/17/112873.html</link><dc:creator>iniwf</dc:creator><author>iniwf</author><pubDate>Sat, 17 Apr 2010 14:40:00 GMT</pubDate><guid>http://www.cppblog.com/iniwf/archive/2010/04/17/112873.html</guid><wfw:comment>http://www.cppblog.com/iniwf/comments/112873.html</wfw:comment><comments>http://www.cppblog.com/iniwf/archive/2010/04/17/112873.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/iniwf/comments/commentRss/112873.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/iniwf/services/trackbacks/112873.html</trackback:ping><description><![CDATA[<p>转自：<a href="http://blog.csdn.net/chief1985/archive/2009/01/02/3687243.aspx">http://blog.csdn.net/chief1985/archive/2009/01/02/3687243.aspx</a></p>
<p><font color=#002c99>VNC</font></p>
<p><font color=#002c99>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 功能<br>在本机显示和控制别一台计算机的桌面，就像直接用那台计算机一样</font></p>
<p><font color=#002c99>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VNC的编码方式主要有</font></p>
<p><font color=#002c99>a)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Raw（0）：不进行编码，直接传送数据，是最慢的一种</font></p>
<p><font color=#002c99>b)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Copyrect（1）：对于客户端，在已经有了相同象素数据的时候比较有效，比如移动或窗口内容滚动时</font></p>
<p><font color=#002c99>c)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RRE（2）：将象素颜色相同的某一个矩形区域作为一个整体传输</font></p>
<p><font color=#002c99>d)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hextile（5）：是RRE编码的变种，把屏幕分成16x16象素的小块，每块用Raw或RRE方式转送</font></p>
<p><font color=#002c99>e)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ZRLE（16）：它结合了zlib压缩</font></p>
<p><font color=#002c99>二、Hextile原理<br>通过解释Hextile算法，说明了简单而常用的屏幕传送和压缩算法，希望对屏幕监测、传送相关的工作有所启发</font></p>
<p><font color=#002c99>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 分割</font></p>
<p><font color=#002c99>a)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 传送的图像区域被分为若干个大小为16&#215;16象素的块，如果整个矩形不是16的倍数，则最后1行（或列）的块宽度（或高度）变小</font></p>
<p><font color=#002c99>b)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这些块按从左到右，从上到下的顺序排列，屏幕中变化的块被传送，不变的不被传送</font></p>
<p><font color=#002c99>c)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于块大小是16x16，所以块内坐标XY可用一字节表示，WH可用一个字节表示</font></p>
<p><font color=#002c99>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 标志位：<br>传送每块数据的之前，先要传送一个字节的标志位，标记出该块的传送的格式，它的每一位意义如下</font></p>
<p><font color=#002c99>a)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 右一：Raw数据：不压缩，直接传送，一般此位置1时其它位都置0</font></p>
<p><font color=#002c99>b)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 右二：包含背景色数据：标志位之后需要接收背景色数据</font></p>
<p><font color=#002c99>c)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 右三：包含前景色数据：背景色之后需要接收前景色数据</font></p>
<p><font color=#002c99>d)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 右四：是否含有子块：只要该块中含有两种及两种以上颜色，则此位置1</font></p>
<p><font color=#002c99>e)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 右五：子块的颜色：如果含有两种颜色，此位置0，子块颜色用前景色；若该块中含有两种以上的颜色，此位置1，子块颜色需要单独指明</font></p>
<p><font color=#002c99>3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 块内部的编码：</font></p>
<p><font color=#002c99>a)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 计算块内部的颜色数：一种、两种、多种，并记录出现频率最多的颜色为背景色，如果仅有两种颜色，则另一颜色记为前景色</font></p>
<p><font color=#002c99>b)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 判断块内颜色数是否为一种，如果是，则先修改传送标志位，然后传送整块大小（0，0，w，h）和背景色，此块传送即完成</font></p>
<p><font color=#002c99>c)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果不是一种，则把块拆分成颜色不同的小矩形，方法如下：</font></p>
<p><font color=#002c99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 先把块复制到一块内存区中，以免破坏原始数据，暂称tmpBuf</font></p>
<p><font color=#002c99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ii.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从第一个象素开始判断，该点颜色是否与背景色相同</font></p>
<p><font color=#002c99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iii.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果不同，则分别向右和向下求得与该点颜色连续的色块</font></p>
<p><font color=#002c99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iv.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对比右色块和下色块，取出其中较大的一个，做为一个矩形色块</font></p>
<p><font color=#002c99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在tmpBuf中把此矩形填成背景色，以避免重复判断</font></p>
<p><font color=#002c99>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vi.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 继续判断下一象素点&#8230;&#8230;</font></p>
<p><font color=#002c99>d)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 记录各个矩形色块的位置（x,y,w,h），如果块内含两种以上颜色，还要记录矩形色块的颜色值</font></p>
<p><font color=#002c99>e)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一边取得矩形色块，一边判断矩形色块描述数据的总长是否大于原始数据，如果大于原始数据，则放弃取色块，标志字节Raw位(右一)置1，以Raw方式直接传送原始数据，此块传送完成</font></p>
<p><font color=#002c99>f)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果块含两种以上颜色，则将标志位的子块位（右五）置1，否则置0</font></p>
<p><font color=#002c99>g)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 传送标志位，传送矩形色块个数，然后传送各矩形块数据，块中颜色数为2时不需要传送每个矩形块的颜色数据，只传位置即可</font></p>
<p><font color=#002c99>h)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意：如果背景色或前景色与前一块(16x16块)相同，则可以不传送背景色或前景色，客户端会默认延用前一块的</font></p>
<p><font color=#002c99>三、参考实例</font></p>
<p><font color=#002c99>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 源码：</font></p>
<p><font color=#002c99>a)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 源码包：tightvnc-1.2.9.orig.tar.gz</font></p>
<p><font color=#002c99>b)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编码程序：tightvnc-1.2.9.orig/Xvnc/programs/Xserver/hw/vnc/hextile.c</font></p>
<p><font color=#002c99>c)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解码程序：rightvnc-1.2.9.orig/vncviewer/hextile.c</font></p>
<p><font color=#002c99>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参考文档</font></p>
<p><font color=#002c99>a)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VNC协议简单分析-beta+4.9.pdf&nbsp;&nbsp;&nbsp; (CSDN可下载)</font></p>
<p><font color=#002c99>b)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://blogimg.chinaunix.net/blog/upfile/070613090634.pdf">http://blogimg.chinaunix.net/blog/upfile/070613090634.pdf</a></font></p>
<p><font color=#002c99></font>&nbsp;</p>
<p><font color=#002c99>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/chief1985/archive/2009/01/02/3687243.aspx">http://blog.csdn.net/chief1985/archive/2009/01/02/3687243.aspx</a></font></p>
<img src ="http://www.cppblog.com/iniwf/aggbug/112873.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/iniwf/" target="_blank">iniwf</a> 2010-04-17 22:40 <a href="http://www.cppblog.com/iniwf/archive/2010/04/17/112873.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>winVNC 源代码分析</title><link>http://www.cppblog.com/iniwf/archive/2009/03/17/76892.html</link><dc:creator>iniwf</dc:creator><author>iniwf</author><pubDate>Tue, 17 Mar 2009 10:53:00 GMT</pubDate><guid>http://www.cppblog.com/iniwf/archive/2009/03/17/76892.html</guid><wfw:comment>http://www.cppblog.com/iniwf/comments/76892.html</wfw:comment><comments>http://www.cppblog.com/iniwf/archive/2009/03/17/76892.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/iniwf/comments/commentRss/76892.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/iniwf/services/trackbacks/76892.html</trackback:ping><description><![CDATA[转自<a href="http://blog.csdn.net/Blue_Dream_/archive/2007/08/25/1758541.aspx">http://blog.csdn.net/Blue_Dream_/archive/2007/08/25/1758541.aspx</a><br><br><font size=2>下面的内容是用 VC.NET 的调试器调试的整个源码而确定的执行流程. 在分析代码时尽量不要静态的分析代码，这样速度很慢的。利用调试器我们可以通过简单的设置断点来跟踪整个执行流程。</font>
<div><span style="FONT-SIZE: 10pt"></span></div>
<div align=center><span style="FONT-SIZE: 10pt">WINVNC </span><span style="FONT-SIZE: 10pt">调试其整体流程</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 10pt">在</span><span style="FONT-SIZE: 10pt"> <strong>WinMain</strong> </span><span style="FONT-SIZE: 10pt">中进行</span></div>
<div><span style="FONT-SIZE: 10pt">(1) </span><span style="FONT-SIZE: 10pt">初始化套接字库</span><span style="FONT-SIZE: 10pt"> VSocketSystem</span></div>
<div><span style="FONT-SIZE: 10pt">(2) </span><span style="FONT-SIZE: 10pt">解析命令行参数</span></div>
<div><span style="FONT-SIZE: 10pt">(3) </span><span style="FONT-SIZE: 10pt">调用主窗口过程</span><span style="FONT-SIZE: 10pt"> &nbsp;WinVNCAppMain</span></div>
<div><span style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></div>
<div><span style="FONT-SIZE: 10pt">&nbsp;<strong>WinVNCAppMain </strong></span><span style="FONT-SIZE: 10pt">中进行</span></div>
<div style="MARGIN-LEFT: 28.5pt; TEXT-INDENT: -23.25pt"><span style="FONT-SIZE: 10pt">(1)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 10pt">确认当前只有一个本实例运行，</span><span style="FONT-SIZE: 10pt">vncInstHandler</span></div>
<div style="MARGIN-LEFT: 28.5pt; TEXT-INDENT: -23.25pt"><span style="FONT-SIZE: 10pt">(2)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 10pt">创建</span><span style="FONT-SIZE: 10pt"> Server </span><span style="FONT-SIZE: 10pt">类</span><span style="FONT-SIZE: 10pt">, </span><span style="FONT-SIZE: 10pt">该类的作用：</span></div>
<div style="MARGIN-LEFT: 5.25pt; TEXT-INDENT: 30pt"><span style="FONT-SIZE: 10pt">动态添加和删除客户端</span></div>
<div style="MARGIN-LEFT: 5.25pt; TEXT-INDENT: 30pt"><span style="FONT-SIZE: 10pt">把本地窗口的更新发送给所有连接的客户端</span></div>
<div style="MARGIN-LEFT: 5.25pt; TEXT-INDENT: 30pt"><span style="FONT-SIZE: 10pt">把客户端的鼠标和键盘事件传递给本地</span></div>
<div style="MARGIN-LEFT: 5.25pt; TEXT-INDENT: 30pt"><span style="FONT-SIZE: 10pt">创建套套接字的连接</span></div>
<div style="MARGIN-LEFT: 28.5pt; TEXT-INDENT: -23.25pt"><span style="FONT-SIZE: 10pt">(3)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 10pt">创建菜单和托盘图标</span><span style="FONT-SIZE: 10pt"> <strong>vncMenu</strong></span></div>
<div>&nbsp;</div>
<div><strong><span style="FONT-SIZE: 10pt">vncMenu</span></strong><span style="FONT-SIZE: 10pt">中进行：</span></div>
<div style="MARGIN-LEFT: 23.25pt; TEXT-INDENT: -23.25pt"><span style="FONT-SIZE: 10pt">(1)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 10pt">构造函数中进行：</span><span style="FONT-SIZE: 10pt">创建托盘图标窗口</span></div>
<div style="TEXT-INDENT: 50pt"><span style="FONT-SIZE: 10pt">把窗口托盘图标句柄加入到</span><span style="FONT-SIZE: 10pt"> <strong>vncServer</strong>.</span><span style="FONT-SIZE: 10pt">m_notifyList </span><span style="FONT-SIZE: 10pt">中</span></div>
<div style="TEXT-INDENT: 50pt"><span style="FONT-SIZE: 10pt">初始化</span><span style="FONT-SIZE: 10pt"> vncProperties-&gt;Init </span></div>
<div style="TEXT-INDENT: 50pt">&nbsp;</div>
<div><span style="FONT-SIZE: 10pt">在调用</span><span style="FONT-SIZE: 10pt"> Init </span><span style="FONT-SIZE: 10pt">中</span><span style="FONT-SIZE: 10pt"> vncProperties-&gt;Load </span><span style="FONT-SIZE: 10pt">调用</span><span style="FONT-SIZE: 10pt"> vncProperties -&gt;ApplyUserPrefs </span><span style="FONT-SIZE: 10pt">调用</span><span style="FONT-SIZE: 10pt"> server-&gt;SockConnect </span><span style="FONT-SIZE: 10pt">完成各种线程的创建和端口邦定工作。</span></div>
<div><span style="FONT-SIZE: 10pt">在</span><span style="FONT-SIZE: 10pt"> Init </span><span style="FONT-SIZE: 10pt">中得到密码</span><span style="FONT-SIZE: 10pt">检查是否需要验证。</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 10pt">当我们双击图标时</span><span style="FONT-SIZE: 10pt">vncProperties-&gt;ApplyUserPrefs</span><span style="FONT-SIZE: 10pt">会被调用，</span></div>
<div><span style="FONT-SIZE: 10pt">vncProperties-&gt;ApplyUserPrefs </span><span style="FONT-SIZE: 10pt">调用</span><span style="FONT-SIZE: 10pt"> vncServer::SockConnect </span><span style="FONT-SIZE: 10pt">完成可能的程序重新启动。</span></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div><strong><span style="FONT-SIZE: 10pt">当有客户端连接时：</span></strong></div>
<div><span style="FONT-SIZE: 10pt">当有客户端连接时，</span><span style="FONT-SIZE: 10pt">run_undetached </span><span style="FONT-SIZE: 10pt">线程接收到连接后</span><span style="FONT-SIZE: 10pt">调用</span><span style="FONT-SIZE: 10pt"> AddClient </span><span style="FONT-SIZE: 10pt">把客户端添加到一个客户端的映射数组中</span><span style="FONT-SIZE: 10pt"> Key </span><span style="FONT-SIZE: 10pt">是</span><span style="FONT-SIZE: 10pt"> ClientSocket</span><span style="FONT-SIZE: 10pt">，值是新建的客户端的类</span><span style="FONT-SIZE: 10pt">。</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 10pt">然后创建客户端线程</span><span style="FONT-SIZE: 10pt">.</span></div>
<div><span style="FONT-SIZE: 10pt">把客户端添加到未授权客户端列表</span><span style="FONT-SIZE: 10pt">.</span></div>
<div>&nbsp;</div>
<div><strong><span style="FONT-SIZE: 10pt">客户端线程的工作</span></strong><strong>(</strong>处理与客户端相关的工作)：</div>
<div><span style="FONT-SIZE: 10pt">客户端线程类</span>vncClientThread<span style="FONT-SIZE: 10pt">的</span><span style="FONT-SIZE: 10pt">Run</span><span style="FONT-SIZE: 10pt">函数，就相当于线程函数</span><span style="FONT-SIZE: 10pt">(</span><span style="FONT-SIZE: 10pt">在线程中被调用</span><span style="FONT-SIZE: 10pt">)</span><span style="FONT-SIZE: 10pt">。</span></div>
<div><span style="FONT-SIZE: 10pt">在</span><span style="FONT-SIZE: 10pt">vncClientThread-&gt;run </span><span style="FONT-SIZE: 10pt">函数中调用</span><span style="FONT-SIZE: 10pt"> vncClientThread::InitVersion() </span><span style="FONT-SIZE: 10pt">函数，</span><span style="FONT-SIZE: 10pt"> InitVersion </span><span style="FONT-SIZE: 10pt">函数中工作如下：</span></div>
<div style="MARGIN-LEFT: 23.25pt; TEXT-INDENT: -23.25pt"><span style="FONT-SIZE: 10pt">(1)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 10pt">首先向客户端发送自己的</span><span style="FONT-SIZE: 10pt">(</span><span style="FONT-SIZE: 10pt">服务器方的</span><span style="FONT-SIZE: 10pt">)</span><span style="FONT-SIZE: 10pt">版本号</span></div>
<div style="MARGIN-LEFT: 23.25pt; TEXT-INDENT: -23.25pt"><span style="FONT-SIZE: 10pt">(2)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 10pt">接收客户端的版本号</span></div>
<div style="MARGIN-LEFT: 23.25pt; TEXT-INDENT: -23.25pt"><span style="FONT-SIZE: 10pt">(3)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 10pt">验证版本号</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 10pt">客户端线程类</span>vncClientThread<span style="FONT-SIZE: 10pt">的</span><span style="FONT-SIZE: 10pt">Run</span><span style="FONT-SIZE: 10pt">函数调用</span>vncClientThread-&gt;InitAuthenticate</div>
<div>InitAuthenticate的工作是：</div>
<div style="MARGIN-LEFT: 23.25pt; TEXT-INDENT: -23.25pt"><span style="FONT-SIZE: 10pt">(1)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 10pt">给客户端发送认证请求</span></div>
<div style="MARGIN-LEFT: 23.25pt; TEXT-INDENT: -23.25pt"><span style="FONT-SIZE: 10pt">(2)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 10pt">验证客户端是否合法</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 10pt">vncDesktopThread-&gt;run_undetached </span><span style="FONT-SIZE: 10pt">线程的工作</span><span style="FONT-SIZE: 10pt">(</span><strong><span style="FONT-SIZE: 10pt">最核心的功能</span></strong><span style="FONT-SIZE: 10pt">)</span><span style="FONT-SIZE: 10pt">：</span></div>
<div style="MARGIN-LEFT: 23.25pt; TEXT-INDENT: -23.25pt"><span style="FONT-SIZE: 10pt">(1)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 10pt">该线程调用</span><span style="FONT-SIZE: 10pt">vncDesktop::Startup()</span><span style="FONT-SIZE: 10pt">：</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 10pt">进行所有的初始化工作：</span></div>
<div style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt"><span style="FONT-SIZE: 10pt">1.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 10pt">设置象素格式和位图信息</span></div>
<div style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt"><span style="FONT-SIZE: 10pt">2.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 10pt">设置各种系统</span><span style="FONT-SIZE: 10pt"> Hook, </span><span style="FONT-SIZE: 10pt">添加系统挂钩，包括屏幕</span><span style="FONT-SIZE: 10pt">, </span><span style="FONT-SIZE: 10pt">键盘，鼠标。</span></div>
<div style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt"><span style="FONT-SIZE: 10pt">3.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 10pt">设置一个定时器来处理拉模式</span><span style="FONT-SIZE: 10pt">(<strong>polling mode</strong>)</span><span style="FONT-SIZE: 10pt">，每一秒钟执行一次</span><span style="FONT-SIZE: 10pt">. </span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: 20pt"><span style="FONT-SIZE: 10pt">这样</span><span style="FONT-SIZE: 10pt"> <strong>TriggerUpdate </strong></span><span style="FONT-SIZE: 10pt">例程每秒钟被执行一次</span><span style="FONT-SIZE: 10pt">.</span></div>
<div style="MARGIN-LEFT: 23.25pt; TEXT-INDENT: -23.25pt"><span style="FONT-SIZE: 10pt">(2)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 10pt">设置处理剪切板消息</span></div>
<div style="MARGIN-LEFT: 23.25pt; TEXT-INDENT: -23.25pt"><span style="FONT-SIZE: 10pt">(3)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 10pt">创建一个缓存区域对象。所有的区域更新消息都被缓存在该对象中，仅当</span><span style="FONT-SIZE: 10pt"> <strong>TriggerUpdate</strong></span><span style="FONT-SIZE: 10pt">被触发时，才把这些消息传给所有的客户端。</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 10pt">认证流程：</span></div>
<div style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt"><span style="FONT-SIZE: 10pt">1.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 10pt">版本认证过程：</span></div>
<div style="MARGIN-LEFT: 39pt"><span style="FONT-SIZE: 10pt">去掉该版本认证过程。</span></div>
<div style="MARGIN-LEFT: 39pt"><span style="FONT-SIZE: 10pt">该版本认证过程：</span><span style="FONT-SIZE: 10pt">大致是服务器端</span></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WinVNC </span><span style="FONT-SIZE: 10pt">客户端分析</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 10pt">WinMain</span><span style="FONT-SIZE: 10pt">&#224;</span><span style="FONT-SIZE: 10pt">VNCviewerApp32::NewConnection(</span><span style="FONT-SIZE: 10pt">创建</span><span style="FONT-SIZE: 10pt">ClientConnection </span><span style="FONT-SIZE: 10pt">对象</span><span style="FONT-SIZE: 10pt">)</span><span style="FONT-SIZE: 10pt">&#224;</span><span style="FONT-SIZE: 10pt"> ClientConnection::Run</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 10pt">ClientConnection::Run </span><span style="FONT-SIZE: 10pt">的功能：</span></div>
<div style="MARGIN-LEFT: 23.25pt; TEXT-INDENT: -23.25pt"><span style="FONT-SIZE: 10pt">(1)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 10pt">弹出窗口，接收用户输入的服务器的</span><span style="FONT-SIZE: 10pt">IP</span><span style="FONT-SIZE: 10pt">地址和端口号</span></div>
<div style="MARGIN-LEFT: 23.25pt; TEXT-INDENT: -23.25pt"><span style="FONT-SIZE: 10pt">(2)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 10pt">取得连接信息，进行连接</span><span style="FONT-SIZE: 10pt"> ClientConnection::GetConnectDetails()</span></div>
<div style="MARGIN-LEFT: 23.25pt; TEXT-INDENT: -23.25pt"><span style="FONT-SIZE: 10pt">(3)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 10pt">版本信息的认证</span><span style="FONT-SIZE: 10pt"> &nbsp;ClientConnection::NegotiateProtocolVersion()</span></div>
<div style="MARGIN-LEFT: 23.25pt; TEXT-INDENT: -23.25pt"><span style="FONT-SIZE: 10pt">(4)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 10pt">进行权限的验证</span><span style="FONT-SIZE: 10pt"> &nbsp;ClientConnection::Authenticate();</span></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div><strong><span style="FONT-SIZE: 10pt">修改时间</span></strong><span style="FONT-SIZE: 10pt">：</span><span style="FONT-SIZE: 10pt">2007</span><span style="FONT-SIZE: 10pt">年</span><span style="FONT-SIZE: 10pt">8</span><span style="FONT-SIZE: 10pt">月</span><span style="FONT-SIZE: 10pt">25</span><span style="FONT-SIZE: 10pt">日</span><span style="FONT-SIZE: 10pt">星期六</span></div>
<div><strong><span style="FONT-SIZE: 10pt">修改内容</span></strong><span style="FONT-SIZE: 10pt">：去掉了</span><span style="FONT-SIZE: 10pt"> AuthDialog.cpp</span><span style="FONT-SIZE: 10pt">，</span><span style="FONT-SIZE: 10pt">AuthDialog.h </span><span style="FONT-SIZE: 10pt">，这个认证会话框的内容是客户端输入服务器的密码才能对服务器端进行远程控制。</span></div>
<div>&nbsp;</div>
<div><strong><span style="FONT-SIZE: 10pt">修改时间</span></strong><span style="FONT-SIZE: 10pt">：</span><span style="FONT-SIZE: 10pt">8/25/2007 9:43:10 AM</span></div>
<div><strong><span style="FONT-SIZE: 10pt">修改内容：</span></strong><span style="FONT-SIZE: 10pt">去掉</span><span style="FONT-SIZE: 10pt"> log.cpp </span><span style="FONT-SIZE: 10pt">和</span><span style="FONT-SIZE: 10pt">log.h </span><span style="FONT-SIZE: 10pt">内容</span></div>
<div><span style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="FONT-SIZE: 10pt">这个是对各个操作结果内容的记录</span></div>
<div>&nbsp;</div>
<div align=center><strong>对于客户端的代码</strong></div>
<div><span style="FONT-SIZE: 10pt">该功能实现的一个重要方法：</span></div>
<div><span style="FONT-SIZE: 10pt">ClientConnection </span><span style="FONT-SIZE: 10pt">类的创建主显示窗口，窗口过程是静态方法</span></div>
<div><span style="FONT-SIZE: 10pt">Static ClientConnection::WinProc</span></div>
<div><span style="FONT-SIZE: 10pt">ClientConnection </span><span style="FONT-SIZE: 10pt">类的创建一个线程，</span></div>
<div><span style="FONT-SIZE: 10pt">在线程中调用了</span><span style="FONT-SIZE: 10pt"> ClientConnection ::run_undetached </span><span style="FONT-SIZE: 10pt">这就相当于该类中的方法是线程方法一样。</span></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 10pt">ClientConnection::run_undetached </span><span style="FONT-SIZE: 10pt">分析</span><span style="FONT-SIZE: 10pt">:</span></div>
<div><span style="FONT-SIZE: 10pt">run_undetached </span><span style="FONT-SIZE: 10pt">是假的线程方法</span><span style="FONT-SIZE: 10pt">()</span><span style="FONT-SIZE: 10pt">中</span></div>
<div><span style="FONT-SIZE: 10pt">实现方法可能是：该方法是虚函数，在基类中就已经把该方法作为线程的参数传给了</span><span style="FONT-SIZE: 10pt">start </span><span style="FONT-SIZE: 10pt">函数，该参数是作为函数指针传递的，这样在</span><span style="FONT-SIZE: 10pt">Start</span><span style="FONT-SIZE: 10pt">函数中利用函数指针调用该函数就可以了。</span></div>
<div><span style="FONT-SIZE: 10pt">继承类只需把</span><span style="FONT-SIZE: 10pt">run_undetached</span><span style="FONT-SIZE: 10pt">当做线程方法实现就行了。</span><strong><span style="FONT-SIZE: 10pt">(</span></strong><strong><span style="FONT-SIZE: 10pt">这样做的原因是：</span></strong><strong><span style="FONT-SIZE: 10pt">在线程中不允许线程方法作为其成员，编译不过，是调用约定的问题</span></strong><span style="FONT-SIZE: 10pt">) </span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 10pt">该例程的实现过程：</span></div>
<div><span style="FONT-SIZE: 10pt">接收服务器端发送过来的消息类型</span><span style="FONT-SIZE: 10pt">: frame </span><span style="FONT-SIZE: 10pt">更新，</span><span style="FONT-SIZE: 10pt">ReadBell </span><span style="FONT-SIZE: 10pt">等。然后</span><span style="FONT-SIZE: 10pt"> switch </span><span style="FONT-SIZE: 10pt">进入对应的分。</span></div>
<div><span style="FONT-SIZE: 10pt">对于</span><span style="FONT-SIZE: 10pt"> FrameUpdate </span><span style="FONT-SIZE: 10pt">的后续处理是：</span></div>
<div style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt"><span style="FONT-SIZE: 10pt">1.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 10pt">读取服务器端更新的</span><span style="FONT-SIZE: 10pt">Rect</span><span style="FONT-SIZE: 10pt">数目</span><span style="FONT-SIZE: 10pt"> RectCount</span><span style="FONT-SIZE: 10pt">，然后进入</span><span style="FONT-SIZE: 10pt">for</span><span style="FONT-SIZE: 10pt">循环</span><span style="FONT-SIZE: 10pt">,</span><span style="FONT-SIZE: 10pt">次数</span><span style="FONT-SIZE: 10pt">RectCount</span></div>
<div style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt"><span style="FONT-SIZE: 10pt">2.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 10pt">读取每个</span><span style="FONT-SIZE: 10pt">Rect</span><span style="FONT-SIZE: 10pt">的头部信息，确定这个</span><span style="FONT-SIZE: 10pt">Rect</span><span style="FONT-SIZE: 10pt">的坐标和宽度和高度，以及编码信息</span></div>
<div style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt"><span style="FONT-SIZE: 10pt">3.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 10pt">根据编码信息进入</span><span style="FONT-SIZE: 10pt">swtich </span><span style="FONT-SIZE: 10pt">的特定分支</span><span style="FONT-SIZE: 10pt">, </span><span style="FONT-SIZE: 10pt">接收真正的数据</span></div>
<div style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt"><span style="FONT-SIZE: 10pt">4.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 10pt">把接收到的</span><span style="FONT-SIZE: 10pt"> Rect </span><span style="FONT-SIZE: 10pt">区域坐标转换成</span><span style="FONT-SIZE: 10pt"> Windows </span><span style="FONT-SIZE: 10pt">坐标。</span></div>
<img src ="http://www.cppblog.com/iniwf/aggbug/76892.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/iniwf/" target="_blank">iniwf</a> 2009-03-17 18:53 <a href="http://www.cppblog.com/iniwf/archive/2009/03/17/76892.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>远程监控 vnc</title><link>http://www.cppblog.com/iniwf/archive/2009/03/17/76807.html</link><dc:creator>iniwf</dc:creator><author>iniwf</author><pubDate>Mon, 16 Mar 2009 16:04:00 GMT</pubDate><guid>http://www.cppblog.com/iniwf/archive/2009/03/17/76807.html</guid><wfw:comment>http://www.cppblog.com/iniwf/comments/76807.html</wfw:comment><comments>http://www.cppblog.com/iniwf/archive/2009/03/17/76807.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/iniwf/comments/commentRss/76807.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/iniwf/services/trackbacks/76807.html</trackback:ping><description><![CDATA[转自<a href="http://hi.baidu.com/joyjjjz/blog/item/8f349b253154fa6435a80f50.html">http://hi.baidu.com/joyjjjz/blog/item/8f349b253154fa6435a80f50.html</a><br><br>
<div class=tit>远程监控 vnc</div>
<div class=date>2008-02-29 16:00</div>
<table style="TABLE-LAYOUT: fixed">
    <tbody>
        <tr>
            <td>
            <div class=cnt id=blog_text><a href="http://topic.csdn.net/t/20031028/10/2402093.html" target=_blank><u><font color=#0000ff>最佳的75个安全工具</font></u></a>：这次评选出来的75个最佳安全工具在网络安全领域都是一些很有代表性的软件，对于那些在网络安全方面不知从何处开始的新手们来说，这对他们有相当的参考价值。 <font size=3><strong><br><br>vnc</strong></font><br><br><a href="http://www.realvnc.com/index.html" target=_blank><u><font color=#0000ff>RealVNC</font></u></a> provides remote control software which lets you see and interact with desktop applications across any network.<br><br><a href="http://www.realvnc.com/docs/rfbproto.pdf" target=_blank><u><font color=#0000ff>RFB protocol</font></u></a><br><br>VNC stands for <a href="http://www.csd.uwo.ca/~magi/doc/vnc/faq.html" target=_blank><u><font color=#0000ff>Virtual Network Computing</font></u></a>. It is, in essence, a remote display system which allows you to view a computing 'desktop' environment not only on the machine where it is running, but from anywhere on the Internet and from a wide variety of machine architectures. <br><br><a href="http://blog.csdn.net/Blue_Dream_/archive/2007/08/25/1758541.aspx" target=_blank><u><font color=#0000ff>winVNC 源代码分析</font></u></a>：下面的内容是用 VC.NET 的调试器调试的整个源码而确定的执行流程. 在分析代码时尽量不要静态的分析代码，这样速度很慢的。利用调试器我们可以通过简单的设置断点来跟踪整个执行流程。<br><br><a href="http://blog.edu.cn/user2/neilxp/archives/2006/1171703.shtml" target=_blank><font color=#0000ff><u>RFB中的编码方式</u></font></a><br><br><a href="http://blog.edu.cn/user2/neilxp/archives/2006/1133696.shtml" target=_blank><u><font color=#0000ff>RealVNC VNCViewer 代码注释</font></u></a><br><br>A8:<br>connection --&gt; image updata --&gt;mouse / key<br>rfb 里是处理通信部分的 xxxReader,xxxWriter..<br>rdr 里面是图像的处理 bmp to jpg,jpg to bmp<br>图像部分需要稍微改动,GDI,Xwindow<br><font size=3><strong><br>vnc中使用的类，以及部分头文件摘要</strong></font><br>
            <p class=MsoNormal><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>FileVersionInfo: </span><span>可以获取</span><span>exe</span><span>文件的各种信息</span></p>
            <p class=MsoNormal><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>VNCServer - abstract interface implemented by the RFB library.<span> </span>The back-end code calls the relevant methods as appropriate<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
            <p class=MsoNormal><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>The PixelBuffer class encapsulates the PixelFormat and dimensions of a block of pixel data.<span>&nbsp;&nbsp;&nbsp; </span></span></p>
            <p class=MsoNormal><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>SConnection - class on the server side representing a connection to a client.<span> </span>A <span></span>derived class should override methods appropriately.<span> </span></span></p>
            <p class=MsoNormal><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>The WMNotifier is used to get callbacks indicating changes in the state of the system, for instance in the size/format/palette of the display. The WMNotifier contains a Win32 window, which receives notifications of system events and stores them.<span> </span>Whenever processEvent is called, any incoming events are processed and the appropriate notifier called.<span> </span></span></p>
            <p class=MsoNormal><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>rdr::InStream <st1:city><st1:place>marshalls</st1:place></st1:city> data from a buffer stored in RDR (RFB Data Representation).</span></p>
            <p class=MsoNormal><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>FdInStream streams from a file descriptor.</span></p>
            <p class=MsoNormal><span></span></p>
            <p class=MsoNormal><span><span><br></span></span></p>
            <p class=MsoNormal><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>EventManager.h: Win32 event manager. Caller supplies event &amp; handler pairs and then uses getMessage() in place of ::GetMessage() in the main loop. EventManager calls the event handler whenever the event is set</span></p>
            <p class=MsoNormal><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Configuration.h: This header defines a set of classes used to represent configuration parameters of different types<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br></span></span></p>
            <p class=MsoNormal><span><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; RegConfig.h: Class which monitors the registry and reads in the registry settings whenever they change, or are added or removed.<br></span></span></p>
            <font size=3><strong>拷屏</strong></font><br><br><a href="http://blog.joycode.com/jiangsheng/posts/10410.aspx" target=_blank><u><font color=#0000ff>高效屏幕录制： </font></u></a>屏幕录制有着广泛的用途，主要用于建立演示培训，或者远程屏幕监视和广播。由于屏幕的大小和色深通常很高，而且具有大块背景色、窗口拖动/卷动造成的内容移动和菜单弹出造成的瞬时变化等特性，因此需要在数据采集、压缩和传输/存储上多加考虑。<br><br><a href="http://www.codeproject.com/KB/dialog/screencap.aspx" target=_blank><u><font color=#800080>Various methods for capturing the screen</font></u></a>：Explains techniques for capturing the screen programmatically。Create Movie(.avi) From HBitmap<br><br><a href="http://blog.csdn.net/blue_dream_/archive/2007/08/24/1756961.aspx" target=_blank><u><font color=#800080>实时屏幕传输</font></u></a>：Mirror driver是Windows NT下的一种显示驱动，系统发往物理显卡的所有命令也同样发送给Mirror driver，可以在Mirror driver中可以模拟出当前系统的显示内容，因此称之为mirror 。利用这个特性，就能很方便的捕获到当前屏幕的内容以及系统要绘制的区域（变化部分），是一种速度很快的截屏方法<br><br>...<br><br><a href="http://topic.csdn.net/t/20060320/22/4627738.html" target=_blank><u><font color=#800080>为了实现远程桌面控制，如何高效率传输屏幕画面？我正着急呢！高手请指点啊</font></u></a>！！！ 讨论很精彩<br></div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cppblog.com/iniwf/aggbug/76807.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/iniwf/" target="_blank">iniwf</a> 2009-03-17 00:04 <a href="http://www.cppblog.com/iniwf/archive/2009/03/17/76807.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高效屏幕录制</title><link>http://www.cppblog.com/iniwf/archive/2009/03/17/76806.html</link><dc:creator>iniwf</dc:creator><author>iniwf</author><pubDate>Mon, 16 Mar 2009 16:01:00 GMT</pubDate><guid>http://www.cppblog.com/iniwf/archive/2009/03/17/76806.html</guid><wfw:comment>http://www.cppblog.com/iniwf/comments/76806.html</wfw:comment><comments>http://www.cppblog.com/iniwf/archive/2009/03/17/76806.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/iniwf/comments/commentRss/76806.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/iniwf/services/trackbacks/76806.html</trackback:ping><description><![CDATA[转自<a href="http://blog.csdn.net/jia162/archive/2008/06/04/2509894.aspx">http://blog.csdn.net/jia162/archive/2008/06/04/2509894.aspx</a><br><br>
<p style="FONT-SIZE: 12pt">屏幕录制有着广泛的用途，主要用于建立演示培训，或者远程屏幕监视和广播。由于屏幕的大小和色深通常很高，而且具有大块背景色、窗口拖动/卷动造成的内容移动和菜单弹出造成的瞬时变化等特性，因此需要在数据采集、压缩和传输/存储上多加考虑。</p>
<h2>录制之前</h2>
<p style="FONT-SIZE: 12pt">录制之前，应该选择录制方法，压缩方式和录制范围。</p>
<p style="FONT-SIZE: 12pt">有必要尽可能缩小录制的区域以减少数据量。在录制开始之前，可以让用户指定录制的范围，例如全屏幕，指定窗口，指定/自适应坐标等等。小的录制区域意味着更少的原始数据。</p>
<p style="FONT-SIZE: 12pt">尽可能降低录制的色深以减少数据量。通常，用于简单教学的录制只需要256色。</p>
<p style="FONT-SIZE: 12pt">录制之前，应该停用屏幕保护，桌布和活动桌面的一些特性以避免不必要的录制。</p>
<h3>录制方法</h3>
<p style="FONT-SIZE: 12pt">录制分两种方式，一种是推模式，也就是录制模块不断录制数据，一种是拉模式，录制模块在需要的时候才录制数据。对于 低带宽的场合，拉模式可以有效的减少原始数据量。对于需要基本无损回放的场合，推模式在监测到屏幕变化时就录制数据，可以减少视频质量的损失。在推模式下 需要选取录制的时机，以避免大量的重复数据。</p>
<h3>压缩编码</h3>
<p style="FONT-SIZE: 12pt">适当的编码方式可以有效地减少录制时的资源占用。</p>
<ul>
    <li>联合图像专家组(Joint Photographic Experts Group,JPEG)编码<br>在有损压缩时，对于静态图像具有比较好的压缩比率。但是有损压缩可能会使得屏幕上的文字变得模糊。
    <li>运动图像专家（MPEG）组编码<br>适合运动的图像，但是剧烈变化的图像，例如菜单的弹出，可能会暂时使录制的视频质量降低，以及CPU资源占用的升高。
    <li><a id=main href="http://www.realvnc.com/howitworks.html" name=main>远程帧缓冲（Remote Frame Buffer,RFB）</a>编码<br>包括对于窗口拖动/卷动造成的内容移动造成的矩形复制(copy rectangle)和背景色的优化。对于每个矩形，可以有各种不同的编码方式，例如MPEG或者JPEG。
    <li>分块比较编码<br>将每次录制的屏幕分块和上次录制的屏幕内容比较，如果某块抽样变化了，那么编码整个块。对于每个块，可以有各种不同的编码方式，例如MPEG或者JPEG。 </li>
</ul>
<p style="FONT-SIZE: 12pt">根据录制内容的不同，以及编码设置的不同（例如质量和分块大小设置），以上编码方式可能各有所长。</p>
<h3>额外的考虑</h3>
<ul>
    <li>扫描线<br>隔行扫描而不是逐行扫描屏幕数据可以有效地减少录制的数据量，同时录制的视频质量降低不大。
    <li>录制时机<br>虚拟显示设备或者适当的系统钩子可以使你在屏幕变化或者即将变化时得到通知，这样可以尽可能地减少录制的次数。参见<a href="http://ultravnc.sourceforge.net/">http://ultravnc.sourceforge.net</a> 以及<a href="http://www.realvnc.com/">http://www.realvnc.com</a> 提供的VNC源代码中的VNCHooks。
    <li>DirectX<br>使 用DirectX可以进行直接的显存访问，这对提高性能很有好处。但是也由于 DirectX的特性，某些使用DirectX等技术的程序可能无法录制，例如大多数游戏和媒体播放器，即使可以录制也比较慢。录制这样的程序的窗口内容 的方法是局部或者全局地禁用部分或者全部DirectX加速功能。
    <li>机器码<br>在录制和编码过程中，使用机器码模块可以有效地加强程序的性能。例如XVID的很多核心模块就是机器码。
    <li>分块的大小<br>大的分块意味着录制时录制的次数少，但是小的分块可能意味着较少的数据量。对于依赖于背景色的编码方式，分块大小也影响数据量。 </li>
</ul>
<p style="FONT-SIZE: 12pt">?</p>
<h2>其他录制内容</h2>
<h3>鼠标，水印和其他图像</h3>
<p style="FONT-SIZE: 12pt">在录制图像的同时，可能同时需要在屏幕内容上叠加其他图像，例如鼠标或者水印。这可以通过在每一次录制的图像上在指定位置上叠加指定的图像来完成。</p>
<p style="FONT-SIZE: 12pt">//Draw the Cursor <br>if (g_recordcursor==1) {<br>&nbsp;&nbsp;&nbsp; ICONINFO iconinfo ;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOOL ret;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret = GetIconInfo( hcur, &amp;iconinfo );&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ret) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xPoint.x -= iconinfo.xHotspot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xPoint.y -= iconinfo.yHotspot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//need to delete the hbmMask and hbmColor bitmaps<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//otherwise the program will crash after a while after running out of resource<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (iconinfo.hbmMask) DeleteObject(iconinfo.hbmMask);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (iconinfo.hbmColor) DeleteObject(iconinfo.hbmColor);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:: DrawIcon( hMemDC, xPoint.x, xPoint.y, hcur); <br><br>}</p>
<p style="FONT-SIZE: 12pt">这里hMemDC包含已经录制的屏幕内容，hcur表示当前缓存的光标（因为光标不是每次录制都变化，所以缓存起来效率较高）。</p>
<h3>音频</h3>
<p style="FONT-SIZE: 12pt">为了丰富媒体内容，可能有必要在录制屏幕时同时录制音频。屏幕录制占用了大量资源时，有可能造成音频的录制和压缩慢于预计的频率，结果是录制的媒体音调降低，以及可能的同步问题。</p>
<h2>加密</h2>
<p style="FONT-SIZE: 12pt">如果录制的内容需要保密，那么必须考虑实施加密的性能和可行性。一般来说，为每个会话产生一个不同的密钥来进行初步的加密就可以了。</p>
<p style="FONT-SIZE: 12pt">?</p>
<div style="FONT-SIZE: 12pt">&nbsp; 2004年1月1日 0:10 - (阅读:30854;评论:85) </div>
<!--
<rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:description
rdf:about="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx"
dc:identifier="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx"
dc:title="高效屏幕录制"
trackback:ping="http://blog.joycode.com/jiangsheng/services/trackbacks/10410.aspx"   />
</rdf:rdf>
--><a name=feedback></a><a name=feedback></a>
<h3><a name=feedback>&nbsp;</a></h3>
<a name=feedback></a>
<h3><a name=feedback>反馈</a></h3>
<a name=feedback></a>
<div style="FONT-SIZE: 12pt"><a name=feedback></a>
<div style="FONT-SIZE: 12pt"><a name=feedback></a><a title="permalink: 回复: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#10434">#</a>&nbsp;<a name=10434></a>回复: 高效屏幕录制 2004-1-1 12:47 <a id=Comments_ascx_CommentList_ctl00_NameLink href="http://blog.joycode.com/ghj/" target=_blank>ghj1976</a> </div>
<div style="FONT-SIZE: 12pt">^&amp;^ <br><br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: 回复: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#10438">#</a>&nbsp;<a name=10438></a>回复: 高效屏幕录制 2004-1-1 18:19 <a id=Comments_ascx_CommentList_ctl01_NameLink target=_blank>s22</a> </div>
<div style="FONT-SIZE: 12pt">有相关的优秀的开源的软件? <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: 回复: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#10660">#</a>&nbsp;<a name=10660></a>回复: 高效屏幕录制 2004-1-5 12:32 <a id=Comments_ascx_CommentList_ctl02_NameLink href="http://blog.joycode.com/jiangsheng/" target=_blank>jiangsheng</a> </div>
<div style="FONT-SIZE: 12pt">VNC就是 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: 回复: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#13175">#</a>&nbsp;<a name=13175></a>回复: 高效屏幕录制 2004-2-16 20:34 <a id=Comments_ascx_CommentList_ctl03_NameLink target=_blank>shootingstar</a> </div>
<div style="FONT-SIZE: 12pt">jiangsheng : <br>你好，前一段时间我研究了一下VNC的源代码，发现现在最好的截屏方法是Mirror Driver，ultravnc就是用了这种技术，可是它的这部分代码并没有公开。我搜索到有一个有一个Winvncdrv也实现了这个功能，但是网上提 供的网址不能够访问了。不知道你是否有这方面编程经验或者源代码。 <br>我的邮箱地址是zhouhuis22@sina.com，希望能够得到你的回复。 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: 回复: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#13275">#</a>&nbsp;<a name=13275></a>回复: 高效屏幕录制 2004-2-18 17:37 <a id=Comments_ascx_CommentList_ctl04_NameLink href="http://blog.joycode.com/jiangsheng/" target=_blank>jiangsheng</a> </div>
<div style="FONT-SIZE: 12pt">经验没有，不过WindowsDDK里面好像有Mirror Driver的例子 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: 回复: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#17295">#</a>&nbsp;<a name=17295></a>回复: 高效屏幕录制 2004-3-25 22:52 <a id=Comments_ascx_CommentList_ctl05_NameLink target=_blank>test</a> </div>
<div style="FONT-SIZE: 12pt">请教，如果做一个远程遥控软件，截取屏幕用哪种方法比较好？ <br><br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: 回复: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#20769">#</a>&nbsp;<a name=20769></a>回复: 高效屏幕录制 2004-5-6 0:50 <a id=Comments_ascx_CommentList_ctl06_NameLink target=_blank>hudan</a> </div>
<div style="FONT-SIZE: 12pt">你说： <br>某些使用DirectX等技术的程序可能无法录制，例如大多数游戏和媒体播放器 <br><br>请问： <br>对于使用了DirectX的游戏来说，有没有办法录制？ <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#28364">#</a>&nbsp;<a name=28364></a>re: 高效屏幕录制 2004-7-24 16:38 <a id=Comments_ascx_CommentList_ctl07_NameLink target=_blank>softworm</a> </div>
<div style="FONT-SIZE: 12pt">唉， <br>近段时间我被win32下的屏幕录制和屏幕广播弄得焦头烂额， <br><br>不知道大家可否交流一下这方面的经验， <br><br>这段时间里我分析了RealVNC的源码：包括VNCHook，WinVNC的屏幕截取方法，双缓冲管理方法和VNCViewer的刷写方法， <br><br>另 外，看了这篇文章后，我又看了一遍，MIRROR Driver的源码(这东西微软没有更新win 2k 的DDK和win2003 的DDK的都是一样的)，对两种屏幕录制的方法(像VNC哪样在用户模式下的屏幕截取，和像一般商业的教学软件里的，在内核模式下的屏幕截取)大致了解， 但是无法结合两种方法的优点~~~~。 <br><br>针对这两种屏幕录制，我有以下感觉： <br>VNC-like:VNC很巧妙地利用了 Win32下的消息机制，通过系统钩子的通知和GDI引擎的位传送(BitBlt)在 DibSection上完成屏幕截取，并且通过双倍桢缓冲机制减少传送像素数据所需的网络带宽，VNC能做成这样，确实是很让我惊讶，但是，在 RealVNC自己写的WinVNC里面，我觉得，Win32的消息机制会造成屏幕截取的较大延迟，而且使用了BitBlt来截屏，照样是截取不了 DirectX或电影的画面，另外，在用户模式下，VNC的内存容量、带宽的占用是很大的(在1024X768@32bpp下，需要3 X 1024X768 X4 bytes约等于4~5M的空间，另外还有3条线程在协调工作) <br><br>Mirror-Driver-like:Mirror Driver的好处是可以直接利用硬件，达到用户模式下让人难以企及的&#8220;实时&#8221;，然而，在内核模式下却好像难以利用VNC哪种钩子带来的好处(CPU占用 率低，因为需要历遍的像素数量少得多)，最大的问题还是在于我不知道怎样把内核模式里面的数据怎样带到用户模式中去(因为要发送到网络上~~~~~~~) shit~~~ <br><br>GetCurrentImage(...)好像可以把DirectX的图像也截取下来，不知道能不能替代BitBlt来完成所有的屏幕截呢~~~~~~~? <br><br>希望能与正在从事这方面开发的程序员交流一下 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#29681">#</a>&nbsp;<a name=29681></a>re: 高效屏幕录制 2004-8-5 13:43 <a id=Comments_ascx_CommentList_ctl08_NameLink href="http://blog.csdn.net/jiangsheng" target=_blank>jiangsheng</a> </div>
<div style="FONT-SIZE: 12pt">VNC很大的，代码我也没看全 <br>可以去看文档，有问题去邮件列表问 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#30193">#</a>&nbsp;<a name=30193></a>re: 高效屏幕录制 2004-8-10 13:23 <a id=Comments_ascx_CommentList_ctl09_NameLink target=_blank>wdh</a> </div>
<div style="FONT-SIZE: 12pt">请问：用什么方式可以达到高帧率，低消耗呢？我看到一个软件捕捉屏幕的速度远高于vnc而其cpu开销只有vnc的1/3。高手可否告知其使用的是什么捕捉屏幕的方法？ <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#30364">#</a>&nbsp;<a name=30364></a>re: 高效屏幕录制 2004-8-11 17:28 <a id=Comments_ascx_CommentList_ctl10_NameLink href="http://blog.csdn.net/jiangsheng" target=_blank>jiangsheng</a> </div>
<div style="FONT-SIZE: 12pt">那可能是从设备驱动层抓的图 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#35493">#</a>&nbsp;<a name=35493></a>re: 高效屏幕录制 2004-10-14 15:57 <a id=Comments_ascx_CommentList_ctl11_NameLink target=_blank>fastxyf</a> </div>
<div style="FONT-SIZE: 12pt">因为要做屏幕广播，所以也在研究了一点屏幕抓图,我看的源码是 <br>UltraVNC <br>说点经验及问题： <br>（1）两者差别 <br>驱动方式（推模式）Mirror Driver： <br>优点：占用CPU资源少（1-5%），速度快。实时性高。 <br>缺点：a. window 2000/xp/2003支持，98不支持。 <br>b. 装完驱动需重新启动方能使用。 <br>HOOK方式（拉模式）HOOK： <br>优点：系统支持广泛，装后不需要重启就能使用。 <br>缺点：占用CPU资源大。 <br>解决方法：两种都开发，window 2000/xp/2003系统采用驱动方动，其它系统使 用HOOK方式。 <br>（2）问题 <br>1）我已提取出了VNC中的驱动方式抓屏方法。 <br>但在分析HOOK方式时，发现没有HOOK DLL也可以抓屏，而且CPU占有率也不是很高。怀疑是用全屏的方式定时抓的。 <br>2）双缓冲管理方法是什么意思？有朋友可以解释一下吗？ <br><br>我的MSN：fastxyf@hotmail.com,有从事这方面开发的程序员交流一下 <br><br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#35926">#</a>&nbsp;<a name=35926></a>re: 高效屏幕录制 2004-10-20 5:00 <a id=Comments_ascx_CommentList_ctl12_NameLink href="http://blog.csdn.net/jiangsheng" target=_blank>jiangsheng</a> </div>
<div style="FONT-SIZE: 12pt">双缓冲或者多缓冲的技术去看看DirectShow的pin的采样数据区分配算法 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: [Tech] 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#36599">#</a>&nbsp;<a name=36599></a>[Tech] 高效屏幕录制 2004-10-26 11:10 <a id=Comments_ascx_CommentList_ctl13_NameLink title=PingBack/TrackBack href="http://blog.csdn.net/huangtyu/archive/2004/10/26/152363.aspx" target=_blank>阿牛BLOG</a> </div>
<div style="FONT-SIZE: 12pt">Ping Back来自：blog.csdn.net <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#38460">#</a>&nbsp;<a name=38460></a>re: 高效屏幕录制 2004-11-9 14:47 <a id=Comments_ascx_CommentList_ctl14_NameLink target=_blank>东</a> </div>
<div style="FONT-SIZE: 12pt">呵呵，大家闹的好热闹。我这个菜鸟看的好高兴 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#39901">#</a>&nbsp;<a name=39901></a>re: 高效屏幕录制 2004-11-29 14:46 <a id=Comments_ascx_CommentList_ctl15_NameLink target=_blank>msn:win_dev@hotmail.com</a> </div>
<div style="FONT-SIZE: 12pt">mirror中怎么得到Video buffer的地址? <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#40310">#</a>&nbsp;<a name=40310></a>re: 高效屏幕录制 2004-12-3 14:59 <a id=Comments_ascx_CommentList_ctl16_NameLink target=_blank>lipinshengxp</a> </div>
<div style="FONT-SIZE: 12pt">希望与从事VNC开发的人一起研究 下 <br>lipinshengxp@hotmail.com <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#40716">#</a>&nbsp;<a name=40716></a>re: 高效屏幕录制 2004-12-8 16:43 <a id=Comments_ascx_CommentList_ctl17_NameLink target=_blank>胡胡</a> </div>
<div style="FONT-SIZE: 12pt">请问VNC不能捕获WINDOWS MEDIA PLAYER REALPLAY 播放的视频，大家最近采用什么来截屏啊，用DIRECTSHOW能不能捕获啊，我用directdraw捕获也捕获不到，windows media player 播放的视频，捕获结果就是屏幕+黑屏（播放的视频） <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#41431">#</a>&nbsp;<a name=41431></a>re: 高效屏幕录制 2004-12-20 12:40 <a id=Comments_ascx_CommentList_ctl18_NameLink target=_blank>hhh</a> </div>
<div style="FONT-SIZE: 12pt">to softworm,是不是在故弄玄虚呀，mirror driver的源码能看出什么名堂来，你能否说说看，比如Applications如何通过GDI或者是其他方式取得屏幕图像数据的。 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#41697">#</a>&nbsp;<a name=41697></a>re: 高效屏幕录制 2004-12-24 17:22 <a id=Comments_ascx_CommentList_ctl19_NameLink target=_blank>icefire</a> </div>
<div style="FONT-SIZE: 12pt">我有一个程序是通过一个service来调用，利用GETDC抓屏幕，在登录进系统时抓屏幕没有问题，但一旦注销或者锁定用户状态时，就抓出黑屏，怎么回事呢？请指教！该service已经设置为交互操作了 <br><br>msn：icefireren@msn.com <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#41709">#</a>&nbsp;<a name=41709></a>re: 高效屏幕录制 2004-12-25 0:23 <a id=Comments_ascx_CommentList_ctl20_NameLink href="http://blog.csdn.net/jiangsheng" target=_blank>jiangsheng</a> </div>
<div style="FONT-SIZE: 12pt">注销或者锁定用户状态时系统切换到了另一个桌面。 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#44966">#</a>&nbsp;<a name=44966></a>re: 高效屏幕录制 2005-2-26 10:21 <a id=Comments_ascx_CommentList_ctl21_NameLink target=_blank>过客</a> </div>
<div style="FONT-SIZE: 12pt">呵呵 这个东西 的确具有吸引力 我研究了近2年 可以用n中方法去实现！ <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#45442">#</a>&nbsp;<a name=45442></a>re: 高效屏幕录制 2005-3-7 21:28 <a id=Comments_ascx_CommentList_ctl22_NameLink target=_blank>WT</a> </div>
<div style="FONT-SIZE: 12pt">我用bitblt来截屏，鼠标会闪烁， <br>如果用DirectX截屏，是否可以避免鼠标会闪烁？ <br><br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#46299">#</a>&nbsp;<a name=46299></a>re: 高效屏幕录制 2005-3-24 9:07 <a id=Comments_ascx_CommentList_ctl23_NameLink target=_blank>heifei</a> </div>
<div style="FONT-SIZE: 12pt">双缓冲可以避免闪烁 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#47301">#</a>&nbsp;<a name=47301></a>re: 高效屏幕录制 2005-4-8 7:00 <a id=Comments_ascx_CommentList_ctl24_NameLink target=_blank>xiaoxiao</a> </div>
<div style="FONT-SIZE: 12pt">swordxie是用什么方法抓屏啊？ <br>是不是DirectX的效率最高啊？ <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#51758">#</a>&nbsp;<a name=51758></a>re: 高效屏幕录制 2005-5-23 19:44 <a id=Comments_ascx_CommentList_ctl25_NameLink target=_blank>DryFisHH</a> </div>
<div style="FONT-SIZE: 12pt">看了您的blog《高效屏幕录制》和评论，觉得很有收获。其中您有一句话&#8220;注销或者锁定用户状态时系统切换到了另一个桌面。 &#8221;。我想知道在这种状态下如何截屏？希望您能给一个方法或者思路，谢谢了。 <br><br>我的邮箱：DryFisHH@hotmail.com <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#52142">#</a>&nbsp;<a name=52142></a>re: 高效屏幕录制 2005-5-29 9:48 <a id=Comments_ascx_CommentList_ctl26_NameLink target=_blank>win_dev@hotmail.com</a> </div>
<div style="FONT-SIZE: 12pt">其实可以直接用winvnc中间的那两个文件，*.sys &amp; *.dll, <br>winvnc源码中封装了对他们的调用。可以看看源码。 <br>况且搞一个mirror也没有什么了不起。 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#52296">#</a>&nbsp;<a name=52296></a>re: 高效屏幕录制 2005-5-31 4:06 <a id=Comments_ascx_CommentList_ctl27_NameLink target=_blank>win_dev@hotmail.com</a> </div>
<div style="FONT-SIZE: 12pt">to softworm : <br>Mirror 怎么可以直接利用硬件呢？ <br><br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#52595">#</a>&nbsp;<a name=52595></a>re: 高效屏幕录制 2005-6-4 10:33 <a id=Comments_ascx_CommentList_ctl28_NameLink href="http://blog.csdn.net/jiangsheng" target=_blank>jiangsheng</a> </div>
<div style="FONT-SIZE: 12pt">可以使用openinputdesktop获得当前活动的桌面来截屏。具体代码可以i参考vnc的源代码。 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#60113">#</a>&nbsp;<a name=60113></a>re: 高效屏幕录制 2005-7-21 13:40 <a id=Comments_ascx_CommentList_ctl29_NameLink target=_blank>nobody:nobody</a> </div>
<div style="FONT-SIZE: 12pt">好像WinVNC/TightVNC也截不了金山词霸的取词窗口 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#61462">#</a>&nbsp;<a name=61462></a>re: 高效屏幕录制 2005-8-3 0:51 <a id=Comments_ascx_CommentList_ctl30_NameLink target=_blank>zveno</a> </div>
<div style="FONT-SIZE: 12pt">屏幕捕获，可以只采用BITBLT的方式，在网络情况好的情况下，可以达到每秒15帧左右，主要是因为GETDIBS这个函数花费了太多的时间（大约30-50ms一帧）有谁有方法取代这个函数吗？？？ <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#62794">#</a>&nbsp;<a name=62794></a>re: 高效屏幕录制 2005-8-31 5:26 <a id=Comments_ascx_CommentList_ctl31_NameLink target=_blank>猎人</a> </div>
<div style="FONT-SIZE: 12pt">屏幕捕获，可以只采用BITBLT的方式，在网络情况好的情况下，可以达到每秒15帧左右，主要是因为GETDIBS这个函数花费了太多的时间（大约30-50ms一帧）有谁有方法取代这个函数吗？？？ <br><br>读取数据我用的是读显存缓冲区,内存COPY <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#63685">#</a>&nbsp;<a name=63685></a>re: 高效屏幕录制 2005-9-19 21:09 <a id=Comments_ascx_CommentList_ctl32_NameLink href="http://www.cnblogs.com/piccolo/" target=_blank>Piccolo Goo</a> </div>
<div style="FONT-SIZE: 12pt">我想问一下用GDI来抓屏的效率高，还是用DirectX来抓屏的效率高？ <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#64599">#</a>&nbsp;<a name=64599></a>re: 高效屏幕录制 2005-10-5 15:56 <a id=Comments_ascx_CommentList_ctl33_NameLink href="http://blog.joycode.com/" target=_blank>jiangsheng</a> </div>
<div style="FONT-SIZE: 12pt">GDI32 <br>DirectX is much slower <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#65742">#</a>&nbsp;<a name=65742></a>re: 高效屏幕录制 2005-10-25 0:43 <a id=Comments_ascx_CommentList_ctl34_NameLink target=_blank>Kim</a> </div>
<div style="FONT-SIZE: 12pt">不知道那里可以找到VNC的代码文档，干看代码的话很痛苦啊~~ <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#66466">#</a>&nbsp;<a name=66466></a>re: 高效屏幕录制 2005-11-5 9:47 <a id=Comments_ascx_CommentList_ctl35_NameLink target=_blank>DryFisHH</a> </div>
<div style="FONT-SIZE: 12pt">花了几天时间硬着头皮分析了realvnc的代码（初学者，刚拿到代码的时候都不知道程序流程是什么样的，汗），主要是想把其中屏幕截取的部分拿出来单独 做个屏幕录取的功能。程序别别扭扭地有个模样了，这时候我发现调用BitBlt函数的时候鼠标会闪烁，晕，回头看vnc运行的情况，发现vnc server端的主机鼠标也会闪，不过不是特别明显。有两个问题想不通，一是display那部分的代码我几乎没改，直接拿来用，为什么好像我的闪得厉害 些（错觉？？）；二是如何能避免鼠标闪烁？看到有同志说是用双缓冲，不懂，只知道双缓冲往屏幕上贴图的时候用，不知道截屏也要用。唉，看了别人的代码，就 知道自己有多少水水了。不过，整个vnc代码基本被我看懂了，呵呵，收获啊，网上居然没有初学者文档，没有人写一份么？ <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#73824">#</a>&nbsp;<a name=73824></a>re: 高效屏幕录制 2006-3-30 2:49 <a id=Comments_ascx_CommentList_ctl36_NameLink target=_blank>w_anthony</a> </div>
<div style="FONT-SIZE: 12pt">小弟毕业设计做的就是这个，要求低CPU使用率，现在就遇到上面说的GetDIBits()函数CPU使用率过高的情况。 <br>发现网上的屏幕广播的软件这方面做的很不错，基本上都用了虚拟显卡Mirror的。不知哪里有这个Mirror的使用方法介绍，或者如果有直接读取显存的方法还望不吝赐教。 <br><br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#73904">#</a>&nbsp;<a name=73904></a>re: 高效屏幕录制 2006-3-31 11:02 <a id=Comments_ascx_CommentList_ctl37_NameLink target=_blank>w_anthony</a> </div>
<div style="FONT-SIZE: 12pt">今天看了一下，发现高CPU使用率的是BitBlt()，不是GetDIBits()，现在只期望直接读显存了 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#74026">#</a>&nbsp;<a name=74026></a>re: 高效屏幕录制 2006-4-5 7:36 <a id=Comments_ascx_CommentList_ctl38_NameLink target=_blank>w_anthony</a> </div>
<div style="FONT-SIZE: 12pt">又用directdraw直接读显存试了一下，发现大部分的CPU都用在memcpy()从显存复制数据上了，对此我非常不解，用memcpy()复制同 样大小的非显存的内存数据CPU使用率只有一点点，而且写入同样大小的内存数据到显存，CPU使用率也不是很高，不知为何唯独复制出来的如此耗费CPU <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#74027">#</a>&nbsp;<a name=74027></a>re: 高效屏幕录制 2006-4-5 7:41 <a id=Comments_ascx_CommentList_ctl39_NameLink target=_blank>w_anthony</a> </div>
<div style="FONT-SIZE: 12pt">不知Mirror Driver的原理是什么，是截屏的时候是根据画面变化复制一部分的变化区数据吗？那是不是和HOOK差不多了，为什么上面的说一者CPU使用率低，一者CPU使用率高啊？希望哪位提点一下，小弟没有源码 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#74995">#</a>&nbsp;<a name=74995></a>re: 高效屏幕录制 2006-4-21 2:55 <a id=Comments_ascx_CommentList_ctl40_NameLink href="http://blog.csdn.net/whoo" target=_blank>Whoo</a> </div>
<div style="FONT-SIZE: 12pt">关于Bitblt耗时的问题， 其实是硬件结构决定的， 并不是Bitblt慢。 <br>Bitblt的优化做的非常的精良，有兴趣的可以参考一下MSDN中的光栅操作码的介绍。 <br><br>针对与截取屏幕，我以前在非常古老的计算机上作过测试， DELPHI + GDI 和 VC + DirectX的速度相近，甚至前者还略略胜出些。 所以说， 在这个方面， DirectX并无优势可言。 <br><br><br><br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#75090">#</a>&nbsp;<a name=75090></a>re: 高效屏幕录制 2006-4-23 21:29 <a id=Comments_ascx_CommentList_ctl41_NameLink href="http://blog.csdn.net/whoo" target=_blank>Whoo</a> </div>
<div style="FONT-SIZE: 12pt">使用Bitblt拷贝屏幕内容， 其数据需要从显存传输到内存，经过低速繁忙的总线，自然比从内存到内存的数据拷贝慢得多。 <br><br>不过现在AGP(4x, 8x)的广泛使用以及pcix的开始， 这个瓶颈正在逐步的消失。 <br><br>显存=&gt;内存 vs 内存=&gt;内存 <br>对于老式机器来说（低速agp,甚至是pci），差别至少是一个数量级，甚至是两个。 对于当前的流行机器来说，应该在5倍以内。可以预见，如果pcix应用起来， 有一天从显存拷贝数据比从内存拷贝快也不是没有可能。 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#75093">#</a>&nbsp;<a name=75093></a>re: 高效屏幕录制 2006-4-23 21:39 <a id=Comments_ascx_CommentList_ctl42_NameLink href="http://blog.csdn.net/whoo" target=_blank>Whoo</a> </div>
<div style="FONT-SIZE: 12pt">针对 显存 =〉内存 的瓶颈， 我还有个听起来很悖论的猜测：那就是某些低档的集成主板或者显卡，处于节省成本的原因，划分了一部分的系统内存当成显存来用。 <br><br>如果结构合理的话，这个瓶颈就自然消失了。 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#75448">#</a>&nbsp;<a name=75448></a>re: 高效屏幕录制 2006-5-2 20:41 <a id=Comments_ascx_CommentList_ctl43_NameLink target=_blank>w_anthony</a> </div>
<div style="FONT-SIZE: 12pt">请问楼上，如果是显存=〉内存存在瓶颈以至于速度慢，那么为什么内存=〉显存速度就快呢？而且Mirror Driver的也总要有个显存=〉内存的步骤吧，所以我觉得速度慢不完全是这个原因。 <br>它应该还经过了些别的步骤吧，问题是用什么可以绕过这些步骤。 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#78246">#</a>&nbsp;<a name=78246></a>re: 高效屏幕录制 2006-7-3 19:17 <a id=Comments_ascx_CommentList_ctl44_NameLink target=_blank>黄小玲</a> </div>
<div style="FONT-SIZE: 12pt">很好，那么该怎么录制呢 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#78750">#</a>&nbsp;<a name=78750></a>re: 高效屏幕录制 2006-7-14 21:42 <a id=Comments_ascx_CommentList_ctl45_NameLink target=_blank>snk</a> </div>
<div style="FONT-SIZE: 12pt">//snk <br>这样可以映射显存，要在内核模式下运行，取得显卡的HANDLER首先,EngDeviceIOControl要自己从导入表中算出来，效果并没有想像的好，读写显存慢的很 <br><br>int MapVideoMemory(){ <br>DWORD NumRet; <br>static BOOL bFirst=TRUE; <br>VIDEO_MEMORY videoMemory = {0}; <br>VIDEO_MEMORY_INFORMATION videoMemoryInformation = {0}; <br><br>if(globalDrv &amp;&amp; funcList.EngDeviceIoControl &amp;&amp; bFirst){ <br>DbgPrint("MapVideoMemory"); <br>__try{ <br>VIDEO_MODE_INFORMATION modeInformation; <br>funcList.EngDeviceIoControl(globalDrv,IOCTL_VIDEO_QUERY_CURRENT_MODE,NULL, <br>0,&amp;modeInformation,sizeof(VIDEO_MODE_INFORMATION),&amp;NumRet); <br>DbgPrint("stride %d",modeInformation.ScreenStride); <br>DbgPrint("bitmap width %d VisScreenWidth %d",modeInformation.VideoMemoryBitmapWidth, <br>modeInformation.VisScreenWidth); <br>DbgPrint("NumberRedBits %d NumberGreenBits %d NumberBlueBits %d",modeInformation.NumberRedBits <br>,modeInformation.NumberGreenBits,modeInformation.NumberBlueBits); <br><br>DbgPrint("RedMask %d GreenMask %d BlueMask %d 0x%x",modeInformation.RedMask <br>,modeInformation.GreenMask,modeInformation.BlueMask,modeInformation.AttributeFlags); <br><br>funcList.EngDeviceIoControl(globalDrv,IOCTL_VIDEO_MAP_VIDEO_MEMORY,&amp;videoMemory, <br>sizeof(VIDEO_MEMORY),&amp;videoMemoryInformation,sizeof(VIDEO_MEMORY_INFORMATION),&amp;NumRet); <br><br>bFirst=FALSE; <br>uFramebufferLength=videoMemoryInformation.FrameBufferLength; <br>if(videoMemoryInformation.FrameBufferLength&lt;videoMemoryInformation.VideoRamLength){ <br>uFramebufferLength=videoMemoryInformation.VideoRamLength; <br>} <br>pGVideo=(char*)videoMemoryInformation.FrameBufferBase; <br><br><br>DbgPrint("FrameBufferBase 0x%x FrameBufferLength 0x%x VideoRamBase 0x%x VideoRamLength 0x%x", <br>pGVideo,uFramebufferLength,videoMemoryInformation.VideoRamBase, <br>videoMemoryInformation.VideoRamLength); <br>} <br>__except(EXCEPTION_EXECUTE_HANDLER){ <br>DbgPrint("Catch Error When MapVideoMemory"); <br>} <br>} <br>CreateVideoShareMemory(); <br>return 0; <br>} <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#78862">#</a>&nbsp;<a name=78862></a>re: 高效屏幕录制 2006-7-18 3:58 <a id=Comments_ascx_CommentList_ctl46_NameLink target=_blank>LENGFENG</a> </div>
<div style="FONT-SIZE: 12pt">我下了一个VNC的代码 可是服务器端编译有错，有一个文件找不到，想自己写程序调用VNC的驱动，可是头都看大了就是调用不成功。 那位大虾有调用VNC Mirror Driver 的例子，请帮赐教。不胜感激。我的邮箱： ljg8232068@hotail.com <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#78864">#</a>&nbsp;<a name=78864></a>re: 高效屏幕录制 2006-7-18 4:08 <a id=Comments_ascx_CommentList_ctl47_NameLink target=_blank>LENGFENG</a> </div>
<div style="FONT-SIZE: 12pt">Cannot open include file: 'aclui.h': No such file or directory <br>这个文件找不到，请问是什么原因 ？请多多指教。我的邮箱： ljg8232068@hotmail.com <br><br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#78866">#</a>&nbsp;<a name=78866></a>re: 高效屏幕录制 2006-7-18 5:14 <a id=Comments_ascx_CommentList_ctl48_NameLink target=_blank>LENGFENG</a> </div>
<div style="FONT-SIZE: 12pt">用钱买也可以商量 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#78954">#</a>&nbsp;<a name=78954></a>re: 高效屏幕录制 2006-7-19 21:16 <a id=Comments_ascx_CommentList_ctl49_NameLink target=_blank>LENGFENG</a> </div>
<div style="FONT-SIZE: 12pt">斑竹呢 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#79140">#</a>&nbsp;<a name=79140></a>re: 高效屏幕录制 2006-7-24 19:38 <a id=Comments_ascx_CommentList_ctl50_NameLink target=_blank>林先生</a> </div>
<div style="FONT-SIZE: 12pt">一个问题请教: <br><br>象HyperSnap那样的抓图软件截图方式很多, 其中包括扩展活动窗口截图 和 滚屏截图, 用扩展活动窗口截图方式截图时, 能设置要截取的窗口的宽和高的像素大小（可以大于屏幕的像素大小），然后截取该窗口完整的图像， 怎样编程实现呢？？？ <br><br>另, snapit这种软件能进行DOS截屏, 又怎样编程实现呢？ <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#79196">#</a>&nbsp;<a name=79196></a>re: 高效屏幕录制 2006-7-25 18:13 <a id=Comments_ascx_CommentList_ctl51_NameLink target=_blank>林先生</a> </div>
<div style="FONT-SIZE: 12pt">各位高手: <br><br>象HyperSnap那样的抓图软件截图方式很多, 其中包括扩展活动窗口截图 和 滚屏截图, 用扩展活动窗口方式截图时, 能设置要截取的活动窗口的宽和高的像素大小（可以大于屏幕的像素大小），并能截取该窗口完整的图像，怎样编程实现啊？？？ <br><br>另, 像snapit那样的抓图软件能进行DOS截屏, 又怎样编程实现呢？？？我想大概分以下两种情况来分析 <br><br>1. 在Windows Vista, Windows XP, Windows 2000 Professional, Windows NT Workstation, Windows Me, Windows 98, or Windows 95上运行的DOS窗口时, 如何获取DOS窗口的句柄, 因为一旦获取窗口的句柄, 就能轻松编程截取该窗口的图像.在Windows XP及其后的Windows平台, 有GetConsoleWindow函数获取DOS窗口的句柄, 而Windows 98, Windows 95却没有, 怎样才能在上述所有平台上获取DOS窗口的句柄呢?? 在全屏DOS窗口下, 情况是否相同呢?? <br><br><br>2. 在纯DOS环境下, 怎样做到按一下某个按键, 自动在后台启动指定的程序并能截取当前DOS屏幕的图像??(如果指定的程序已经启动, 则截取当前DOS屏幕的图像), 再按一下另一个键, 则退出指定的程序, 上述如何编程实现啊??? <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#79414">#</a>&nbsp;<a name=79414></a>re: 高效屏幕录制 2006-8-1 1:02 <a id=Comments_ascx_CommentList_ctl52_NameLink href="http://www.software168.com%20/" target=_blank>shenming </a></div>
<div style="FONT-SIZE: 12pt">我也很奇怪，显存 =〉内存很慢，直接写显存似乎很快。 <br><br>另外我也有GDI方式的屏幕捕获，效果比mirror也差不太多。 <br><br>另外还有直接HOOK 显卡驱动的方式，这种方式效率应该是最高的，我还没有完全做好。 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#79794">#</a>&nbsp;<a name=79794></a>re: 高效屏幕录制 2006-8-11 2:05 <a id=Comments_ascx_CommentList_ctl53_NameLink target=_blank>juney</a> </div>
<div style="FONT-SIZE: 12pt">Cannot open include file: 'aclui.h': No such file or directory <br>这个文件找不到，请问是什么原因 ？请多多指教。我的邮箱： ljg8232068@hotmail.com <br><br>添加sdk，应该就可以了吧 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#81306">#</a>&nbsp;<a name=81306></a>re: 高效屏幕录制 2006-8-22 0:09 <a id=Comments_ascx_CommentList_ctl54_NameLink target=_blank>Leon</a> </div>
<div style="FONT-SIZE: 12pt">我最近在写一个类似REALVNC的东西,实现了最简单的抓屏和鼠标/键盘操作,做完后才发现了频繁BitBlt非常之消耗CPU的问题.简直气炸了.如 果用我自已的笔记本(迅驰1.5,ATI9700显卡)做SERVER的话,CPU只占30~40%,但如果用我公司的烂机器跑SERVER的话(P4, 烂2D显卡,4M显存那种),CPU跑到80~99%,真是太慢啦,查来查去原来就是这个BitBlt,而且更奇怪的是,我把这部分代码提出来,在另一个 程式里跑,也只有40~50%啊,真是怪死了. <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#82108">#</a>&nbsp;<a name=82108></a>re: 高效屏幕录制 2006-8-27 19:45 <a id=Comments_ascx_CommentList_ctl55_NameLink target=_blank>clint.guo</a> </div>
<div style="FONT-SIZE: 12pt">最近我也需要写截屏方面的代码，我用GDI方式截屏时，截不下鼠标和播放的视频，是不是用DirectShow方式就可以了呢？另外读显存是不是能够把鼠标和视频都截下来呢？有没有读显存的资料呢？ <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#82669">#</a>&nbsp;<a name=82669></a>re: 高效屏幕录制 2006-9-5 21:39 <a id=Comments_ascx_CommentList_ctl56_NameLink target=_blank>datoucai</a> </div>
<div style="FONT-SIZE: 12pt">各位大侠可否提供一个vnc的源码下载？找的头都晕了 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#84978">#</a>&nbsp;<a name=84978></a>re: 高效屏幕录制 2006-10-10 21:21 <a id=Comments_ascx_CommentList_ctl57_NameLink target=_blank>xxagri</a> </div>
<div style="FONT-SIZE: 12pt">谁把WinVnc的代码改成Delphi的了，这样参与研究的人一定多很多，C++我不懂，我正用Delphi搞这个。 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#84979">#</a>&nbsp;<a name=84979></a>re: 高效屏幕录制 2006-10-10 21:22 <a id=Comments_ascx_CommentList_ctl58_NameLink target=_blank>xxagri</a> </div>
<div style="FONT-SIZE: 12pt">我的邮箱llbbg_1@yahoo.com.cn <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#85592">#</a>&nbsp;<a name=85592></a>re: 高效屏幕录制 2006-10-23 21:02 <a id=Comments_ascx_CommentList_ctl59_NameLink target=_blank>rainguxia</a> </div>
<div style="FONT-SIZE: 12pt">请问有哪位高手解决了&#8220;VNC不能捕获WINDOWS MEDIA PLAYER REALPLAY 播放的视频&#8221;问题了？或者哪位知道如何用directdraw直接从显存中读取（屏幕）数据？麻烦给小妹一份例子程序的源码，在此先谢过了：） <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#85593">#</a>&nbsp;<a name=85593></a>re: 高效屏幕录制 2006-10-23 21:04 <a id=Comments_ascx_CommentList_ctl60_NameLink target=_blank>rainguxia</a> </div>
<div style="FONT-SIZE: 12pt">啊，忘了附上email了:-p <br>rainguxia@163.com <br>QQ:93439445 <br>望指导，盼回复 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#86044">#</a>&nbsp;<a name=86044></a>re: 高效屏幕录制 2006-11-2 1:58 <a id=Comments_ascx_CommentList_ctl61_NameLink target=_blank>freestyle</a> </div>
<div style="FONT-SIZE: 12pt">to snk 和所有热心人， <br>EngDeviceIoControl(globalDrv,IOCTL_VIDEO_QUERY_CURRENT_MODE,NULL,..) <br>函数中 globalDrv怎么获得? <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#86046">#</a>&nbsp;<a name=86046></a>re: 高效屏幕录制 2006-11-2 2:37 <a id=Comments_ascx_CommentList_ctl62_NameLink target=_blank>freestyle</a> </div>
<div style="FONT-SIZE: 12pt">忘了问: 显存基址开始存放的数据是RGB值吗，具体格式是不是 <br>0xbbggrr? <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#86700">#</a>&nbsp;<a name=86700></a>re: 高效屏幕录制 2006-11-16 23:29 <a id=Comments_ascx_CommentList_ctl63_NameLink target=_blank>vga</a> </div>
<div style="FONT-SIZE: 12pt">有没有软件实现屏幕实时25桢录制的办法? <br>先谢谢了... <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: re: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#87187">#</a>&nbsp;<a name=87187></a>re: 高效屏幕录制 2006-11-19 6:31 <a id=Comments_ascx_CommentList_ctl64_NameLink target=_blank>hjw</a> </div>
<div style="FONT-SIZE: 12pt">请问一下VNC是用的TCP还是UDP啊？ <br>如果用UDP也可以实现的话，那我也研究研究。 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: 回复: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#88650">#</a>&nbsp;<a name=88650></a>回复: 高效屏幕录制 2006-12-6 0:25 <a id=Comments_ascx_CommentList_ctl65_NameLink target=_blank>re</a> </div>
<div style="FONT-SIZE: 12pt">Cannot open include file: 'aclui.h': No such file or directory <br>我的出现了这个问题！请高手指点一下！怎么解决呢 <br>MSN：weichuanhui@hotmail.com <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: 回复: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#89022">#</a>&nbsp;<a name=89022></a>回复: 高效屏幕录制 2006-12-14 5:54 <a id=Comments_ascx_CommentList_ctl66_NameLink href="http://%e5%bc%80%e5%8f%91%e5%8c%85%e6%98%afcom%e7%bb%84%e4%bb%b6/" target=_blank>snk</a> </div>
<div style="FONT-SIZE: 12pt">delphi等等都可以用 <br><br>snk12@sohu.com <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: 回复: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#89121">#</a>&nbsp;<a name=89121></a>回复: 高效屏幕录制 2006-12-14 20:12 <a id=Comments_ascx_CommentList_ctl67_NameLink target=_blank>sss</a> </div>
<div style="FONT-SIZE: 12pt">厉害，想请教各位 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: 回复: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#90841">#</a>&nbsp;<a name=90841></a>回复: 高效屏幕录制 2007-1-2 1:50 <a id=Comments_ascx_CommentList_ctl68_NameLink target=_blank>developer</a> </div>
<div style="FONT-SIZE: 12pt">直接memcpy显存 显然很慢 <br>内存到内存快得多 <br>问题在于这是显存和内存的数据复制 <br>想BitBlt和memcpy都是不符合性能要求的 <br>另 显卡驱动不是IRP驱动的 IRP模型比较慢一点 <br><br><br><br><br><br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: 回复: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#93405">#</a>&nbsp;<a name=93405></a>回复: 高效屏幕录制 2007-2-8 23:04 <a id=Comments_ascx_CommentList_ctl69_NameLink target=_blank>eking</a> </div>
<div style="FONT-SIZE: 12pt">用.net 可不可以做啊，我不会VC这些 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: 回复: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#100082">#</a>&nbsp;<a name=100082></a>回复: 高效屏幕录制 2007-3-29 2:40 <a id=Comments_ascx_CommentList_ctl70_NameLink target=_blank>lixs</a> </div>
<div style="FONT-SIZE: 12pt">3ks， snk <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: 回复: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#100518">#</a>&nbsp;<a name=100518></a>回复: 高效屏幕录制 2007-4-5 7:39 <a id=Comments_ascx_CommentList_ctl71_NameLink href="http://www.software168.com/" target=_blank>shen ming</a> </div>
<div style="FONT-SIZE: 12pt">看看我做的 <br>www.software168.com <br>有GDI和DRIVER2种。 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: 回复: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#102210">#</a>&nbsp;<a name=102210></a>回复: 高效屏幕录制 2007-5-8 0:07 <a id=Comments_ascx_CommentList_ctl72_NameLink target=_blank>刘环其</a> </div>
<div style="FONT-SIZE: 12pt">to roger:先把你做的基于realvnc的源码拿来研究一下好吗? <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: 回复: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#102881">#</a>&nbsp;<a name=102881></a>回复: 高效屏幕录制 2007-5-20 19:15 <a id=Comments_ascx_CommentList_ctl73_NameLink target=_blank>yhs200</a> </div>
<div style="FONT-SIZE: 12pt">有谁做好的源码可以拿出来供大家参考吗？ <br>现在国内的软件都没有国外的好，希望大家多把不涉及到商业机密的源码公开一下，大家共同进步！ <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: 回复: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#102882">#</a>&nbsp;<a name=102882></a>回复: 高效屏幕录制 2007-5-20 19:18 <a id=Comments_ascx_CommentList_ctl74_NameLink target=_blank>yhs200</a> </div>
<div style="FONT-SIZE: 12pt">查过一些资料，好像用netmeeting sdk和windows media format sdk也可以做这些远程控制的软件，这里怎么没有谈到这些的，是不是效率比较低？？ <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: 回复: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#103751">#</a>&nbsp;<a name=103751></a>回复: 高效屏幕录制 2007-6-2 23:16 <a id=Comments_ascx_CommentList_ctl75_NameLink target=_blank>Coolboy</a> </div>
<div style="FONT-SIZE: 12pt">windows media sdk效率相当低，我的机子P43.0，6600显卡，用了之后cpu占用高达90%，开个大点的应用就很慢了。 <br></div>
</div>
<br>
<div style="FONT-SIZE: 12pt">&nbsp;</div>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><a title="permalink: 回复: 高效屏幕录制" href="http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx#111331">#</a>&nbsp;<a name=111331></a>回复: 高效屏幕录制 2007-11-12 20:04 <a id=Comments_ascx_CommentList_ctl78_NameLink target=_blank>ilinux</a> </div>
<div style="FONT-SIZE: 12pt">最近本人也在研究VNC源码，待我搞透后，肯定公布自己开发的相关源码，打击下国内那些只想着Money的人的气焰。 <br></div>
</div>
<img src ="http://www.cppblog.com/iniwf/aggbug/76806.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/iniwf/" target="_blank">iniwf</a> 2009-03-17 00:01 <a href="http://www.cppblog.com/iniwf/archive/2009/03/17/76806.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>