谢谢楼上,现贴源码:
客户端: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
...

解决方案 »

  1.   

    const BufSize = 2048;
    -----------------------
    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;
    ------------------------