说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

用Delphi实现远程屏幕抓取

HTML文档下载 WORD文档下载 PDF文档下载
用Delphi实现远程屏幕抓取

在网络管理中,有时需要通过监视远程计算机屏幕来了解网上微机的使用情况。虽然,市面上有很多软件可以实现该功能,有些甚至可以进行远程控制,但在使用上缺乏灵活性,如无法指定远程计算机屏幕区域的大小和位置,进而无法在一屏上同时监视多个屏幕。其实,可以用Delphi自行编制一个灵活的远程屏幕抓取工具,简述如下。

一、软硬件要求。

Windows95/98对等网,用来监视的计算机(以下简称主控机)和被监视的计算机(以下简称受控机)都必须装有TCP/IP 协议,并正确配置。如没有网络,也可以在一台计算机上进行调试。

二、实现方法。

编制两个应用程序,一个为VClient.exe,装在受控机上,另一个为VServer.exe,装在主控机上。VServer.exe指定要监视的受控机的IP地址和将要在受控机屏幕上抓取区域的大小和位置,并发出屏幕抓取指令给VClient.exe,VClient.exe得到指令后,在受控机屏幕上选取指定区域,生成数据流,将其发回主控机,并在主控机上显示出抓取区域的BMP图象。由以上过程可以看出,该方法的关键有二:一是如何在受控机上进行屏幕抓取,二是如何通过TCP/IP协议在两台计算机中传输数据。

UDP(User Datagram Protocol,意为用户报文协议)是Internet上广泛采用的通信协议之一。与TCP协议不同,它是一种非连接的传输协议,没有确认机制,可靠性不如TCP,但它的效率却比TCP高,用于远程屏幕监视还是比较适合的。同时,UDP控件不区分服务器端和客户端,只区分发送端和接收端,编程上较为简单,故选用UDP协议,使用Delphi 4.0提供的TNMUDP控件。

三、创建演示程序。

第一步,编制VClient.exe文件。新建Delphi工程,将默认窗体的Name属性设为“Client”。加入TNMUDP控件,Name属性设为“CUDP”;LocalPort属性设为“1111”,让控件CUDP监视受控机的1111端口,当有数据发送到该口时,触发控件CUDP的OnDataReceived事件;RemotePort属性设为“2222”,当控件CUDP发送数据时,将数据发到主控机的2222口。

在implementation后面加入变量定义

const BufSize=2048;{ 发送每一笔数据的缓冲区大小 }

var

BmpStream:TMemoryStream;

LeftSize:Longint;{ 发送每一笔数据后剩余的字节数 }

为Client的OnCreate事件添加代码:

procedure TClient.FormCreate(Sender: TObject);

begin

BmpStream:=TMemoryStream.Create;

end;

为Client的OnDestroy事件添加代码:

procedure TClient.FormDestroy(Sender: TObject);

begin

BmpStream.Free;

end;

为控件CUDP的OnDataReceived事件添加代码:

procedure TClient.CUDPDataReceived(Sender: TComponent;

NumberBytes: Integer; FromIP: String);

var

CtrlCode:array[0..29] of char;

Buf:array[0..BufSize-1] of char;

TmpStr:string;

SendSize

LeftPos

TopPos

RightPos

BottomPos:integer;

begin

CUDP.ReadBuffer(CtrlCode

NumberBytes);{ 读取控制码 }

if CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]='show' then

begin { 控制码前4位为“show”表示主控机发出了抓屏指令 }

if BmpStream.Size=0 then { 没有数据可发,必须截屏生成数据 }

begin

TmpStr:=StrPas(CtrlCode);

TmpStr:=Copy(TmpStr

5

Length(TmpStr)-4);

LeftPos:=StrToInt(Copy(TmpStr

1

Pos(':'

TmpStr)-1));

TmpStr:=Copy(TmpStr

Pos(':'

TmpStr)+1

Length(TmpStr)

-Pos(':'

TmpStr));

TopPos:=StrToInt(Copy(TmpStr

1

Pos(':'

TmpStr)-1));

TmpStr:=Copy(TmpStr

Pos(':'

TmpStr)+1

Length(TmpStr)-

Pos(':'

TmpStr));

RightPos:=StrToInt(Copy(TmpStr

1

Pos(':'

TmpStr)-1));

BottomPos:=StrToInt(Copy(TmpStr

Pos(':'

TmpStr

)+1

Length(TmpStr)-Pos(':'

TmpStr)));

ScreenCap(LeftPos

TopPos

RightPos

BottomPos); {

截取屏幕 }

end;

if LeftSize>BufSize then SendSize:=BufSize

else SendSize:=LeftSize;

BmpStream.ReadBuffer(Buf

SendSize);

LeftSize:=LeftSize-SendSize;

if LeftSize=0 then BmpStream.Clear;{ 清空流 }

CUDP.RemoteHost:=FromIP; { FromIP为主控机IP地址 }

CUDP.SendBuffer(Buf

SendSize); { 将数据发到主控机的2222口 }

end;

end;

其中ScreenCap是自定义函数,截取屏幕指定区域,

代码如下:

procedure TClient.ScreenCap(LeftPos

TopPos

RightPos

BottomPos:integer);

var

RectWidth

RectHeight:integer;

SourceDC

DestDC

Bhandle:integer;

Bitmap:TBitmap;

begin

RectWidth:=RightPos-LeftPos;

RectHeight:=BottomPos-TopPos;

SourceDC:=CreateDC('DISPLAY'

''

''

nil);

DestDC:=CreateCompatibleDC(SourceDC);

Bhandle:=CreateCompatibleBitmap(SourceDC

RectWidth

RectHeight);

SelectObject(DestDC

Bhandle);

BitBlt(DestDC

0

0

RectWidth

RectHeight

SourceDC

LeftPos

TopPos

SRCCOPY);

Bitmap:=TBitmap.Create;

Bitmap.Handle:=BHandle;

BitMap.SaveToStream(BmpStream);

BmpStream.Position:=0;

LeftSize:=BmpStream.Size;

Bitmap.Free;

DeleteDC(DestDC);

ReleaseDC(Bhandle

SourceDC);

end;

存为“C:\VClient\ClnUnit.pas”和“C:\VClient\VClient.dpr”,

并编译。

第二步,编制VServer.exe文件。新建Delphi工程,将窗体的Name属性设为“Server”。加入TNMUDP控件,Name属性设为“SUDP”;LocalPort属性设为“2222”,让控件SUDP监视主控机的2222端口,当有数据发送到该口时,触发控件SUDP的OnDataReceived事件;RemotePort属性设为“1111”,当控件SUDP发送数据时,将数据发到受控机的1111口。加入控件Image1,Align属性设为“alClient”;加入控件Button1,Caption属性设为“截屏”;加入控件Label1,Caption属性设为“左:上:右:下”;加入控件Edit1,Text属性设为“0:0:100:100”;加入控件Label2,Caption属性设为“受控机IP地址”;加入控件Edit2,Text属性设为“127.0.0.1”;

在implementation后面加入变量定义

const BufSize=2048;

var

RsltStream

TmpStream:TMemoryStream;

为Server的OnCreate事件添加代码:

procedure TServer.FormCreate(Sender: TObject);

begin

RsltStream:=TMemoryStream.Create;

TmpStream:=TMemoryStream.Create;

end;

为Client的OnDestroy事件添加代码:

procedure TServer.FormDestroy(Sender: TObject);

begin

RsltStream.Free;

TmpStream.Free;

end;

为控件Button1的OnClick事件添加代码:

procedure TServer.Button1Click(Sender: TObject);

var ReqCode:array[0..29] of char;ReqCodeStr:string;

begin

ReqCodeStr:='show'+Edit1.Text;

StrpCopy(ReqCode

ReqCodeStr);

TmpStream.Clear;

RsltStream.Clear;

SUDP.RemoteHost:=Edit2.Text;

SUDP.SendBuffer(ReqCode

30);

end;

为控件SUDP的OnDataReceived事件添加代码:

procedure TServer.SUDPDataReceived(Sender: TComponent;

NumberBytes: Integer; FromIP: String);

var ReqCode:array[0..29] of char;ReqCodeStr:string;

begin

ReqCodeStr:='show'+Edit1.text;

StrpCopy(ReqCode

ReqCodeStr);

SUDP.ReadStream(TmpStream);

RsltStream.CopyFrom(TmpStream

NumberBytes);

if NumberBytes< BufSize then { 数据已读完 }

begin

RsltStream.Position:=0;

Image1.Picture.Bitmap.LoadFromStream(RsltStream);

TmpStream.Clear;

RsltStream.Clear;

end

else

begin

TmpStream.Clear;

ReqCode:='show';

SUDP.RemoteHost:=Edit2.Text;

SUDP.SendBuffer(ReqCode

30);

end;

end;

存为“C:\VServer\SvrUnit.pas”和

“C:\VServer\VServer.dpr”,并编译。

四、测试。

1、本地机测试:在本地机同时运行Vserver.exe和VClient.exe,利用程序的默认设置,即可实现截屏。查看“控制面板”-“网络”-“TCP/IP”-“IP地址”,将程序的“客户IP地址”设为该地址 ,同样正常运行。

2、远程测试:选一台受控机,运行VClient.exe;另选一台主控机,运行VServer.exe,将“受控机IP地址”即Edit2的内容设为受控机的IP地址,“截屏”即可。以上简要介绍了远程屏幕抓取的实现方法,至于在主控机上一屏同时监视多个受控机,读者可自行完善。以上程序,在Windows98对等网、Delphi 4.0下调试通过。

12月28日:1903年计算机之父冯&#183;诺依曼出生 Android木马病毒:伪装成Google Play图标进行DDoS攻击 IE10 CSS Hack 程序员技术分享:训练机器学习 SVM算法解析 2013,谷歌的数据科学家都将干什么呢? Facebook“也”对服务器进行浸泡冷却 日本最大电脑商:Windows 8表现并不好 日均新增415个应用,Windows 8应用总数突破35000 百度推出图像搜索引擎“百度识图” 可基于图像实现全网人脸搜索 解决专利纠纷 RIM向诺基亚预付6500万 巨头的得意与失落:2012移动游戏十大收购案 Mozilla或许将发布iOS平台浏览器Junior Mozilla:Facebook手机将采用Firefox OS Anonymous2013年将放慢脚步,McAfee预测遭质疑 一周消息树:Facebook公布2012年Hackathon大赛顶级“黑客作品” HTML+CSS+JS 开发 Firefox OS 应用编程实战 前端开发工程师如何在2013年里提升自己 Java受Objective-C影响很大 而不是C++ Instagram回击报告指责:用户仍保持增长态势 回顾:2012年科技行业十大败笔 苹果地图入选 Amazon CEO Jeff Bezos:好年景,大挑战 2012年度盘点:移动互联网大事件回顾 详解Amazon Redshift 移动周报:再见,2012!你好,2013! 英特尔或在2月宣布其电视计划:提供分类频道 Prismatic:用机器学习分析用户兴趣只需10秒钟 谷歌布局亚太地区数据中心建设 服务响应速度有望提升30% 2013年移动互联网行业技术趋势前瞻 老骥伏枥志在千里:回顾微软这一年 2013或将崛起 水落石出:在与谷歌苹果竞购创业公司中微软胜出 用扁平化的界面设计吸引用户 如何在DataGrid中加入CheckBox,并确定是否被选中?急!!! 关于用户自定义page类的问题 存储过程中IF EXISTS(select @result=aaa from tbl)提示等号附近有语法错误!!! 请问除了设置Anchor属性外如何保证窗体放大后组件的位置和大小? 如何在BCB中动态创建对象? SOS 救火 帮忙看个错,数据库连接问题 看看这个xml怎么用xsl解析 在DELPHI中,怎么遍历相同的控件? 一个简单的问题---在线等 在线等待:如何捕捉listctrl垂直滚动条的点击事件? 控件分类管理 急求一个递归统计函数,能解决者马上给分!!! 如何在ie中只打印iframe里面的页面内容 求select语句 请jennifergiant来领分,谢谢 如何将在内存中创建的BMP文件加载到页面上??? 帮忙看个错,ORA-00600 那里可以下载测试工具(Loadrunner,testdirector) 如何写一个往数据库里插入记录的公共模块啊? 文本两边对齐 请问sqlserver2000中bit类型值怎样表示 谁有jspsmart 上传组件。我上不了jspsmart.com ,好心人给我发一个!!! 时间格式有误,不知是何原因? 怎样开、关进程!(不是线程)? 今年高考的一篇旷世奇文 cnn连接怎么单独写出来,让Sub或Function调用?不用每次都写一次连接, 请附上Code ,谢谢 请教multibytetowidechar的用法 请救各位. 关于用nmudp实现传输!up也有分,:)) jcreator的debug模式不是很好用,怎么(黄色小三角)指的位置不对啊? 关于用mscomm编程的问题,请大虾指教 导出数据库和操作时经常出现无法分配共享内存错误. 关于ListBox 重分请教:关于制作自定义报表的问题!!! 请问怎样编程查询一个字符串的五笔字型编码? 我们单位要上ERP,作为公司分管微机这一块的我该准备些什么? 右键菜单问题 d7+ADO+SQL2000,如何判断SQL2000数据库中存在某个表? 想要去清华读研究生,大家帮忙出出意见!!!!!!!!!!!!!!!!!!!!!!!! 大价钱求解小问题 好硕的5460!!!! iwantsay 关于MSComm的output和Chr()函数的问题 好久没来这里了这里的朋友们还在吗? 如何在TreeView的节点中调用一个方法? 关于deploytools 一个有关代理文件操作的问题,困扰很久了!! 如何由资源ID得到资源的句柄 向oracle 中插入纪录,日期格式由问题,见内 查询问题 如何取消验证 1–4题求解英语 《童趣》一文作者是靠什么来获取物外之趣的? 请问word 文档中怎么计算数字的和说出来吧,十分感谢各位朋友了1o what are you up to this week? 二十四星座分别是哪几个月? 高二数学,三角形问题已知三角形ABC中a∧2=b(b+c),A=60°求sinC/sinB 高二数学题(三角形)在三角形ABC 中,(cosA)/a=(cosB)/b=(cosC)/c 求三角形形状 高二数学三角形问题在三角形ABC中,内角A,B,C所对的边分别为a,b,c,已知sinB(tanA+tanC﹚=tanAtanC,求角B的取值范围. 三角形.急已知△ABC的内角A,B,C所对的边分别为a,b,c,且a=2,cosB=3/5,求〔1〕若b=4,求sinA的值.〔2〕若△ABC的面积等于4,求b,c的值 高二数学三角形问题,谢谢啊在△ABC中,已知AB=4,AC=7,BC边上的中线长AD=7/2,那么BC=( ) 太阳耀斑会有什么影响 \"流浪女诞龙凤胎\"续:父母很恼火台风吹高的菜价开始回落了 花菜走下坡台风“菲特”过后 完善农业保险成为焦事成于气正 业兴于风清 浙江开展正风金华市金东区换届试点中查处3起贿选案杭州市委常委会专题研究三季度经济形势明治奶粉宣布撤出中国大陆市场韩国抗议日本“竹岛宣传片”日本自卫队逾3万人下月演练“夺岛”(韩国视宣传片为挑衅要日本删视频韩国议员获准访问开城工业园通力协作 合力救援 于田地震应急救“短平快”项目:维药发展“及时雨”我区引导社会力量广泛参与居家养老多举措深化改革推进社会稳定 伊犁州开坚持巩固壮大主流思想舆论 四论学习贯14个地州市相继动员部署第二批教育实夯实基层基础工作 七论再接再厉搞好第罗杰斯:伟大的胜利! 我们想争冠所以冬奥综述:短道速滑三足鼎立 速滑赛场普鲁申科盛赞羽生结弦 称四年前曾拒绝四川盐源ML1.4地震
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘