资源描述:
《delphi利用流实现网络传输屏幕图像》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、大家应该见过很多网管程序,这类程序其中有一个功能就是监控远程电脑的屏幕。实际上,这也是利用流操作来实现的。下面我们给出一个例子,这个例子分两个程序,一个服务端,一个是客户端。程序编译后可以直接在单机、局部网或者互联网上使用。程序中已经给出相应注释。后面我们再来作具体分析。新建一个工程,在Internet 面版上拖一个ServerSocket 控件到窗口,该控件主要用于监听客户端,用来与客户端建立连接和通讯。设置好监听端口后调用方法Open 或者Active:=True 即开始工作。注意:跟前面的NMUDP 不同,当Socket 开始监
2、听后就不能再改变它的端口,要改变的话必须先调用Close 或设置Active 为False,否则将会产生异常。另外,如果该端口已经打开的话,就不能再用这个端口了。所以程序运行尚未退出就不能再运行这个程序,否则也会产生异常,即弹出出错窗口。实际应用中可以通过判断程序是否已经运行,如果已经运行就退出的方法来避免出错。当客户端有数据传入,将触发ServerSocket1ClientRead 事件,我们可以在这里对接收的数据进行处理。在本程序中,主要是接收客户端发送过来的字符信息并根据事先的约定来进行相应操作。unit Unit1;inter
3、faceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ScktComp ,jpeg;type TForm1 = class(TForm) ServerSocket1: TServerSocket; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction);
4、 procedure ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); private procedure Cjt_GetScreen(var Mybmp: Tbitmap; DrawCur: Boolean); {自定义抓屏函数,DrawCur表示抓鼠标图像与否} { Private declarations } public { Public declarations } end;var Form1: TF
5、orm1; MyStream: Tmemorystream;{内存流对象} implementation{$R *.DFM}{ TForm1 }procedure TForm1.Cjt_GetScreen(var Mybmp: Tbitmap; DrawCur: Boolean);var Cursorx, Cursory: integer; dc: hdc; Mycan: Tcanvas; R: Trect; DrawPos: Tpoint; MyCursor: Ticon; hld: hwnd; Threadld:
6、 dword; mp: tpoint; pIconInfo: TIconInfo;begin Mybmp := Tbitmap.Create; {建立BMPMAP } Mycan := Tcanvas.Create; {屏幕截取} dc := GetWindowDC(0); try Mycan.Handle := dc; R := Rect(0, 0, screen.Width, screen.Height); Mybmp.Width := R.Right; Mybmp.Height := R.Bo
7、ttom; Mybmp.Canvas.CopyRect(R, Mycan, R); finally releaseDC(0, DC); end; Mycan.Handle := 0; Mycan.Free; if DrawCur then {画上鼠标图象} begin GetCursorPos(DrawPos); MyCursor := Ticon.Create; getcursorpos(mp); hld := WindowFromPoint(mp); Threadld := G
8、etWindowThreadProcessId(hld, nil); AttachThreadInput(GetCurrentThreadId, Threadld, True); MyCursor.Handl