⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcapturesssthreadunit.pas

📁 DELPHI 下远程控制源码
💻 PAS
字号:
unit TCaptureSSSThreadUnit;

interface

uses
  Classes,windows,APFUnit,IdTCPClient,IdSocks,SysUtils,IdComponent,IdGlobal,DB,
  Graphics,Jpeg,Types,Forms;

type
  TCaptureSSSThread = class(TThread)
  private
    TheSubJpegImage:TJpegImage;  //屏幕子块图象的解压引擎
    TheSubBmpImage :TBitmap;     //恢复屏幕子块的图形位图
    
  
    ScrStream:TMemoryStream;       //记录小分块屏幕图象
    
    PictureType  : integer;        //--1--要求的图象格式: bmp / jpg
    ColorType    : integer;        //--2--像素颜色位数  :1-2-4-8-16-24-32
    CompressRatio: integer;        //--3--如果是jpg 则此为图象质量 
    TheAreaHeight: integer;        //--4--传输块的高度
    ThePriority  : integer;        //--5--设置远程对应线程的优先级     
      
  protected 
           
    procedure ShowDisConnectState;//显示连接失败信息
    procedure ShowRefuseState;    //显示拒绝连接信息
    procedure ShowErrorstate;     //显示中断错误状态
    procedure ShowAllScreen;
    //显示子块图象到屏幕及缓存中
    procedure ShowSubScreen(SubID_Y,SubID_X:integer;TheDataStream:TMemoryStream);
    //设置连接参数
    Procedure SetConnectOpt(TCPClient:TidTCPClient;TheOpt:TConnectOpt);
    //进行远程连接 
    Function  ConnectThePC(MyTcp:TidTcpClient;
			TheConRec:TConnectRec):Boolean;//连接远程主机
    
    procedure Execute; override;
  public 
    TheScrSocket  : TIdTcpClient;     
    //TheScktInfo  : TSocksInfo;
    TheConnRec   : TConnectRec;
    TheConnectOpt: TConnectOpt;           
    constructor Create(TheConnectRec :TConnectRec;
                       TheConnOpt    :TConnectOpt;
		       ThisImageIndex,ThisColorIndex,
                       CompressValue,ThisAreaHeight,
                       ThisPriority:integer);    
    destructor  Destroy; override;
  end;

implementation

uses unit1,RemoteCPCUnit;
 
constructor TCaptureSSSThread.Create(TheConnectRec :TConnectRec;
                                     TheConnOpt    :TConnectOpt;
			 ThisImageIndex,ThisColorIndex,CompressValue,
                         ThisAreaHeight,ThisPriority:integer);  
begin
  inherited Create(True); 
  Self.FreeOnTerminate:=True;        
  Try
    TheSubJpegImage:=TJpegImage.Create;  //屏幕子块图象的解压引擎
    TheSubBmpImage :=TBitmap.Create;     //恢复屏幕子块的图形位图
  except
    Self.Terminate;
    Self.Free;
    exit;
  end;
  try //记录屏幕图象
      ScrStream:=TMemoryStream.Create;
  except
      self.Terminate;
      self.Free;
      exit;      
  end;
    PictureType  :=ThisImageIndex;        //--1--要求的图象格式: bmp / jpg
    ColorType    :=ThisColorIndex;        //--2--像素颜色位数  :1-2-4-8-16-24-32
    CompressRatio:=CompressValue;         //--3--如果是jpg 则此为图象质量 
    TheAreaHeight:=ThisAreaHeight;        //--4--传输块的高度
    ThePriority  :=ThisPriority;          //--5--设置远程对应线程的优先级
   
    TheConnRec   :=TheConnectRec;
    TheConnectOpt:=TheConnectOpt;   

    //TheScktInfo:=TSocksInfo.Create;
    //TheScktInfo.Authentication:=TheConnectOPt.PUseAuth;//是否代理验证
    //TheScktInfo.Host:=TheConnectOpt.ProxyHost;//代理主机
    //TheScktInfo.Port:=TheConnectOPt.ProxyPort;
    //TheScktInfo.UserID:=TheConnectOPt.PUserID;
    //TheScktInfo.Password:=TheConnectOpt.PPassWD;
    //TheScktInfo.Version:=TheConnectOpt.PVersion;
   
    TheScrSocket:=TIdTcpClient.Create(nil);
    TheScrSocket.Host:=TheConnectRec.ConHost;
    //TheScrSocket.UseNagle:=True;
    //TheScrSocket.SocksInfo:=TheScktInfo;
end;

procedure TCaptureSSSThread.Execute;
var
   iRet:Integer;
   ReadScrSize:integer;
   SubImageID_Y:integer;
   SubImageID_X:integer;
begin
  if ConnectThePC(TheScrSocket,TheConnRec) then//连接成功
  begin 
     try 
       iRet:=TheScrSocket.ReadInteger;  //读取验证数
     except
       self.Terminate;
       exit;
     end;
     if iRet=1 then //验证通过
     begin
       try
	TheScrSocket.Write('远程监视'+EOL);       //发送命令
	TheScrSocket.WriteInteger(PictureType);   //发送图象类型
	TheScrSocket.WriteInteger(ColorType);     //发送图象颜色数
	TheScrSocket.WriteInteger(CompressRatio); //发送图象压缩比
        TheScrSocket.WriteInteger(TheAreaHeight); //发送传输块的高度     
        TheScrSocket.WriteInteger(ThePriority);   //发送监视线程优先级 	
       except
	  Synchronize(ShowErrorState);
          self.Terminate;
	  exit;
       end;
       Repeat//循环读取随机变化的屏幕信息	
         try
           Application.ProcessMessages;
           SubImageID_Y  :=TheScrSocket.ReadInteger;    //读取图象序列__y
           SubImageID_X  :=TheScrSocket.ReadInteger;    //读取图象序列__X
           ReadScrSize :=TheScrSocket.ReadInteger;    //读取数据流大小
	   TheScrSocket.ReadStream(ScrStream,ReadScrSize);//读数据流
	   ShowSubScreen(SubImageID_Y,SubImageID_X,ScrStream);       //显示到屏幕缓存
           ScrStream.Size:=0;
         except
           Synchronize(ShowErrorState);
	   Self.Terminate;
	   exit;
         end;
       until TheScrSocket.Connected=False;//循环读取屏幕信息---直到网络断开
    end else Synchronize(ShowRefuseState);      
  end else Synchronize(ShowDisConnectState); 
     
end;
procedure TCaptureSSSThread.ShowSubScreen(SubID_Y,SubID_X:integer;TheDataStream:TMemoryStream); 
var
   TheScrRect  :TRect;//在屏幕中的矩形区域
   TheBmpRect  :TRect;   
begin 
      TheScrRect.Left :=(SubID_X-1)*80;          //还原屏幕图象的矩形区域
      TheScrRect.Right:=    SubID_X*80;          //还原屏幕图象的矩形区域
      TheScrRect.Top  :=(SubID_Y-1)*TheAreaHeight;
      TheScrRect.Bottom:=   SubID_Y*TheAreaHeight;

      TheBmpRect.Left:=0;
      TheBmpRect.Top:=0;
      TheBmpRect.Right:=80;
      TheBmpRect.Bottom:=TheAreaHeight;
  
  if PictureType=1 then   //如果是jpeg则转换到bmp
  begin
      TheDataStream.Position:=0;//定位并进行压缩转换
      TheSubJpegImage.LoadFromStream(TheDataStream);
      TheSubBmpImage.Assign(TheSubJpegImage);
        //复制到远程屏幕缓存
      LetDrawSingle.Enter;//进行全局变量的临界控制----进入
         RemoteCPCFm.TheCacheBmp.Canvas.Lock; 
         RemoteCPCFm.TheCacheBmp.Canvas.CopyMode:=cmSrcCopy;
         RemoteCPCFm.TheCacheBmp.Canvas.CopyRect(TheScrRect,
                                     TheSubBmpImage.Canvas,TheBmpRect); 
         RemoteCPCFm.TheCacheBmp.Canvas.Unlock;
      LetDrawSingle.Leave;//进行全局变量的临界控制----释放 
      Synchronize(ShowAllScreen);                                           
  end;  
  if PictureType=0 then   //如果是Bmp直接处理显示
  begin
      TheDataStream.Position:=0;
      TheSubBmpImage.LoadFromStream(TheDataStream);     
      //复制到远程屏幕缓存          
      LetDrawSingle.Enter;//进行全局变量的临界控制----进入.TheCacheBmp 
        RemoteCPCFm.TheCacheBmp.Canvas.Lock; 
        RemoteCPCFm.TheCacheBmp.Canvas.CopyMode:=cmSrcCopy;
        RemoteCPCFm.TheCacheBmp.Canvas.CopyRect(TheScrRect,
                                     TheSubBmpImage.Canvas,TheBmpRect);
        RemoteCPCFm.TheCacheBmp.Canvas.Unlock;
      LetDrawSingle.Leave;//进行全局变量的临界控制----释放.TheCacheBmp
      Synchronize(ShowAllScreen);   
  end; 
end;
procedure TCaptureSSSThread.ShowAllScreen;
begin
   RemoteCPCFm.Timer1.Enabled:=True;   
   TheScrSocket.Tag:=TheScrSocket.Tag+1;
   if TheScrSocket.Tag>1000 then TheScrSocket.Tag:=0;
    //从缓存写到屏幕上进行显示  
   RemoteCPCFm.Panel2.Caption:='控制台:'+TimeToStr(Time)+
                                         '='+IntToStr(TheScrSocket.Tag);
   RemoteCPCFm.Panel2.Update;
   
end;
destructor TCaptureSSSThread.Destroy;
begin 
  TheSubJpegImage.Free;  //屏幕子块图象的解压引擎
  TheSubBmpImage.Free;     //恢复屏幕子块的图形位图  
  ScrStream.Free;//记录屏幕图象  
  TheScrSocket.Disconnect;
  TheScrSocket.Free;
  //TheScktInfo.Free;
  inherited destroy;
end;
Procedure TCaptureSSSThread.SetConnectOpt(TCPClient:TidTCPClient;TheOpt:TConnectOpt);
begin
  //TCPClient.UseNagle:=TheOpt.UseNagle;
 // TCPClient.InterceptEnabled:=TheOpt.UseIntercept;
  //TCPClient.SocksInfo.Authentication:=TheOpt.PUseAuth;
  //TCPClient.SocksInfo.Host:=TheOpt.ProxyHost;
  //TCPClient.SocksInfo.Port:=TheOpt.ProxyPort;
  //TCPClient.SocksInfo.Password:=TheOpt.PPassWD;
  //TCPClient.SocksInfo.UserID:=TheOpt.PUserID;
  //TCPClient.SocksInfo.Version:=TheOpt.PVersion;
end;
Function TCaptureSSSThread.ConnectThePC(MyTcp:TidTcpClient;TheConRec:TConnectRec):Boolean;//连接远程主机
var
  ConnectStrList:TStringList;
  ConnectStream :TStringStream;
  NowStr:String;//记录当前时间
  SwapOK:boolean;
begin
  Try
    ConnectStrList:=TStringList.Create;
  except
    Result:=False;
    exit;
  end;
    ConnectStrList.Clear;
    NowStr:=DateTimeToStr(Now);
    ConnectStrList.Add(NowStr);
    ConnectStrList.Add(TheConRec.UserName);
    ConnectStrList.Add(TheConRec.Password);
  Try
    ConnectStream :=TStringStream.Create(ConnectStrList.Text);
  except
    ConnectStrList.Free;
    Result:=False;
    exit;
  end;
  ConnectStream.Position:=0;
  StrInfoSwap('wqkemail8088',ConnectStream,SwapOK);
  if not SwapOK then
  begin
    ConnectStream.Free;
    ConnectStrList.Free;
    Result:=False;
    exit;
  end;
  MyTcp.Disconnect;
  MyTcp.Host:=TheConRec.ConHost;
  MyTcp.Port:=TheConRec.ConPort;
  SetConnectOpt(MyTcp,TheConnectOpt);//设置代理或加密的附加信息
  Try
    MyTcp.Connect;
  except
    ConnectStream.Free;
    ConnectStrList.Free;
    Result:=False;
    exit;
  end;
  Try
    MyTcp.WriteInteger(ConnectStream.Size);
    MyTcp.WriteStream(ConnectStream);
  except
    ConnectStream.Free;
    ConnectStrList.Free;
    Result:=False;
    exit;
  end;
  ConnectStream.Free;
  ConnectStrList.Free;
  Result:=True;
end;
procedure TCaptureSSSThread.ShowDisConnectState;//设置连接失败信息
begin
  Application.MessageBox('连接错误,请检查网络设备是否正常。',
                                     '网络连接超时',MB_OK+MB_ICONSTOP);
end;
procedure TCaptureSSSThread.ShowRefuseState;//设置拒绝连接信息
begin
  Application.MessageBox('远程拒绝连接,请重新设置登录参数。',
                                     '网络验证失败',MB_OK+MB_ICONSTOP);
end;
procedure TCaptureSSSThread.ShowErrorstate;//设置错误信息
begin
  Application.MessageBox('连接传输中断,网络设备已经断开!',
                                   '网络传输提示:',MB_OK+MB_ICONSTOP);
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -