远程屏幕操作的实现 
在远程截屏的基础上实现屏幕操作
       最好有相关源代码

解决方案 »

  1.   


    可E我一份吗
    Email:[email protected]
    非常感谢
      

  2.   

    服务器:
    unit serverFrm;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ScktComp, ExtCtrls, StdCtrls, jpeg, registry, shellapi, Buttons;type
      TfrmServer = class(TForm)
        ServerSocket: TServerSocket;
        Label1: TLabel;
        Image1: TImage;
        procedure FormCreate(Sender: TObject);
        procedure ServerSocketClientRead(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure FormDestroy(Sender: TObject);
        procedure ServerSocketClientDisconnect(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure ServerSocketClientError(Sender: TObject;
          Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
          var ErrorCode: Integer);
      private
        procedure sendscreen;
        procedure snapscreen;
      public
        { Public declarations }
      end;var
      frmServer: TfrmServer;implementationconst BufSize = 2048; //每次发送的最大数据量var
      LeftSize: Longint; //发送jpeg文件流时,剩下的大小
      jpegStream: TMemoryStream; //存储Jpeg文件的内存流
    {$R *.DFM}//当窗体创建时,创建存储屏幕图象的Jpeg文件的内存流
    procedure TfrmServer.FormCreate(Sender: TObject);
    begin
      jpegStream := TmemoryStream.Create;
    end;//释放存储屏幕图象的Jpeg文件的内存流
    procedure TfrmServer.FormDestroy(Sender: TObject);
    begin
      jpegstream.free;
    end;//发送抓取的屏幕图象(Jpeg格式)
    procedure TfrmServer.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内存流读取SendSize大小的数据到缓冲区
      jpegStream.ReadBuffer(Buf, sendSize);
      LeftSize := LeftSize - SendSize;
      //向客户端发送
      try
        serversocket.Socket.Connections[0].SendBuf(buf, sendsize);
        //ShowMessage('开始发送!');
        sleep(10);
      except
        jpegstream.Clear;
      end;
      if LeftSize = 0 then
        jpegStream.Clear;
    end;//抓取本机屏幕,图象转换成Jpeg格式,并存到JpegStream内存流中。
    procedure TfrmServer.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位图中
      bmpscreen.Canvas.CopyRect(sourcerect, fullscreenCanvas, destrect);
      image1.Picture.Bitmap:=bmpscreen;
      image1.Update;
      //创建储存Jpeg格式的对象
      //jpegscreen := Tjpegimage.Create;
    //  //将图象压缩成Jpeg格式,保存到JpegStream内存流中。
    //  jpegscreen.Assign(bmpscreen);
    //  jpegscreen.CompressionQuality := 40;
    //  jpegscreen.SaveToStream(jpegStream);
    //  
    //  
      bmpscreen.SaveToStream(jpegStream);
      jpegstream.Position := 0;
      LeftSize := jpegStream.Size;
      //释放创建的对象
      FullscreenCanvas.Free;
      bmpscreen.Free;
      //jpegscreen.Free;
      ReleaseDC(0, DC);
    end;//接收客户端的发送的指令
    procedure TfrmServer.ServerSocketClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      rstr: string;
    begin
      rstr := socket.ReceiveText;
      //如果收到的指令是'show',代表开始抓取,并回传客户端
      if rstr = 'show' then
        sendscreen();
    end;//当客户端断开连接时,清空jpegStream内存流
    procedure TfrmServer.ServerSocketClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      jpegStream.Clear;
      jpegStream.Position := 0;
    end;//当客户端Socket发生错误时,清空jpegStream内存流
    procedure TfrmServer.ServerSocketClientError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    begin
      jpegStream.Clear;
      jpegStream.Position := 0;
    end;end.
      

  3.   

    客户端:
    unit clientFrm;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ScktComp, ExtCtrls, ToolWin, ComCtrls, Menus, Buttons, shellapi,
      jpeg, ImgList, CSIntf;type
      TfrmClient = class(TForm)
        Image: TImage;
        ClientSocket: TClientSocket;
        ImageList1: TImageList;
        ToolBar1: TToolBar;
        btnConnect: TToolButton;
        btnSnap: TToolButton;
        btnDisConnect: TToolButton;
        btnClose: TToolButton;
        CSObject1: TCSObject;
        ToolButton1: TToolButton;
      //  procedure bu_snapClick(Sender: TObject);
        procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure btnConnectClick(Sender: TObject);
        procedure btnSnapClick(Sender: TObject);
        procedure btnDisConnectClick(Sender: TObject);
        procedure ClientSocketConnect(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure ClientSocketError(Sender: TObject; Socket: TCustomWinSocket;
          ErrorEvent: TErrorEvent; var ErrorCode: Integer);
        procedure BtnCloseClick(Sender: TObject);
        procedure ToolButton1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      frmClient: TfrmClient;implementation
    const bufsize = 2048;//接收数据缓冲区的最大值var
      stream: Tmemorystream; //存储接收到jpeg内存流
      //jpegscreen: Tjpegimage; //存储jpeg图象
      Bitmap:Tbitmap;
    {$R *.DFM}//当窗体创建时,创建Stream,jpegStream对象
    procedure TfrmClient.FormCreate(Sender: TObject);
    begin
      stream := Tmemorystream.Create;
      Bitmap := Tbitmap.Create;
    end;//当窗体关闭时,关闭套接字的连接,并释放stream,jpegStream对象
    procedure TfrmClient.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      clientsocket.Active := false;
      stream.Free;
      Bitmap.Free;
    end;//连接服务器
    procedure TfrmClient.BtnConnectClick(Sender: TObject);
    var
      remotehost: string;
    begin
      //输入远程服务器的IP地址
      remotehost := inputbox('建立连接', '请输入被察看的机器的IP地址或名称:', 'gari');
      if trim(remotehost) <> '' then
      begin
        if clientsocket.Active then clientsocket.Active := true;
        clientsocket.Port := 1234;
        clientsocket.Host := remotehost;
        //连接
        try
          clientsocket.Active := true;
        except
          raise Exception.Create('连接失败!');
        end;
      end;
    end;//断开连接
    procedure TfrmClient.btnDisConnectClick(Sender: TObject);
    begin
      clientsocket.Active := false;
      stream.Clear;
    end;//向服务器端发出'show'指令,要求获取它的屏幕
    procedure TfrmClient.btnSnapClick(Sender: TObject);
    begin
      stream.Clear;
      if not ClientSocket.Active then
      Raise Exception.Create('请先连接');
      clientsocket.Socket.SendText('show');
    end;//关闭窗口
    procedure TfrmClient.BtnCloseClick(Sender: TObject);
    begin
      clientsocket.Active := false;
      close;
    end;
    //客户端接收远程屏幕图象
    procedure TfrmClient.ClientSocketRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      buf: array[0..bufsize - 1] of char;
      numberbytes: integer;
    begin
      numberbytes := socket.ReceiveLength;
      //接收数据
      socket.receiveBuf(buf, numberbytes);
      //累加读到stream内存流中
      stream.Write(buf, numberbytes);
      //当接收到的数据不等于bufSize,代表接收的屏幕图象的最后一个数据,
      //否则,代表还没有接收完,继续相服务器端发送'show'指令,继续获取数据
      if NumberBytes = bufSize then
        Socket.SendText('show')
      else
        begin
          try
            //此句代码,非常重要,千万不要忘写,它将内存流指针移到头,
            //否则读取内存流时,会从当前位置开始读
            Stream.Position := 0;
            //将内存流读到JpegScreen图象中
            bitmap.LoadFromStream(stream);
            //显示在image组件中
            image.Picture.Bitmap.Assign(bitmap);
             //image.Picture.Bitmap.LoadFromStream(stream);
          except
            stream.Clear;
          end;
        end;
    end;procedure TfrmClient.ClientSocketConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      showmessage('连接成功!');
    end;//当客户端Socket出错时,清空stream数据
    procedure TfrmClient.ClientSocketError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    begin
      stream.Clear;
    end;procedure TfrmClient.ToolButton1Click(Sender: TObject);
    begin
       stream.SaveToFile('c:\xx.bmp');
    end;end.
      

  4.   

    控制屏幕的原理其实就是向服务器端发送命令,然后在服务器端对你所做的操作调用相关的API函数,来实现你想要的功能,截取过来的屏幕图片需要做一些定位。