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

用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下调试通过。

验证码识别基础方法及C#/.NET源码 傲逆软件CEO周鲁:核心游戏精神,在移动游戏创作中传承 Kim Dotcom推出新文件存储服务平台Mega 用户数一天达百万 美FCC:希望全美在2015年部署千兆以太网 iOS和Android双平台:帷千动媒SDK 3.0发布 移动周报:2013年移动App设计13大精髓 构建高可扩Web架构和分布式系统实战(下) API设计的十大最差和五大最佳实践 Hadoop:为什么RAID-0不行? 电子前沿基金会:实现互联网自由需翻越5座大山 安全无小事:2013年最令人期待的15家安全公司 移动电商:更喜欢用HTML5代替原生APP Talkingdata行业预警:移动游戏正在变成红海 微软无视W3C 拒绝遵循WebRTC标准 Linux下使用MongoDB+GridFS实现备份作业的优化和监视 AWS建新数据中心 老用户获益不易 铜导线退出历史舞台 激光传导速度将达100G bps 大众点评推出首个O2O开放者平台:高德、盛大加入 从APM角度上看:NoSQL和关系数据库并无不同 新浪微博商业化:大树底下真的好乘凉吗? 亲爱的GitHub,我们怎么访问不了你? 经典神作《魂斗罗》iOS版今日上线 专访最强夫妻店:“神庙逃亡2”开发背后的故事 我们做错了什么?3周了,一毛钱也没赚到! 开源产品系列:简单强大的模板语言JSON Template 十年历史的KDE bug修复 为什么函数式编程在Java中很危险? Android平台获X11协议支持,手机变身绘图板 Rackspace通过OpenStack和定制OCP服务器节省40%成本 美国人是如何利用大数据的应用来防止流感的蔓延 W3C北航总部成立:招兵买马增强中国标准声音 请问在JBuilder中怎么调整控件的位置好啊? 怎么在非客户区添加个按钮?遮住最大化按钮呢?我头都想炸了 请问如何查看WIN2000系统里是否被安装了类似“冰河”之类的软件? 如何打印整个对话框 寻找将realplay录像(ram格式文件)转换成mpeg或avi的软件。 OTDR(TD3000)的接口编程,谁做过!!!!!!!!!!!!请进 百分求方案!!请大家不吝赐教!(报表汇总,打印相关,有一定难度!!!) 干掉最大化按钮! 谁能帮我解释一下Petzold这些话的意思: 绝对给分,谢谢各位大侠帮我解决这个很简单的问题罗!:( 关于古老的DDE通信的几个头痛的问题. yangrenzhi你今天怎么啦,有事就说出来啊 如何获得一个变量的字节长度 关于JAVA的简单问题(送分) 为什么不能筛选数据? 有关Acrobat 组件的错误 关于火车查询 CTreeCtrl 的同一item项被多次点击时,会出发什么消息?你知道吗? WINCE的市场 控件ID有何用? 初学XML,请问ASP传回的中文字怎么是乱码? 请问圆锥体侧面积计算公式是什么?快阿,正在考试!!!!!!!!!!!!!! (♂逍遙剑♂) 过来聊聊!进来! 怎样用文件的形式对数据库进行备份? 能在标题栏添加控件吗?谁能告诉我? 谁知道在Activex控件中事件执行顺序的问题 3山好可怜,被女人抓住了把柄,知道了粗细长短,哎。。。 想在odbc里用程序的方法建立驱动,怎么实现? vc编的DLL怎样处理LIB在BCB中可以直接用哦?我用WINAPI那个约定 救命的!!! 深圳的“同志”好多啊!有一个哥们还向我推荐了一个同志网站,可惜我不是同志,如果有同志需要的话,可以去找那些深圳同志接头! 有懂EJB ,weblogic 大连的朋友吗? to fightwolf:give she some color to see see. 装delphi 6之前是不是要装ie5.5? 现在有一个问题:在大数据量传输的情况下,想采用异步传送方式,请问如何实现? 关于比例问题!! 有人说:做程序员很累,但我很快乐?广大程序员朋友们,有谁同意这个说法吗? 那该怎么办? MFC开发的ActiveX怎么都是OCX,可不可以是DLL,如果可以该怎么做。 如何获得当前活动控件的引用? 哪里有获得指定IP地址的机器网卡MAC地址的源程序? 新手上路:请问系统安全的市场前景如何? 'select * from a where b like ''[as]%'''这一句有没有错呢? 哪能找到 VBScript 5.0 的联机文档 为什么第七期的杂志我还没收到啊!!~~,原以为提前先订几期,会早点收到!唉!~~ php打开CSV文件的问题!答来分去! 各位有用过aspchart这个控件的吗?为什么我不能生成图片呢? 我有一个问题大家帮我UP一下 用HTML可以制作留言版吗?有使用mailto的吗? 大哥们,小弟我准备学JAVA了给推荐几本好书吧!小弟不胜感激啊! 因为JAVA,我差点把机子砸了 一辆玩具车在一条直线上跑,先向后跑了6米,记作-6米,那么玩具车又跑了+6米是什么意思?这时它离移动前的位置有多远? 20mL 0.1mol/L的CH3COOH溶液中和10mL 0.1mol/L NaOH溶液 请列出所有粒子的浓度大到小?请说明为什么这样排 中和100mL 1mol/L的H2SO4溶液,需要多少g 1.备车 2、停车3、完车4盘车5正车6倒车7飞车8冲车9试车101.备车 2、停车3、完车4盘车5正车6倒车7飞车8冲车9试车10并车11车钟12一车13二车14三车 常温下,用0.1MOL/L的NAOH滴定20ML.0.1MOL/L的HAC溶液.当V(NAOH)=10ML时.溶液中:C(AC-)+2C(OH-)=C(HAC)+2C(H+) 为什么是对的? 中和100ml 1mol/L的硫酸 需要多少的NaOH? 朗逸车LAVIDA1.6下面一排小的英文是什么意思 0.1mol/L的硫酸20mL与0.2mol/L的硫酸10mL混合,求混合液物质的量浓度用0.6mol/L的NaOH溶液A与0.1mol/L的溶液B混合配制0.2mol/L的NaOH溶液,求A与B的体积比 用20ml0.2mol/L的NAOH溶液中和0.1mol/L硫酸溶液,需要盐酸溶液的体积是多少? 一瓶葡萄糖盐水是多少毫升?实际调查噢! 将20ml 0.1mol/L NaOH 溶液和 10ml 0.1 mol/L CH3COOH 溶液混合后并加强热,最终得到的固体是?答案是Na2CO3 等体积的o.1mol/L盐酸,硫酸,用o.1mol/L氢氧化钠溶液中和,当恰好完全反应时,消耗NAOH溶液体积的大小 5%葡萄糖注射液 500ml 【规格】:500ml,25g 该注射液中葡萄糖的物质的量浓度为5%葡萄糖注射液 500ml【规格】:500ml,25g该注射液中葡萄糖的物质的量浓度为____. 现有25ml盐酸和硫酸的混合液,加入1mol/L的NaOH溶液25ml恰好中和,在中和后的溶液中加过量的Ba(OH)2溶液,所得沉淀质量为1.7475g,求混合溶液中盐酸和硫酸的物质的量浓度各是多少? 若100mL0.1mol/L硫酸铝溶液和氢氧化钠溶液反应得到1.17g沉淀,则需要0.5mol/L的NaOH溶液的体积我知道答案就是不明白为什么分Al离子过量和OH根过量 求该注射液中葡萄糖的物质的量浓度.葡萄糖(C6H12O6) 将100毫升0.2mol/l的NaOH溶液与多少毫升的0.1Mol/L的硫酸溶液混合,才能恰好完全中和 若100mL0.1mol/L硫酸铝溶液和氢氧化钠溶液反应得到1.17g沉淀,则需要0.5mol/L的NaOH溶液多少毫升?当OH-过量时为什么 Al3+是0.02mol?谁给我讲明白追加20 我Q 10561252 医用葡萄糖注射液的葡萄糖的质量分数为5%.密度约为1g/cm³,则此注射液中葡萄糖的物质的量浓度是多少希望稍微详细点 中和100ml 1mol/l的硫酸,需要多少氢氧化钠(质量)? 在100ml 1mol/L盐酸溶液中加入50ml,1mol/L氢氧化钠溶液后,将反应后溶液加水稀释至500ml,则稀释后溶液的PH值是多少? 500ML的葡萄糖注射液,重量是多少克(大概)?这种葡萄糖注射液的葡萄糖浓度是多少? 2mol/L的硫酸100ml能与多少毫升1mol/L的氢氧化钠完全中和 0.1mol/l的HCL与0.1mol/lNaOH反应多滴一滴NaOH(0.05ml)将溶液稀释50ml 问溶液PH值 500ml水中含有25g葡萄糖,该葡萄糖溶液的质量分数 完全中和100ml、0.1mol/L的硫酸溶液、需要0.05mol/L的氢氧化钠溶液多少毫升 将一定质量的MgAl合金全部溶解在500mL盐酸中(体积变化不计),取10mL反应后的溶液,用1mol/LNaOH溶液滴定得下图关系.(1)求Mg,Al质量各是多少?(2)求盐酸的物质的量浓度为多少mol/L? 500ml内含葡萄糖25g,先要配制20kg这种葡萄糖注射液,需要葡萄糖多少千克? 将镁铝的混合物0.1mol溶于100mL2mol·L-1硫酸溶液中,再滴加1mol·L-1氢氧化钠溶液,若在滴加NaOH溶液过程中,沉淀质量m随加入氢氧化钠的体积v变化关系如图.当V1=160ml时,请回答(1)无视镁铝比例如何 实验室需要0.1mol/LNaOH溶液450mL和0.5mol/L的硫酸溶液500mL.根据这两种溶液的配制情况回答下列问题.根据这两种溶液的配制情况回答下列问题.用质量分数为98%密度为1.84g/m³的浓硫酸体积为 5%葡萄糖(C6H12O6)注射液 500mL 【性状】………… 【规格】500mL,25g 1)该葡萄糖注射液中葡萄糖的质量不明白质量分数的计算中是否应当再次加上水的质量,若加了,就变成百分之4.8,若不加则为 将0.1mol的镁铝混合物溶于100ml 2mol/L的H2SO4中,然后滴加1mol/L的NaOH溶液,请回答:⑴若在滴加NaOH溶液的过程中欲使Mg2+、Al3+刚好沉淀完全,则滴入NaOH溶液体积为________ml⑵若混合物仍为0.1mol其中 向0.1mol\L的AL2(SO4)3溶液100mL中加入0.5mol\LNaOH溶液得到1.17沉淀,加入的NAOH溶液的体积可能是A.130ML或90ML B.100ML或50ML1.17后面是 克 5%葡萄糖(C6H12O6)注射液 规格:500ml 25g 求该注射液中葡萄糖的物质的量浓度为多少?该注射液的质量分数是多少? 将镁铝的混合物0.1mol溶于100mL2mol·L-1硫酸溶液中,然后再滴加1mol·L-1氢氧化钠溶液,请回答以下问题:若在滴加NaOH溶液过程中,沉淀质量m随加入氢氧化钠的体积v变化关系如图.当V1=160ml时,金属粉 完全中和0.1mol/LNaOH溶液500ml,需要硫酸的物质的量是多少?若硫酸的物质的量溶度为0.20mol/L,则需要硫酸 将25g葡萄糖溶于水,配成500ml溶液该溶液的质量浓度为多少 将镁铝混合物0.1mol溶于100ml2mol/l的硫酸溶液中,然后在滴加2mol/l亲氧化钠溶液 19.将一定质量的Mg.Al合金全部溶解在500ml盐酸中(体积变化不计),取10ml反应后的溶液,用1mol/L的NaOH溶液滴定得下图关系 (1)求Mg.Al质量各是多少?(2)求盐酸的物质的量浓度为多少?就是没图 如何用含结晶水的葡萄糖C6H12O6·H2O配制质量为50.0g/L的葡萄糖溶液500mL?设溶液密度为1kg/L,该溶液的物质 将0.1mol镁、铝合金溶于100mL2mol/L的H2SO4溶液中,然后滴加1mol/L的NaOH溶液,生成沉淀与所加NaOH溶液体积的关系如图所示当溶液中Mg2+、Al3+恰好沉淀完全时,V(NaOH)=当V1=160mL时,金属粉末中镁的物质 将5.1克Mg、Al合金投入500mL 2mol/L盐酸中,金属完全溶解后,再加入4mol/LNaOH溶液多少毫升时所得沉淀质量最多? 您好 请问如何用含结晶水的葡萄糖配置质量浓度为50g/L的葡萄糖溶液500ml? 某种未知浓度NaOH的溶液25ml,加入20ml,1mol/L的H2SO4溶液后显酸性.再滴入1mol/L ,KOH溶液1.5mL,恰好呈中性.计算NaOH溶液的物质的量浓度 蒋30mL0.5mol/LNaOH溶液加水稀释到500mL,稀释后溶液中NaOH的物质的量浓度为( )A.0.3mol/L B.0.03mol/L 二氧化硫和氧气化合 催化剂是什么? 现有25mlHCl和H2SO4的混合液,加入1mol.L^-1的NaOH溶液25ml恰好中和,在中和后的溶液中加入过量的Ba(OH)2溶所得沉淀质量为1.7475g,求混合溶液中盐酸和硫酸的物质的量浓度 将30ml 0.5mol/LNaOH溶液加水稀释到500ml,稀释后溶液中NaOH的物质的量浓度是? SO2与O2的混合气体中,O2的体积分数是50%,则该混合气体在标准状况下的密度是 某盐酸溶液25ml,加入1mol/L的Ba(OH)2溶液20ml,剩余的酸需用0.5mol/L的NaOH溶液20ml才能恰好中和.求该盐酸溶液物质的浓度? 将0.5mol金属钠、镁、铝分别加入100ml1mol/LNAOH溶液中、产生的气体在相同条件下 在标准状况下.2.24升二氧化硫和氧气的混合气体中所含的氧原子数为多少?怎么算的 某盐酸溶液25ml,加入1mol/L的Ba(OH)2溶液20ml,剩余的酸需要0.5mol/L的NaOH溶液20m求该盐酸的溶液的物质的量浓度 实验室配置500ml 0.1mol/L 的NaOH溶液 需要多少NaOH 固体化学实验题 六串一什么意思 要出去氧气中混有的二氧化硫气体,最好让混合气体通过A 浓硫酸 B 氢氧化钠溶液 C 澄清石灰水 D 蒸馏水 为什么? 100mL 0.1mol/L 的两溶液中和等物质的量的氢氧化钠关于盐酸和醋酸说法正确的是:100mL 0.1mol/L 的两溶液能中和等物质的量的氢氧化钠 ?这句话对吗?为什么? 每辆汽车后面都有一个小数(比如说1.6).这个小数代表什么 10ml 0.1mol/L HCL 与10ml 0.2mol/L NaOH混合,求该混合溶液的PH值. 100mL 1MOL/l氢氧化钠溶液与100mL 1mol/L的硫酸溶液恰好中和
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn