📄 tcapturesssthreadunit.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 + -