




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
大家应该见过很多网管程序,这类程序其中有一个功能就是监控远程电脑的屏幕。实际上,这也是利用流操作来实现的。下面我们给出一个例子,这个例子分两个程序,一个服务端,一个是客户端。程序编译后可以直接在单机、局部网或者互联网上使用。程序中已经给出相应注释。后面我们再来作具体分析。新建一个工程,在Internet面版上拖一个ServerSocket控件到窗口,该控件主要用于监听客户端,用来与客户端建立连接和通讯。设置好监听端口后调用方法Open或者Active:=True即开始工作。注意:跟前面的NMUDP不同,当Socket开始监听后就不能再改变它的端口,要改变的话必须先调用Close或设置Active为False,否则将会产生异常。另外,如果该端口已经打开的话,就不能再用这个端口了。所以程序运行尚未退出就不能再运行这个程序,否则也会产生异常,即弹出出错窗口。实际应用中可以通过判断程序是否已经运行,如果已经运行就退出的方法来避免出错。当客户端有数据传入,将触发ServerSocket1ClientRead事件,我们可以在这里对接收的数据进行处理。在本程序中,主要是接收客户端发送过来的字符信息并根据事先的约定来进行相应操作。unitUnit1;interfaceusesWindows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,ScktComp,jpeg;typeTForm1=class(TForm)ServerSocket1:TServerSocket;procedureFormCreate(Sender:TObject);procedureFormClose(Sender:TObject;varAction:TCloseAction);procedureServerSocket1ClientRead(Sender:TObject;Socket:TCustomWinSocket);privateprocedureCjt_GetScreen(varMybmp:Tbitmap;DrawCur:Boolean);自定义抓屏函数,DrawCur表示抓鼠标图像与否PrivatedeclarationspublicPublicdeclarationsend;varForm1:TForm1;MyStream:Tmemorystream;内存流对象implementation$R*.DFMTForm1procedureTForm1.Cjt_GetScreen(varMybmp:Tbitmap;DrawCur:Boolean);varCursorx,Cursory:integer;dc:hdc;Mycan:Tcanvas;R:Trect;DrawPos:Tpoint;MyCursor:Ticon;hld:hwnd;Threadld:dword;mp:tpoint;pIconInfo:TIconInfo;beginMybmp:=Tbitmap.Create;建立BMPMAPMycan:=Tcanvas.Create;屏幕截取dc:=GetWindowDC(0);tryMycan.Handle:=dc;R:=Rect(0,0,screen.Width,screen.Height);Mybmp.Width:=R.Right;Mybmp.Height:=R.Bottom;Mybmp.Canvas.CopyRect(R,Mycan,R);finallyreleaseDC(0,DC);end;Mycan.Handle:=0;Mycan.Free;ifDrawCurthen画上鼠标图象beginGetCursorPos(DrawPos);MyCursor:=Ticon.Create;getcursorpos(mp);hld:=WindowFromPoint(mp);Threadld:=GetWindowThreadProcessId(hld,nil);AttachThreadInput(GetCurrentThreadId,Threadld,True);MyCursor.Handle:=Getcursor();AttachThreadInput(GetCurrentThreadId,threadld,False);GetIconInfo(Mycursor.Handle,pIconInfo);cursorx:=DrawPos.x-round(pIconInfo.xHotspot);cursory:=DrawPos.y-round(pIconInfo.yHotspot);Mybmp.Canvas.Draw(cursorx,cursory,MyCursor);画上鼠标DeleteObject(pIconInfo.hbmColor);GetIconInfo使用时创建了两个bitmap对象.需要手工释放这两个对象DeleteObject(pIconInfo.hbmMask);否则,调用他后,他会创建一个bitmap,多次调用会产生多个,直至资源耗尽Mycursor.ReleaseHandle;释放数组内存MyCursor.Free;释放鼠标指针end;end;procedureTForm1.FormCreate(Sender:TObject);beginServerSocket1.Port:=3000;端口ServerSocket1.Open;Socket开始侦听end;procedureTForm1.FormClose(Sender:TObject;varAction:TCloseAction);beginifServerSocket1.ActivethenServerSocket1.Close;关闭Socketend;procedureTForm1.ServerSocket1ClientRead(Sender:TObject;Socket:TCustomWinSocket);varS,S1:string;MyBmp:Tbitmap;Myjpg:Tjpegimage;beginS:=Socket.ReceiveText;ifS=capthen客户端发出抓屏幕指令begintryMyStream:=Tmemorystream.Create;建立内存流MyBmp:=Tbitmap.Create;Myjpg:=Tjpegimage.Create;Cjt_GetScreen(MyBmp,True);True表示抓鼠标图像Myjpg.Assign(MyBmp);将BMP图象转成JPG格式,便于在互联网上传输Myjpg.CompressionQuality:=10;JPG文件压缩百分比设置,数字越大图像越清晰,但数据也越大Myjpg.SaveToStream(MyStream);将JPG图象写入流中Myjpg.free;MyStream.Position:=0;注意:必须添加此句s1:=inttostr(MyStream.size);流的大小Socket.sendtext(s1);发送流大小finallyMyBmp.free;end;end;ifs=readythen客户端已准备好接收图象beginMyStream.Position:=0;Socket.SendStream(MyStream);将流发送出去end;end;end.上面是服务端,下面我们来写客户端程序。新建一个工程,添加Socket控件ClientSocket、图像显示控件Image、一个Panel、一个Edit、两个Button和一个状态栏控件StatusBar1。注意:把Edit1和两个Button放在Panel1上面。ClientSocket的属性跟ServerSocket差不多,不过多了一个Address属性,表示要连接的服务端IP地址。填上IP地址后点“连接”将与服务端程序建立连接,如果成功就可以进行通讯了。点击“抓屏”将发送字符给服务端。因为程序用到了JPEG图像单元,所以要在Uses中添加Jpeg.unitUnit1;interfaceusesWindows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,Jpeg,StdCtrls,ExtCtrls,ScktComp,ComCtrls;typeTForm1=class(TForm)ClientSocket1:TClientSocket;Image1:TImage;Panel1:TPanel;Edit1:TEdit;Button1:TButton;Button2:TButton;StatusBar1:TStatusBar;procedureFormCreate(Sender:TObject);procedureButton1Click(Sender:TObject);procedureButton2Click(Sender:TObject);procedureClientSocket1Connecting(Sender:TObject;Socket:TCustomWinSocket);procedureClientSocket1Error(Sender:TObject;Socket:TCustomWinSocket;ErrorEvent:TErrorEvent;varErrorCode:Integer);procedureClientSocket1Disconnect(Sender:TObject;Socket:TCustomWinSocket);procedureClientSocket1Read(Sender:TObject;Socket:TCustomWinSocket);procedureFormClose(Sender:TObject;varAction:TCloseAction);privatePrivatedeclarationspublicPublicdeclarationsend;varForm1:TForm1;MySize:Longint;MyStream:TMemorystream;内存流对象implementation$R*.DFMprocedureTForm1.FormCreate(Sender:TObject);beginButton2.Enabled:=false;Image1.Stretch:=True;StatusBar1.Align:=alBottom;StatusBar1.SimplePanel:=True;MyStream:=TMemorystream.Create;建立内存流对象MySize:=0;初始化end;procedureTForm1.Button1Click(Sender:TObject);beginifnotClientSocket1.ActivethenbeginClientSocket1.Address:=Edit1.Text;远程IP地址ClientSocket1.Port:=3000;Socket端口ClientSocket1.Open;建立连接end;end;procedureTForm1.Button2Click(Sender:TObject);beginClientsocket1.Socket.SendText(cap);/发送指令通知服务端抓取屏幕图象Button2.Enabled:=False;end;procedureTForm1.ClientSocket1Connecting(Sender:TObject;Socket:TCustomWinSocket);beginStatusBar1.SimpleText:=与主机+ClientSocket1.Address+成功建立连接!;Button2.Enabled:=True;end;procedureTForm1.ClientSocket1Error(Sender:TObject;Socket:TCustomWinSocket;ErrorEvent:TErrorEvent;varErrorCode:Integer);begin/Errorcode:=0;不弹出出错窗口StatusBar1.SimpleText:=无法与主机+ClientSocket1.Address+建立连接!;end;procedureTForm1.ClientSocket1Disconnect(Sender:TObject;Socket:TCustomWinSocket);beginStatusBar1.SimpleText:=与主机+ClientSocket1.Address+断开连接!;Button2.Enabled:=False;end;procedureTForm1.ClientSocket1Read(Sender:TObject;Socket:TCustomWinSocket);varMyBuffer:array0.10000ofbyte;设置接收缓冲区MyReceviceLength:integer;S:string;MyBmp:TBitmap;MyJpg:TJpegimage;beginStatusBar1.SimpleText:=正在接收数据.;ifMySize=0thenMySize为服务端发送的字节数,如果为0表示为尚未开始图象接收beginS:=Socket.ReceiveText;MySize:=Strtoint(S);设置需接收的字节数Clientsocket1.Socket.SendText(ready);发指令通知服务端开始发送图象endelsebegin以下为图象数据接收部分MyReceviceLength:=socket.ReceiveLength;读出包长度StatusBar1.SimpleText:=正在接收数据,数据大小为:+inttostr(MySize);Socket.ReceiveBuf(MyBuffer,MyRecevice
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 郑州西亚斯学院《高等土力学基础》2023-2024学年第二学期期末试卷
- 湖南幼儿师范高等专科学校《生物统计与试验设计》2023-2024学年第二学期期末试卷
- 西安建筑科技大学华清学院《民间传统图形语言》2023-2024学年第二学期期末试卷
- 河南工业和信息化职业学院《微生物学与临床微生物检验技术(下)》2023-2024学年第二学期期末试卷
- 低风速发电-洞察及研究
- 骨质疏松预防中药针剂行业跨境出海项目商业计划书
- 传统工艺活化与创新设计企业制定与实施新质生产力项目商业计划书
- 云端音乐创作与协作平台创新创业项目商业计划书
- 仿真水下推进系统创新创业项目商业计划书
- 体育明星自传出版企业制定与实施新质生产力项目商业计划书
- 2024金融算力基础设施发展报告
- 国际压力性损伤-溃疡预防和治疗临床指南(2025年版)解读课件
- GB/T 27060-2025合格评定良好实践指南
- 煤矿质量标准化建设实施方案
- 作物栽培学知到课后答案智慧树章节测试答案2025年春中国农业大学
- 甘肃兰州历年中考语文文言文阅读试题36篇(含答案与翻译)(截至2024年)
- 2025年执业药师继续教育试题题库和参考答案(完整版)
- 《中医养生保健服务(非医疗)技术操作规范-砭术》-公示稿
- 《企业信息安全培训课件》
- 职业学院学生转专业申请表
- 2025年全国安全生产月安全知识竞赛题库及答案(共280题)
评论
0/150
提交评论