我做了个类似于凌波的远程屏幕监控软件.设计方案如下:
程序为C/S结构,客户端负责定时(采用Timer控件,interval为3秒)抓取该客户机的屏幕图象(采用API,每次抓取到的屏幕数据大概为125K),并将图象数据存入byte数组发送给服务器端,服务器端接受该数组内容,并还原成图象,显示在pictureBox中.
程序功能已实现,但存在一个很不爽的问题,客户端每三秒的时候,即执行Timer_Tick的时候,系统就会出现卡的现象,表现为:鼠标本来正在移动中,但每到Timer_Tick的执行时间就会突然停顿1下.............我自己的分析,最可能的原因可能是屏幕抓取的实现方法比较弱,使得抓屏时,出现屏幕暂时停顿的现象.不知哪位能有更优的实现方法.
另外一个原因,我想可能性不大,不过还是说出来请大家帮忙分析一下:会不会是每次抓取到的图片(125K)有点大?我在抓取到屏幕后没将它保存成图片文件而是放入了StreamMemory中,这会不会也导致卡呢?希望做过这方面程序的或对这方面比较有研究的朋友能帮帮忙,谢谢拉.

解决方案 »

  1.   

    数据放入内存不会影响CPU,你放入文件反而会更占用CPU(因为要做IO操作)。其实2个瓶颈你都想到了
    1. 截屏的效率,最高效的方式是通过显存直接获取数据,你可以用Windows DDK做一个虚拟显卡驱动程序(DDK里都有Sample的),这样直接通过显卡来获取数据。2. 数据的传输,对于截获的数据你可以做压缩再传输来减少网络上传输量,甚至你还可以做比对,只传输和上次数据的差异部分,接收端在上次数据基础上Merge差异就可以了。但这个地方你要权衡,因为压缩和解压缩本身就要消耗更多的计算时间(这个也和具体的压缩算法有关),和你得到的传输所减少的时间相比是否值得。
      

  2.   

    1楼:谢谢你啊,呵呵.我去看看DDK的相关资料,有不明白的再请教你啊.
        我的程序对实时性要求倒不是太高,只要延时在3-5秒都可以接受,因为并不做控制,只做监测.那我先看看DDK的资料,如果能直接看懂,我就回来结帖,看不懂的话可能还要麻烦你啊,呵呵