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

用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生死对手微软及Salesforce或将联手 阿里巴巴曾鸣:数据时代来临 OpenStack企业应用之路技术培训:虚机迁移、HA、VDI、跨Hypervisor管理 云计算技术背后的那些天才程序员:KVM之父Avi Kivity 中国气象局联手阿里云:海量气象数据变“活数据” 浪潮首度公布“I2I计划” 全面接盘IBM X业务 一周消息树:Surface Pro 3想替代笔记本太难,微软正逐渐迷失方向 就是要赚钱!NativeX推自定义原生广告交易 继智能手机后的下一个战场:智能家居 鏖战云端——亚马逊的生存法则 如何保住公司的人才:创造良好的学习氛围 主宰全球的10大算法 专访Google数据科学家彭晨:大数据成为潮流走近各行各业! 强横Metal技术来袭,能否取代OpenGL? Swift横空出世,Xcode 6 Beta有了哪些新变化? 《近匠》GameMei:简单易用、快速开发商用游戏 Gartner:2014年一季度浪潮服务器出货量中国第一 【技术博客推荐】张安站:大数据时代下的商业存储 Amazon继续登顶IaaS魔力象限,榜眼是微软而非Google 友盟Q1移动互联网报告:解读三线城市移动互联网用户 智能生活 “视”不可挡——首届TCL杯HTML5智能电视开发大赛等你来挑战 Mobile First!开源HTML5游戏引擎Kiwi.js 1.0正式发布 天天用的开发环境,你真的了解吗? 物联网时代,你的汽车也在转型 触宝输入法产品经理解析iOS 8第三方输入法开放程度 专访联想谢政维:功耗和价格是天蝎项目最大障碍! 《近匠》蚁视科技创始人覃政:ANTVR,虚拟现实的新生 后棱镜门时代:开发者保护应用安全的5大技巧 专访许鹏:谈C程序员修养及大型项目源码阅读与学习 65种GPU性能测试,AMD开源驱动领先! 一周消息树:我们从WWDC 2014收获了什么? datagrid中的问题:删除datagrid中的记录时出现的问题。 求助:TextBox中输入中文简繁体日文的乱码问题,谢谢! 一段小小的Java程序,请指点指点!!!多谢! 请大家都来关注!谢谢 各位,怎样在C#里面声明定长的字符或定长的数据 MFCGridCtrl的问题,很难,但我还是要碰碰运气! 数据窗口中某列(列名为AA)的编辑风格设为DropDownListBox,在脚本中怎样添加DropDownListBox中的内容? 再次请教EJB. 我想做钱能编的《C++程序设计》习题集的网站! 怎样可以得到当前window对应于屏幕的坐标呢 请问在vs.net编写aspx时,怎样才能在写.时,后面的属性或方法能出来 能告诉我ORACLE触发器的语法吗? 怎么画不出图来? 如何定一个文件类型的变量? 水晶报表,多列(分栏)打印 如何使安装程序汉化?我使用的是installshield6.2 谢谢! datagrid中的问题:删除datagrid中某行时出现的问题。 使得窗口总是处于最前的函数是什么,谢谢 请教:如何用Sql实现查询本周发的帖子?? 如何用程序设置ie的页面设置中的页眉,页脚,边距和方向? 为什么要学Java http://Scjp.myrice.com 也许你的一切会改变! 请问怎么修改InstallShield中的可选项,如Typical、Compact、Custom等。 如何.定制通用对话框中的路径及文件名? 我照着网站上的中文输入法提示,做了可没效果 为什么要学Java 看 http://Scjp.myrice.com 也许你的一切会改变! 回答问题,我给500分!! 语音聊天用什么软件好?qq,netmeeting,yahoo message or icq? 为什么不能汇编成功? 各位,帮我一下,非赏急! 数据库快照复制问题,总出错,求救!(50分) 请问这是怎么一回事。win2k(p)+tomcat+jdk1.4.` 在VB中怎样设置Excel单元格的样式?如设置为百分数显示单元格数值? 下拉菜单问题? 请问这是怎么一回事。win2k(p)+tomcat+jdk1.4.` 求救,我财务系统的问题,大大们一定要帮助我呀! 我在调试jsp是的一个错误信息,请指教~~~ 急!!! 一个烦人的问题 关于在应用程序中使用dll中资源的问题 關於並行執行的問題 也许你现在就会改变!! 看 http://Scjp.myrice.com 为什么要学Java 其实我们很封闭! 关于NT的小问题! 请问: 請問哪里有c++的書籍下載? 几个控件重叠在一起,怎样用代码的方式使其中的某个控件在运行时放至最上!?谢! 也许你现在就会改变!! 看 http://Scjp.myrice.com 其实我们很封闭! 如何发布我的网站? 怎样编程在Windows开始菜单的的“启动”栏中添加本程序的快捷方式? 谁有installshield 6.30的license注册文件? 请问:DataGrid在WebForm中明明有数据显示,但用浏览器看就没,为何? 显卡选择问题 抛物线y^2=2x与直线y=4-x围成的平面图形的面积(积x计算) 函数y=-x^2-2x+1的图象可以由什么抛物线,经怎样的平移得到 不定积分1/根号(1+sinx^2) 20句写得优美的句子, 若将抛物线Y=2X^2-4x-5向左平移4个单位,再向上平移4个单位,则新图象的函数解析式是? 对根号sinx求不定积分 人教版初一上册语文书 将抛物线y=x平方+2向上平移1个单位长度,向左平移2个单位长度得到的函数图象解析式是? 请问根号下1+sinx的不定积分是什么? 怎么样用一个可以装5千克水的捅和一个可以装3千克水的桶装出4千克的水 函数y=根号x平方+4x+4的图像是 1直线 2抛物线 3两条直线 4半圆弧 根号下(1-sinx)/(1+sinx)不定积分 蝴蝶是否是昆虫不是 将抛物线y=x^2+1沿射线y=1/2x-1(x大于等于0)方向平移根号5个单位,其函数解析式变为? 写2句关于赞美亲情的诗句或名言. 求由抛物线y=1-x^2;x=0,x=2及y=0所围成的平面图形的面积 蝴蝶是昆虫吗 急求赞颂亲情的名言和诗句!要赞颂亲情的名言和诗句! 求抛物线y∧2=x与直线y=x-2所围成的平面图形的面积 水怎么样用一个可以装5千克水的捅和一个可以装3千克水的桶装出4千克的水 谁有关于亲情的名言或诗句 写动物或植物的作文可以写些什么 能寄生在人的大脑上的寄生虫是什么 关于亲情的名言诗句? 描写“日”的300字短文. 蚂蚁的村落作文一篇400字 21 与朱元思书 第一段的主要内容是什么?它在全文的作用是什么? 形容一个眼睛不大,说话还行,嘴巴挺小(不是樱桃嘴)的女生怎么形容(一段话,不用太多我已经写了,可以不回答 写一篇作文:蚂蚁的村落,400字 八下语文21课《与朱元思书》与朱元思书中直接描给急湍、猛浪的形象,使人恍若亲见的句子是什么?它使我们想起了李白的朝发白帝城中,描些江水的哪些句子? 鹅毛雪,柳叶眉,樱桃嘴,这类的词语前两个表示物品 求抛物线y=x^2与直线y=4所围成的图形面积越快越好 谢谢 y=根号x,x=4,x=9,y=o 用定积分就出图形面积 甲瓶中有8千克油,另有乙,丙两个空瓶,分别能装5千克和3千克,请你设计一下,如何利用这三个瓶把甲的油分成两个4千克? 以《蚂蚁的村庄》为题,写一篇500字作文注:《草虫的村落》是范文今天,我又趴在草丛边,在无限的静谧中,忘了世界也忘了自己.在我眼前,空前变大了,小草成了大森林.一只小蚂蚁,独自四处走 八年级上册语文《评价手册》21课《与朱元思书》课后练习选自《水经注》急 女人说自己的樱桃是什么意思 求直线y=x+2与抛物线y=x^2所围成的图形面积是多少? 翻译下21《课与朱元思书》 形容女生的嘴巴的词语有哪些 一篇200字观察蚂蚁的 作文 21课与朱元思书 苍蝇是昆虫吗 求由抛物线y=x^2与y=2-x^2所围图形的面积 螳螂为什么要蜕皮 求由抛物线y2=2x 及直线 y=x-4=0所围成的平面图形的面积 蚂蚁的村落的作文 螳螂该蜕皮了吗 由抛物线y=x^2,与直线y=2x+3所围成的平面图形的面积 (1)由抛物线y^2=x与直线x=2所围成的图形的面积是(2)已知二次曲线x^2/4+y^2/m=1,则当-2 有没有赞美亲情的名言、诗句,最好是关于祖父母外祖父母或者兄弟姐妹的 求抛物线y=2x的平方.与直线y=2x+4所围平面图形的面积. 有两个杯子,甲杯放了150毫升水,乙杯放了200毫升水,如果在两杯中同时放入同样规格的白糖,甲放30克,乙放50克,搅拌后哪个甜?(写出思考过程) 写出两句有关赞美亲情的诗句或名言 求抛物线y=x^2与直线y=2x所围平面图形的面积 当y=1/2时的极坐标方程 赞美亲情的的诗句与名句5句······常见的······易懂的······让我看得懂的······ 求一些优美的描写的句子 直线方程换算成极坐标方程 y=2 的极坐标方程是什么 根号下(1+sinx) 不定积分
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘