//--------------------------------------------------------------------------- #include #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { Image1->Width = 1024; Image1->Height = 768; DesktopCanvas = new TCanvas(); hDC = GetDC(0); //デスクトップの大きさを取得 Desktop.cx = GetSystemMetrics(SM_CXFULLSCREEN); Desktop.cy = Desktop.cx*3/4; //デスクトップDCのハンドルをセット DesktopCanvas->Handle = hDC; Image1->Canvas->CopyMode = cmSrcCopy; Stream1 = new TMemoryStream(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { /*  //フォーム消す  Hide();  //デスクトップのデバイスコンテキスト取得  DC = GetDC(0);  //画面コピー  BitBlt(Image1->Canvas->Handle, 0 , 0 , Screen->Width, Screen->Hieght, DC, 0, 0, SRCCOPY);  //DC解放  ReleaseDC(0, DC);  //フォーム表示  Show(); */ // 自分がクライアントでなければ画面を取り込む if(ClientSocket1->Active == false) Image1->Canvas->CopyRect( Rect(0,0,Image1->Width,Image1->Height), DesktopCanvas,Rect(0,0,Desktop.cx,Desktop.cy)); else // 自分がクライアントだったらサーバーの画面を要求 ClientSocket1->Socket->SendText("getscreen"); Refresh();//フォームだけ再描画します。ボタンは再描画されません。 } //--------------------------------------------------------------------------- // screenデータ送信 void TForm1::SendScreen(TCustomWinSocket *Socket) { TJPEGImage *jp = new TJPEGImage(); jp->Assign(Image1->Picture->Bitmap); Stream1->Position = 0; jp->SaveToStream(Stream1); delete jp; // 送信データの始まりの印 unsigned char mark=0xff; Socket->SendBuf(&mark,1); // 送信データの総数 unsigned int a=Stream1->Size; Socket->SendBuf(&a,4); Panel3->Caption = a; Stream1->Position = 0; Socket->SendBuf(Stream1->Memory,Stream1->Size); Stream1->Position = 0; // Stream1->SaveToFile("send.jpg"); // Stream1->Position = 0; } //--------------------------------------------------------------------------- // サーバーモード void __fastcall TForm1::Button2Click(TObject *Sender) { ClientSocket1->Close(); ServerSocket1->Port = Edit2->Text.ToInt(); ServerSocket1->Open(); Panel2->Caption = "server"; } //--------------------------------------------------------------------------- // クライアントモード void __fastcall TForm1::Button3Click(TObject *Sender) { ClientSocket1->Host = Edit1->Text; ClientSocket1->Port = Edit2->Text.ToInt(); ClientSocket1->Open(); Panel2->Caption = "client"; } //--------------------------------------------------------------------------- // プログラム終了 void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { ServerSocket1->Close(); ClientSocket1->Close(); //DCを破棄 ReleaseDC(0,DesktopCanvas->Handle); //Canvasを破棄 delete DesktopCanvas; delete Stream1; } //--------------------------------------------------------------------------- // フォームサイズ変更 void __fastcall TForm1::FormResize(TObject *Sender) { ScrollBox1->Width = Form1->Width - Panel1->Width - 8; ScrollBox1->Height = ScrollBox1->Width - Panel1->Width - 8; } //--------------------------------------------------------------------------- // フォーム画面が生成された時 void __fastcall TForm1::FormCreate(TObject *Sender) { Form1->Width = 500; Form1->Height = 400; } //--------------------------------------------------------------------------- // タイマー void __fastcall TForm1::Timer1Timer(TObject *Sender) { Button1Click(NULL); } //--------------------------------------------------------------------------- // サーバーから情報が送られたとき void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket) { // 画像データを取り込み始める時 if(Stream1->Position == 0) { //データの始まりを探す unsigned char mark=0; Socket->ReceiveBuf(&mark,1); if(mark!=0xff) return; Length=0; int b=0; //少し待たないとLengthの値がおかしくなる while(b<100) { Err++; b=Socket->ReceiveLength(); } Panel4->Caption = Err; Err=0; Socket->ReceiveBuf(&Length,4); Panel3->Caption = Length; Stream1->SetSize(Length); ProgressBar1->Max = Length; } // 画像データをStream1に取り込む int bufs = Socket->ReceiveLength(); char *buf; buf = (char*)malloc(bufs); int len= Socket->ReceiveBuf(buf,bufs); Stream1->Write(buf,len); bufs=0; free(buf); Length -= len; if(Length<5) { Panel4->Caption = "bug?"; Length=0; } // 全て取り込み終わったら if(Length == 0) { // 送られてきたjpegをbitmapに復元してImage1に表示 TJPEGImage *jp = new TJPEGImage(); Stream1->Position = 0; // Stream1->SaveToFile("receive.jpg"); // Stream1->Position = 0; jp->LoadFromStream(Stream1); // たまにlen==0の時があってバグる // if(len!=0) Image1->Picture->Bitmap->Assign(jp); Stream1->Position = 0; delete jp; if(CheckBox1->Checked == true) Socket->SendText("getscreen"); } ProgressBar1->Position = Stream1->Position; } //--------------------------------------------------------------------------- // 接続を切断 void __fastcall TForm1::Button4Click(TObject *Sender) { ServerSocket1->Close(); ClientSocket1->Close(); Stream1->Position=0; Panel2->Caption = "disconnect"; } //--------------------------------------------------------------------------- // サーバーと繋がったら void __fastcall TForm1::ClientSocket1Connect(TObject *Sender, TCustomWinSocket *Socket) { Panel2->Caption = "connect"; // Socket->SendText("getscreen"); } //--------------------------------------------------------------------------- // クライアントと繋がったら void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender, TCustomWinSocket *Socket) { Panel2->Caption = "connect"; } //--------------------------------------------------------------------------- // 自分がサーバーでクライアントと切断されたら void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender, TCustomWinSocket *Socket) { Panel2->Caption = "server"; Timer1->Enabled = false; } //--------------------------------------------------------------------------- // 自分がクライアントでサーバーと切断されたら void __fastcall TForm1::ClientSocket1Disconnect(TObject *Sender, TCustomWinSocket *Socket) { Panel2->Caption = "client"; } //--------------------------------------------------------------------------- // クライアントから信号が来たら void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket) { AnsiString str; str = Socket->ReceiveText(); if(str=="getscreen") { Button1Click(NULL); SendScreen(Socket); } } //--------------------------------------------------------------------------- // void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { MouseDown = true; MouseX = X; MouseY = Y; } //--------------------------------------------------------------------------- void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if(MouseDown == false) return; ScrollBox1->HorzScrollBar->Position -= X - MouseX; ScrollBox1->VertScrollBar->Position -= Y - MouseY; } //--------------------------------------------------------------------------- void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { MouseDown = false; } //--------------------------------------------------------------------------- void __fastcall TForm1::CheckBox1Click(TObject *Sender) { if(CheckBox1->Checked == true || ClientSocket1->Active == true) ClientSocket1->Socket->SendText("getscreen"); } //---------------------------------------------------------------------------