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

📄 unit1.pas

📁 fes is descripy yoso cise iec me i message
💻 PAS
字号:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  NMUDP, ExtCtrls, StdCtrls,jpeg;

type
  Tclientscreen = class(TForm)
    cudp: TNMUDP;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure cudpDataReceived(Sender: TComponent; NumberBytes: Integer;
      FromIP: String);
  private
    { Private declarations }
   procedure ScreenCap(LeftPos,TopPos,RightPos,BottomPos:integer);
  public
    { Public declarations }
  end;

var
  clientscreen: Tclientscreen;

implementation
    const BufSize=2048;{ 发送每一笔数据的缓冲区大小 }
       var
        BmpStream:TMemoryStream;
        BmpStream2:TMemoryStream;
        LeftSize:Longint;{ 发送每一笔数据后剩余的字节数 }
{$R *.DFM}

procedure Tclientscreen.FormCreate(Sender: TObject);
begin
     BmpStream:=TMemoryStream.Create;
     BmpStream2:=TMemoryStream.Create;
end;

procedure Tclientscreen.FormDestroy(Sender: TObject);
begin
     BmpStream.Free;
     BmpStream2.Free;
end;

procedure Tclientscreen.cudpDataReceived(Sender: TComponent; NumberBytes: Integer;
  FromIP: String);
var
    CtrlCode:array[0..29] of char;
    Buf:array[0..BufSize-1] of char;
    TmpStr:string;
    SendSize,LeftPos,TopPos,RightPos,BottomPos:integer;
begin
       CUDP.ReadBuffer(CtrlCode,NumberBytes);{ 读取控制码 }
       if CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]='show' then
       begin { 控制码前4位为“show”表示主控机发出了抓屏指令 }
       if BmpStream.Size=0 then { 没有数据可发,必须截屏生成数据 }
       begin
          TmpStr:=StrPas(CtrlCode);
          TmpStr:=Copy(TmpStr,5,Length(TmpStr)-4);
          //LeftPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
          leftpos:=0;
          TmpStr:=Copy(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)-Pos(':',TmpStr));
          //TopPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
          toppos:=0;
          TmpStr:=Copy(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)-Pos(':',TmpStr));
          //RightPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
          rightpos:=screen.Width;
          //BottomPos:=StrToInt(Copy(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)-Pos(':',TmpStr)));
          bottompos:=screen.Height;
          ScreenCap(LeftPos,TopPos,RightPos,BottomPos); {截取屏幕 }
      end;
        if LeftSize>BufSize then SendSize:=BufSize
                            else SendSize:=LeftSize;
         BmpStream.ReadBuffer(Buf,SendSize);
        LeftSize:=LeftSize-SendSize;
        if LeftSize=0 then BmpStream.Clear;{ 清空流 }
        CUDP.RemoteHost:=FromIP; { FromIP为主控机IP地址 }
        CUDP.SendBuffer(Buf,SendSize); { 将数据发到主控机的2222口 }
       end;
  end;
procedure Tclientscreen.ScreenCap(LeftPos,TopPos,RightPos,BottomPos:integer);
var
   RectWidth,RectHeight:integer;
   SourceDC,DestDC,Bhandle:integer;
   Bitmap:TBitmap;
   myjpeg:tjpegimage;
begin
       RectWidth:=RightPos-LeftPos;
       RectHeight:=BottomPos-TopPos;
       SourceDC:=CreateDC('DISPLAY','','',nil);
       DestDC:=CreateCompatibleDC(SourceDC);
       Bhandle:=CreateCompatibleBitmap(SourceDC,RectWidth,RectHeight);
       SelectObject(DestDC,Bhandle);
       BitBlt(DestDC,0,0,RectWidth,RectHeight,SourceDC,LeftPos,TopPos,SRCCOPY);
       Bitmap:=TBitmap.Create;
       Bitmap.Handle:=BHandle;
//       bitmap.SaveToFile('c:\windows\desktop\0.bmp');

       {myjpeg:=tjpegimage.create();
       myjpeg.Assign(bitmap);
       myjpeg.Compress;}
      // myjpeg.SaveTofile('c:\windows\desktop\1.jpg');
      // myjpeg.SaveToStream(BmpStream);
       BitMap.SaveToStream(BmpStream);
       BmpStream.Position:=0;
       LeftSize:=BmpStream.Size;
       Bitmap.Free;
      // myjpeg.Free;
       DeleteDC(DestDC);
       ReleaseDC(Bhandle,SourceDC);
end;
end.

⌨️ 快捷键说明

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