谢谢楼上,现贴源码:
客户端:unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
NMUDP, StdCtrls, Buttons,winsock;type
TForm1 = class(TForm)
ClientNMUDP: TNMUDP;
ListBox1: TListBox;
procedure FormDestroy(Sender: TObject);
procedure ClientNMUDPDataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}const BufSize=2048;{ 发送每一笔数据的缓冲区大小 }
var
BmpStream:TMemoryStream;
LeftSize:Longint;{ 发送每一笔数据后剩余的字节数 }function GetIpAddress: string;
var
wVersionRequested: WORD;
wsaData: TWSAData;
p: PHostEnt;
s: array[0..128] of Char;
begin
wVersionRequested := MAKEWORD(1, 1);
WSAStartup(wVersionRequested, wsaData);
try
GetHostName(@s, 128);
p := GetHostByName(@s);
Result := StrPas(iNet_ntoa(PInAddr(p^.h_addr_list^)^));
finally
WSACleanup;
end;
end;procedure 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;procedure TForm1.FormDestroy(Sender: TObject);
begin
BmpStream.Free;
end;procedure TForm1.ClientNMUDPDataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
CtrlCode:array[0..29] of char;
Buf:array[0..BufSize-1] of char;
TmpStr:string;
SendSize,LeftPos,TopPos,RightPos,BottomPos:integer;
begin
ClientNMUDP.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;{ 清空流 } ClientNMUDP.RemoteHost:=FromIP; { FromIP为主控机IP地址 }
ClientNMUDP.SendBuffer(Buf,SendSize); { 将数据发到主控机的8888口 }
end;
end;procedure TForm1.FormCreate(Sender: TObject);
var
tmp:string;
i:integer;
begin
ListBox1.Clear;
ListBox1.Items.LoadFromFile('地址.txt'); tmp:=GetIpAddress;
for i:=0 to ListBox1.Items.Count-1 do
begin
if tmp=ListBox1.Items.Strings[i] then break;
end; ClientNMUDP.LocalPort := i*1111;
ClientNMUDP.RemotePort := 8888;
ClientNMUDP.RemoteHost := ListBox1.Items.Strings[0]; Form1.Caption:=IntToStr(i*1111); BmpStream:=TMemoryStream.Create;
end;end.服务端:unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
NMUDP, StdCtrls, ExtCtrls, Buttons;type
TForm1 = class(TForm)
ServerNMUDP: TNMUDP;
ListBox1: TListBox;
Image1: TImage;
procedure FormDestroy(Sender: TObject);
procedure ServerNMUDPDataReceived(Sender: TComponent; NumberBytes: Integer;
FromIP: String; Port: Integer);
procedure FormCreate(Sender: TObject);
procedure ListBox1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}const BufSize=2048;
var
RsltStream,TmpStream:TMemoryStream;
SonIP,_range:string;procedure TForm1.FormDestroy(Sender: TObject);
begin
RsltStream.Free;
TmpStream.Free;
end;procedure TForm1.ServerNMUDPDataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
ReqCode:array[0..29] of char;
ReqCodeStr:string;
begin
ReqCodeStr:='show'+_range;
StrpCopy(ReqCode,ReqCodeStr);
ServerNMUDP.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'; ServerNMUDP.RemoteHost:=SonIP;
ServerNMUDP.SendBuffer(ReqCode,30);
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
SonIP:='127.0.0.1';
_range:='0:80:550:640';
ListBox1.Clear;
ListBox1.Items.LoadFromFile('地址.txt');
end;procedure TForm1.ListBox1Click(Sender: TObject);
var
ReqCode:array[0..29] of char;
ReqCodeStr:string;
i:integer;
begin
i:=ListBox1.ItemIndex;
if i>0 then
begin
ServerNMUDP.LocalPort := 8888;
ServerNMUDP.RemotePort := i*1111;
SonIP:=ListBox1.Items.Strings[i]; RsltStream:=TMemoryStream.Create;
TmpStream:=TMemoryStream.Create; ReqCodeStr:='show'+_range;
StrpCopy(ReqCode,ReqCodeStr); TmpStream.Clear;
RsltStream.Clear; ServerNMUDP.RemoteHost:=SonIP;
ServerNMUDP.SendBuffer(ReqCode,30);
end;
end;end.其中,地址.txt内容如下:
127.0.0.1
192.168.0.1
...
客户端:unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
NMUDP, StdCtrls, Buttons,winsock;type
TForm1 = class(TForm)
ClientNMUDP: TNMUDP;
ListBox1: TListBox;
procedure FormDestroy(Sender: TObject);
procedure ClientNMUDPDataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}const BufSize=2048;{ 发送每一笔数据的缓冲区大小 }
var
BmpStream:TMemoryStream;
LeftSize:Longint;{ 发送每一笔数据后剩余的字节数 }function GetIpAddress: string;
var
wVersionRequested: WORD;
wsaData: TWSAData;
p: PHostEnt;
s: array[0..128] of Char;
begin
wVersionRequested := MAKEWORD(1, 1);
WSAStartup(wVersionRequested, wsaData);
try
GetHostName(@s, 128);
p := GetHostByName(@s);
Result := StrPas(iNet_ntoa(PInAddr(p^.h_addr_list^)^));
finally
WSACleanup;
end;
end;procedure 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;procedure TForm1.FormDestroy(Sender: TObject);
begin
BmpStream.Free;
end;procedure TForm1.ClientNMUDPDataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
CtrlCode:array[0..29] of char;
Buf:array[0..BufSize-1] of char;
TmpStr:string;
SendSize,LeftPos,TopPos,RightPos,BottomPos:integer;
begin
ClientNMUDP.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;{ 清空流 } ClientNMUDP.RemoteHost:=FromIP; { FromIP为主控机IP地址 }
ClientNMUDP.SendBuffer(Buf,SendSize); { 将数据发到主控机的8888口 }
end;
end;procedure TForm1.FormCreate(Sender: TObject);
var
tmp:string;
i:integer;
begin
ListBox1.Clear;
ListBox1.Items.LoadFromFile('地址.txt'); tmp:=GetIpAddress;
for i:=0 to ListBox1.Items.Count-1 do
begin
if tmp=ListBox1.Items.Strings[i] then break;
end; ClientNMUDP.LocalPort := i*1111;
ClientNMUDP.RemotePort := 8888;
ClientNMUDP.RemoteHost := ListBox1.Items.Strings[0]; Form1.Caption:=IntToStr(i*1111); BmpStream:=TMemoryStream.Create;
end;end.服务端:unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
NMUDP, StdCtrls, ExtCtrls, Buttons;type
TForm1 = class(TForm)
ServerNMUDP: TNMUDP;
ListBox1: TListBox;
Image1: TImage;
procedure FormDestroy(Sender: TObject);
procedure ServerNMUDPDataReceived(Sender: TComponent; NumberBytes: Integer;
FromIP: String; Port: Integer);
procedure FormCreate(Sender: TObject);
procedure ListBox1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}const BufSize=2048;
var
RsltStream,TmpStream:TMemoryStream;
SonIP,_range:string;procedure TForm1.FormDestroy(Sender: TObject);
begin
RsltStream.Free;
TmpStream.Free;
end;procedure TForm1.ServerNMUDPDataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
ReqCode:array[0..29] of char;
ReqCodeStr:string;
begin
ReqCodeStr:='show'+_range;
StrpCopy(ReqCode,ReqCodeStr);
ServerNMUDP.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'; ServerNMUDP.RemoteHost:=SonIP;
ServerNMUDP.SendBuffer(ReqCode,30);
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
SonIP:='127.0.0.1';
_range:='0:80:550:640';
ListBox1.Clear;
ListBox1.Items.LoadFromFile('地址.txt');
end;procedure TForm1.ListBox1Click(Sender: TObject);
var
ReqCode:array[0..29] of char;
ReqCodeStr:string;
i:integer;
begin
i:=ListBox1.ItemIndex;
if i>0 then
begin
ServerNMUDP.LocalPort := 8888;
ServerNMUDP.RemotePort := i*1111;
SonIP:=ListBox1.Items.Strings[i]; RsltStream:=TMemoryStream.Create;
TmpStream:=TMemoryStream.Create; ReqCodeStr:='show'+_range;
StrpCopy(ReqCode,ReqCodeStr); TmpStream.Clear;
RsltStream.Clear; ServerNMUDP.RemoteHost:=SonIP;
ServerNMUDP.SendBuffer(ReqCode,30);
end;
end;end.其中,地址.txt内容如下:
127.0.0.1
192.168.0.1
...
-----------------------
var
Form1: TForm1; BmpStream :TMemoryStream; LeftSize : Longint;
-----------------------
客户端
procedure TForm1.ScreenCap;
var SoucDC : HDC;
MyCanvas : TCanvas;
SRect,DRect : TRect;
Bmp:TBitmap; jpe:TJPEGImage;
begin
SoucDC:=GetWindowDC(0);
MyCanvas:=TCanvas.Create;
Bmp:=TBitmap.Create;
Jpe:=TJPEGImage.Create;
try
MyCanvas.Handle:=SoucDC;
SRect:=Rect(0,0,Screen.Width,Screen.Height);
DRect:=Rect(0,0,600,400);
Bmp.PixelFormat:=pf8bit;
Bmp.Width:=DRect.Right;
Bmp.Height:=DRect.Bottom;
Bmp.Canvas.CopyRect(DRect,MyCanvas,SRect);
Jpe.Assign(Bmp);
Jpe.SaveToStream(BmpStream);
//Bmp.SaveToStream(BmpStream);
//Bmp.SaveToFile('screen.bmp');
BmpStream.Position:=0;
LeftSize:=BmpStream.Size;
finally
Jpe.Free;
Mycanvas.Handle:=0;
Mycanvas.Free;
Bmp.Free;
ReleaseDC(0,SoucDC);
end;
end;
--------------------------
procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var CCode:array[0..3]of char; TmpStream : TMemoryStream;
SendSize : integer;
begin
NMUDP1.ReadBuffer(CCode,NumberBytes);
if CCode[0]='s' then
begin
TmpStream:=TMemoryStream.Create;
try
if BmpStream.Size=0 then
begin
BmpStream.Clear;
ScreenCap;
end;
if LeftSize>BufSize then SendSize:=BufSize else SendSize:=LeftSize;
//BmpStream.ReadBuffer(TmpStream,SendSize);
TmpStream.CopyFrom(BmpStream,SendSize);
LeftSize:=LeftSize-SendSize;
if LeftSize=0 then BmpStream.Clear;
NMUDP1.RemoteHost:=FromIP;
NMUDP1.SendStream(TmpStream);
finally
TmpStream.Free;
end;
end;
end;
-------------------------------------------------------------------
服务器端
var
Form1: TForm1;
RsltStream , TmpStream :TMemoryStream;
flag : string;
-----------------------
procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var ReqCode : array[0..3] of char; Bit:TBitmap;
jpe: TJPEGImage;
begin
ReqCode:='show';
NMUDP1.ReadStream(TmpStream);
RsltStream.CopyFrom(Tmpstream,NumberBytes);
if NumberBytes<BufSize then
begin
RsltStream.Position:=0;
if flag='form1' then
begin
jpe:=TJPEGImage.Create;
Bit:=TBitmap.Create;
try
jpe.LoadFromStream(RsltStream);
Bit.Assign(jpe);
//Image1.Picture.Bitmap.LoadFromStream(RsltStream);
Image1.Picture.Bitmap:=Bit;
finally
jpe.Free;
Bit.Free;
end;
end else
if flag='form2' then
begin
jpe:=TJPEGImage.create;
Bit:=TBitmap.Create;
try
jpe.LoadFromStream(RsltStream);
Bit.Assign(jpe);
StretchBlt(form2.Canvas.Handle,0,0,screen.Width,screen.Height,
Bit.Canvas.Handle,0,0,600,450,srccopy);
form2.Show;
finally
Bit.Free;
jpe.free;
end;
end;
TmpStream.Clear;
RsltStream.Clear;
end else
begin
TmpStream.Clear;
NMUDP1.RemoteHost:=edit1.Text;
NMUDP1.SendBuffer(ReqCode,4);
end;
end;
------------------------