//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#define BufSize 2048 //发送每一笔数据的缓冲区大小
TClient *Client;
//---------------------------------------------------------------------------
__fastcall TClient::TClient(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TClient::FormCreate(TObject *Sender)
{
BmpStream=new TMemoryStream();
}
//---------------------------------------------------------------------------
void __fastcall TClient::FormDestroy(TObject *Sender)
{
delete BmpStream;
}
//---------------------------------------------------------------------------
void __fastcall TClient::CUDPDataReceived(TComponent *Sender,
int NumberBytes, AnsiString FromIP, int Port)
{
String CtrlCode;
char Buf[2048];
String TmpStr,LeftPos,TopPos,RightPos,BottomPos;
int SendSize;
TMemoryStream *MyStream = new TMemoryStream();
CUDP->ReadStream(MyStream);
//CUDP->ReadBuffer(CtrlCode,NumberBytes,NumberBytes);
CtrlCode.SetLength(NumberBytes);
MyStream->Read(&CtrlCode[1], NumberBytes);//读取控制码
delete MyStream;
//ShowMessage(CtrlCode);
if(CtrlCode.SubString(1,4)=="show")
{// 控制码前4位为"show"表示主控机发出了抓屏指令
if(BmpStream->Size==0)//没有数据可发,必须截屏生成数据
{
TmpStr=CtrlCode.SubString(6,CtrlCode.Length()-5);
LeftPos=TmpStr.SubString(1,TmpStr.Pos(",")-1);
TmpStr=TmpStr.SubString(LeftPos.Length()+2,TmpStr.Length()-LeftPos.Length()+1);
TopPos=TmpStr.SubString(1,TmpStr.Pos(",")-1);
TmpStr=TmpStr.SubString(TopPos.Length()+2,TmpStr.Length()-TopPos.Length()+1);
RightPos=TmpStr.SubString(1,TmpStr.Pos(",")-1);
TmpStr=TmpStr.SubString(RightPos.Length()+2,TmpStr.Length()-RightPos.Length()+1);
BottomPos=Trim(TmpStr);
ScreenCap(StrToInt(LeftPos),StrToInt(TopPos),StrToInt(RightPos),StrToInt(BottomPos));//截取屏幕
}
if(LeftSize>BufSize) SendSize=BufSize;
else SendSize=LeftSize;
BmpStream->ReadBuffer(Buf,SendSize);
LeftSize=LeftSize-SendSize;
if(LeftSize==0) BmpStream->Clear(); //清空流
CUDP->RemoteHost=FromIP; //FromIP为主控机IP地址
CUDP->RemotePort=2222; //主控机端口
CUDP->SendBuffer(Buf,SendSize,SendSize); //将数据发到主控机的2222口
}
}
//---------------------------------------------------------------------------
void __fastcall TClient::ScreenCap(int LeftPos,int TopPos,int RightPos,int BottomPos)
{
int RectWidth,RectHeight;
HBITMAP Bhandle;
HDC SourceDC,DestDC;
Graphics::TBitmap *Bitmap=new Graphics::TBitmap();
RectWidth=RightPos-LeftPos;
RectHeight=BottomPos-TopPos;
SourceDC=CreateDC("DISPLAY","","",NULL);
DestDC=CreateCompatibleDC(SourceDC);
Bhandle=CreateCompatibleBitmap(SourceDC,RectWidth,RectHeight);
SelectObject(DestDC,Bhandle);
BitBlt(DestDC,0,0,RectWidth,RectHeight,SourceDC,LeftPos,TopPos,SRCCOPY);
Bitmap->Handle=Bhandle;
Bitmap->SaveToStream(BmpStream);
BmpStream->Position=0;
LeftSize=BmpStream->Size;
delete Bitmap;
DeleteDC(DestDC);
ReleaseDC(Bhandle,SourceDC);
}