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

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

百会中小企业CRM年会成功举办 发布CRM选型指南 诺基亚创新体验中心NEIC训练团正式开班 新威胁:IE新漏洞允许网站跟踪鼠标 少编码多思考:代码越多 问题越多 [简讯] JDK 7u10发布 修复安全漏洞 搜狗茹立云:为何搜狗语音助手比Siri更精准? BlackBerry 10最终版SDK Gold发布 谷歌地图正式登陆App Store 为开发者推出SDK 你的云数据的三个最大威胁 公开叫板:Google不打算推出Win8版Gmail和Drive APP备案风波:开发者何去何从? 32位和64位的JVM 我该选择哪个呢? 黑莓“Got Game Port-a-Thon”活动将于12月22日在北京举行 专访Moti Joseph:浏览器安全的经验之谈 四大开源云平台的命运基因 FPS移动游戏:画质不是第一位,操控才是死穴 微软2013年的五个安全预测 应用成武器 王淮,大城小胖论辩HTML5 局部有小雨 技术人员创业后就不再适合继续编码了? Google Dremel vs Apache Hadoop 低功耗之争:英特尔 VS ARM NEIC-诺基亚体验创新中心 助力开发者创享新移动互联时代 Google地图主管Daniel Graf:新设计,新目标 浴火重生:OpenFeint创始人推开源平台OpenKit 紧随AWS数据仓库服务 Rackspace力鼎Cloudant 创业者谈:畏惧失败,但也要拥抱失败 谷歌赢得一场战斗 苹果能否赢得战争? 走进大学校园:是什么让学生成为独立开发者? 移动周报:为什么说独立开发者才是光明康途? MapFan eye:看日本地图导航应用的新玩法 数据会被清空:部分三星、魅族手机存安全漏洞 在ASP中确定当前用户帐户用何办法? 我以前问过的问题,但是没有解决?现在100分买?谁能解决???? fastreport的中文帮助,或者例子? edit的问题,up有分 用adoquery建立的查询在执行时出错! 还有一个问题 业务纪录的自动编号!!! 请问各位大侠."查找",这个函数怎么写. Proc++ :where LPAD(FieldName,6,'0') = :myFieldValue 为啥错? 用OPENGL编制基于对话框的程序要求把所绘的三维图形显示在对话框的一个区域??? 谁知道用socket通信,一秒鈡最多可以传多少条? 我要是想把已有SQL数据库变成*.SQL文件到别的机器上直接建库怎么做? 我用标准输入输出流来输入字符串到string的对象里,为什么得不到空格和以后的字符? 转一篇文章——有关LSD的罐头 (有点长,没耐心的就不用看了^o^) 送分! 超过10个回复请勿再进!!! VC程序调试问题 懂电路分析者请进 求树型菜单的代码??马上给分!!! VC可以调试可执行文件吗??? 请高手指点迷津 :) 求树型菜单的代码?? 如何使列表控件的第一列居中(包括标题文本和内容文本)??? 用查表法按ALPHA混合R、G、B也会这么慢?奇怪!(有源码)(50 怎样用vc开发一个动态链接库让PB调用,要求参数为字符串 3dmax 的问题 关于用alert("信息!")弹出的对话框 up up up up up up up up up up up up up 请问“IE登录时”为什么Domino检测不到我的Username and password? 着急,这条sql语句怎么写?????? 爱的密码 散分啰!!统计BCB论坛现有成员... 这样的COM组件如何实现? 请教:我想学lotus,可不知哪有lotus和lotus教程下载,望指教! 多选项提交过来的值是什么类型的? ORA-03113: end-of-file on communication channel谁知道??高手救命! 星际争霸几大战略(大家切磋切磋) CHtmlView的刷新问题 关于asp.net加密的讨论 怎么样把两个ArrayList合并成一个??我在文档里找了半天也没找到!急~~!!!!!!!! 》》》菜鸟发问:SQL SERVER2000 可以对 office 文档进行全文检索吗? How to alter DBGrid Scrollheader Color? c怎样访问数据库啊?一定给分! from里的参数传递为ENCTYPE="multipart/form-data"时的问题? 网吧问题 如何在txt文件中查找字符 请问如何实现当进入一个combox时自动下拉列表框(不用用鼠标去点) 关于volatile 修饰词 过去用Delphi开发数据库都是用Access,现在急需使用SQL Server。请问:我必须掌握SQL Server中的那些内容。 如果我想删除日志文件的所有记录该怎么办?????? 怎么样把两个ArrayList合并成一个??我在文档里找了半天也没找到!急~~!!!!!!! 请问,NT4.0下怎样配置网关和路由? 请问如何知道一个弹出菜单是否以经关闭 一个三角形面积是十八平方米它等底等高的平行四边形的面积是多少 要想使塑料化工桶增加强度怎么生产我生产的是50公斤白塑料桶 一个圆形草坪的半径是40米,草苹的周围修有一条10米宽的水泥马路,这条马路的面积 夏天给自行车的轮胎打气时,为什么不能打得太足?从分子角度讲要从分子角度说明! 化工桶上的CN号是什么意思那能不能根据上面的编号查处是那种物品,换句话说是不是一个编号一种料 水果店里苹果比梨少60千克,苹果卖出一半后,比梨少100千克,水果店原有苹果和梨各多少千克? 用分子的知识回答:自行车轮胎打气后涨大变硬 图为正方形园子一角,正方形的边长为x,里面有两个半圆形花池,阴影部分是草坪,求草坪的面积.________. 一个长方体长30厘米,宽20厘米,里面装有10厘米深的水,现在有一块长和宽都是8厘米,高是15厘米的长方体石块.,《1.》如把石料横着放入水中,水面上升多少厘米,《2》如果把石料竖着放人容器里, 轮胎充气有什么用呢?自行车的轮胎如果不充气会怎么样,为什么要充气? 如图,阴影部分表示校园的草坪,空白部分表示小路,计算草坪的面积.长为a,宽为b,小路宽为x. 水果店运来一批红富士苹果,准备分甲,乙两个等级卖,甲等级的每千克8元,乙等级的每千克6元,这样卖出这批苹果共得580元,如果每千克苹果都降价1.5元,这批苹果只能卖460元,问甲,乙两个等级的 水果市场运来苹果6000千克卖出百分之20卖出多少千克还剩多少千克 某小区有一块边长8米的正方形空地,下面是小明设计的绿化方案平面图,空白部分为花坛,阴影部分为草坪.1.要在花坛四周围上篱笆,篱笆的长是多少米.2.计算花坛的面积是多少平方米? 水果店运来一批红富士苹果,准备分甲,乙两个等级卖,(只能设一个X)水果店运来一批红富士苹果,准备分甲,乙两个等级卖,甲等级的每千克8元,乙等级的每千克6元,这样卖出这批苹果共得580元, 一个三角形的面积比与它等底等高的平行四边形的面积少43平方米,求这个平行四边形的面积是(). 阴影的部分是草坪空白部分是花圃,求草坪的面积 水果店运来苹果,分甲乙俩个等级卖,甲等级8元,乙等级6元,这样苹果卖出580,甲乙等级 油罐车放油如何少给 某公园欲建如图所示的草坪(阴影部分)需要铺设草坪多少平方米?若每平方米草坪需120某公园欲建如图所示的草坪(阴影部分)需要铺设草坪多少平方米?若每平方米草坪需120元,则修建该草坪 一个长方体玻璃容器,长8厘米,宽5厘米,高6厘米,在这个容器中倒入160毫升的水,再把一个铁块放入水中(铁皮被水完全侵没时,溢出水28毫升)这个铁块的体积是多少立方厘米? 装油的油罐车的尾部总装有一根脱在地上的铁链,这是为啥?HELPTHANKS 如图为园子一角,正方形边长为x,里面有两个半圆形花坛,阴影部分是草坪,求才草坪的面积是多少?他是多项它的次数是多少?图是一个正方形,正方形里面有两个半圆,半圆的大口一个朝左,一个朝 将内径为30cm,高为hcom的圆柱形水桶装满水,倒入一个长方体的水箱中,水只占水箱容积的四分之一,则水箱则水箱的容积是( )立方厘米。(内径指圆柱的底面直径) 一个三角形的面积是80平方分米,它的底是16米,高是多少米?(用方程解答) 有一个长50厘米,宽30厘米的长方体水箱,放入一个长和宽都是10厘米的铁块,水面上升了1厘米,求铁块的高 水果店有苹果240千克,苹果比梨少1/5,梨有多少千克 王大伯开了一间水果店他到苹果产地进货每千克1.2元一次他到产地买了5000千克苹果光运费就200元他还想得到百分之二十的利润每千克定价多少元 如图所示,分别在三角形,四边形,五边形的广场各角修建半径为1米得扇形草坪分别在三角形,四边形,五边形的广场各角修建半径为1米得扇形草坪图1草坪面积为( )用π表示图2草坪面积为( ) 根据算式补充相对应的条件:水果店运来苹果5/8吨,【 】,运来梨多少吨?【记住填条件撒】一、5/8+4/5【 】二、5/8×4/5 【 】三、5/8÷4/5【 】四、5/8×(1+4/5)【 】五、5/8÷(1+4/5)【 】六、5 王大伯开了一个水果店,他到苹果的产地进货,每千克1.20元.一次他到产地买了5000千克的苹果,光运费就用了200元,他还想得到20%的利润,每千克应定价多少元? 如图所示,分别在三角形、四边形、五边形的广场各角修建半径为R的扇形草坪(1)图1中草坪的面积为 (2)图2中草坪的面积为 (3)图3中草坪的面积为 (4)如果多边形边数为n,其余条件不 水果店共有梨和苹果440箱,其中梨比苹果多20%,梨和苹果各有多少箱? 一油罐车有多少吨 如图所示,分别在三角形,四边形,五边形,六边形的广场各角修建半径为R的扇形草坪,如图所示,分别在三角形,四边形,五边形,六边形的广场各角修建半径为R的扇形草坪(图中阴影部分) (1)图1中 一个长十二厘米宽八厘米高五厘米的石块仅在一个长方体水箱中,取出后水下降了1.5厘米水箱底面积是多少 一个三角形的底边长6米,如果底边延长2米,那么面积就增加3米.原来三角形的面积是多少平方米? 5吨油罐车哪个好 如图所示,要在三角形广场ABC的三个角处各建一个半径相同的草坪,要求扇形的半径为20M,求草坪的总面积.(π取3. 一个三角形的面积是360平方分米,底是30分米,高是多少分米? 梦到油罐车爆炸梦见亲眼看见油罐车泄漏,起火,然后拨打了110,然后听到爆炸,死了好多人 如图所示,分别在三角形,四边形,五边行,的广场各角修建半径为r的扇形草坪. 油库、面粉厂、锯木厂、纺织厂、矿井、煤气站等地为什么要严禁烟火如题 北京房山油罐车爆炸了,油罐车为什么会爆炸?3Q北京房山油罐车爆炸了.请问,有什么危险因素会导致这种油罐车爆炸吗? 在一个长、宽、高分别为30厘米,60厘米,80厘米的长方体水箱中,不计厚度有A、B两个进水管,先打开A管,经过一段时间后打开B管,两管同时进水.下面折线图表示进水情况,请根据图回答问题.(A、B 油库附近严禁烟火是由于( )A.分子之间有间隙B.汽油分子在不断地运动C.同种分子的性质相同C.汽油分子非常小 油罐车爆炸影响会污染吗 一个无盖的长方体水箱的底面长80厘米,宽是50厘米,高是60厘米.这个水箱能装水多少升? 为什么面粉厂和加油站一样,也高挂“严禁烟火”的警示牌?用化学知识回答 一个三角形的面积是12平方厘米,它的高是5分之12厘米,这个三角形的底是多少?求你们了,十分钟啊 在一个长、宽、高分别为30厘米,60厘米,80厘米的长方体水箱中,(不计厚度)有A、B两个进水管,先打开A管,经过一段时间后打开B管,两管同时进水.下面折线图表示进水情况,请根据图回答问题.(A、 一个农民运来一批西瓜,进价为每千克2元,卖出每千克3元,每天能卖出200千克,每千克降价0.1元,每天可多出售40千克.另外,每天的房租等固定成本共24元.该农民每天赚200元,尖将每千克西瓜的售价 油罐车的立方怎么算如题 谢谢了请问下,现在油罐车都是椭圆形的,那它的立方怎么算呀! 做一个无盖的长方体铁皮水箱,长80厘米,宽60厘米,高40厘米,做这个水箱一共用铁皮多少平方米? 油库重地 严禁烟火用阿拉伯语怎么说 家用的塑料盆桶碗,是什么原料制作而成的? 在一个长方形大草坪上修建两个同样大小的圆形花坛,使这两个花坛的面积的和是余下草坪面积的一半,已知草坪的长是40m,宽是30m,求花坛的半径. 一个三角形的面积是十八平方米与它等底等高的平行四边形的面积是多少平方米 一般化工塑胶桶的材质除了PE的,还有哪些材质的啊?有PP、PET或PVC得吗?有的话在哪里可以买到的啊? 将学校的圆形花坛按1:100比例画在图纸上,花坛的图上面积与实际面积的比是( )
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn