---- 在网络管理中,有时需要通过监视远程计算机屏幕来了解网上微机的使用情况。虽然,市面上有很多软件可以实现该功能,有些甚至可以进行远程控制,但在使用上缺乏灵活性,如无法指定远程计算机屏幕区域的大小和位置,进而无法在一屏上同时监视多个屏幕。 其实,可以用delphi自行编制一个灵活的远程屏幕抓取工具,简述如下。
---- 一、软硬件要求。
---- windows95/98对等网,用来监视的计算机(以下简称主控机)和被监视的计算机(以下简称受控机)都必须装有tcp/ip 协议,并正确配置。如没有网络,也可以在一台计算机上进行调试。
---- 二、实现方法。
---- 编制两个应用程序,一个为vclient.exe,装在受控机上,另一个为vserver.exe,装在主控机上。vserver.exe指定要监视的受控机的ip地址和将要在受控机屏幕上抓取区域的大小和位置,并发出屏幕抓取指令给vclient.exe,vclient.exe得到指令后,在受控机屏幕上选取指定区域,生成数据流,将其发回主控机,并在主控机上显示出抓取区域的bmp图象。由以上过程可以看出,该方法的关键有二:一是如何在受控机上进行屏幕抓取,二是如何通过tcp/ip协议在两台计算机中传输数据。
---- udp(user datagram protocol,意为用户报文协议)是inte.net上广泛采用的通信协议之一。与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;
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器