Envoi et réception d'une capture d'écran par streams avec les composants tcp indy avec c++ builder 6

Soyez le premier à donner votre avis sur cette source.

Vue 10 989 fois - Téléchargée 1 007 fois

Description

Bonjour tout le monde, j'ai réalisé il y'a quelques temps une petite application en Delphi dont la fonction était d'envoyer une capture d'écran par streaming via les composants tcp Indy à une autre application serveur. La déscription et les sources sont ici : http://www.delphifr.com/code.aspx?id=26586
Je sais j'ai parlé de Delphi mais si je post ici c'est parce que j'ai réalisé la même application avec Borland c++ builder 6 pour ceux que ca interesse.... Voilà.
La déscription de cette source est la même que pour celle en Delphi donc vous pouvez vous y reporter pour les détails.

Source / Exemple :


// Partie client : code de unit1.cpp

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <jpeg.hpp> //inclusion de jpeg.hpp

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------

//Définition de la procedure qui capture l'écran et converti en jpg
//puis envois le tout par tcp
void sendstr()
{
TMemoryStream *stream = new TMemoryStream();
TJPEGImage *jpg = new TJPEGImage();
Graphics :: TBitmap *bmp = new Graphics :: TBitmap();
TRect *rect = new TRect();
TPicture *img = new TPicture();

img->Bitmap->Height = Screen->Height;
img->Bitmap->Width = Screen->Width;

int scrw = Screen->Width, scrh = Screen->Height;

HWND hwnd = GetDesktopWindow();
HDC hDC = GetDC(hwnd);

BitBlt(img->Bitmap->Canvas->Handle,0,0,scrw,scrh,hDC,0,0,SRCCOPY);

try
{
     jpg->Assign(img->Bitmap);
     jpg->CompressionQuality = 15;
     bmp->Width = jpg->Width -50;
     bmp->Height = jpg->Height -50;
     rect->Left = 0;
     rect->Top = 0;
     rect->Right = bmp->Width-1;
     rect->Bottom = bmp->Height-1;
     bmp->Canvas->StretchDraw(*rect,jpg);
     jpg->Assign(bmp);
     jpg->SaveToStream(stream);
     jpg->Free();
     bmp->Free();
     img->Free();
}
catch (...)
{
}
try
{
Form1->tcp->OpenWriteBuffer();
Form1->tcp->WriteStream(stream);
Form1->tcp->CloseWriteBuffer();
stream->Free();
Form1->tcp->Disconnect();
}
catch(...)
{
}
}

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
try
{
// Edit2->Text.ToIntDef(1000) converti la chaine contenue dans Edit2 en Entiers
//Si la conversion n'est pas possible l'interval prend la valeure 1000
Timer1->Interval = Edit2->Text.ToIntDef(1000) ; 
tcp->Host = Edit1->Text;
Timer1->Enabled = true;
}
catch(...)
{
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
try
{
Timer1->Enabled = false;
}
catch(...)
{
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
try
{
tcp->Connect();
sendstr();
}
catch(...)
{
Timer1->Enabled = false;
ShowMessage("Connexion Impossible");
}
}

//Partie serveur : code de unit1.cpp

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <jpeg.hpp>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{

}
//---------------------------------------------------------------------------

void __fastcall TForm1::tcpExecute(TIdPeerThread *AThread)
{
TMemoryStream *stream = new TMemoryStream();
TJPEGImage *jpg = new TJPEGImage();

AThread->Connection->ReadStream(stream, -1, true); //réception du stream
stream->Position =0;
jpg->LoadFromStream(stream); 
Image1->Picture->Graphic = jpg; //affichage dans TImage

stream->Free();
jpg->Free();

}

Conclusion :


Si vous lisez le post sur la source Delphi rapidement, vous n'aurez aucun mal à faire le rapprochement avec cette source ci.... De toute facon il y'a un zip ;)

Bonne journée!

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
5
Date d'inscription
vendredi 22 septembre 2006
Statut
Membre
Dernière intervention
5 novembre 2006

voila le probleme! je travaille avec c++builder 5 et je n'ai pas le composant tcp! mais il est possible d'envoyer le stream sur le siocket grace à ClientSocket->Socket->SendStream(stream);
mais comment le recevoir avec le server socket? puisqu'il n'y a pas de ServerSocket->Socket->ReceiveStream(stream). est ce que quelqu'un pourrait m'aider. Dans tous les cas ta source est vraiment bien réaliser. je t'ai mis 10/10. Merci
Messages postés
87
Date d'inscription
dimanche 2 février 2003
Statut
Membre
Dernière intervention
4 mars 2010

je n'ai pas tester encore mais je te donne 10/10 d'avance car je recherchais ca aussi

j'avais faite un code en c/c++ builder permettant de faire un screenshot, tes 3 petite ligne mon fait rappellé ua mien ;-) , jsute que je tansferai le fichier en lecture binaire via socket !!

parfois le fichier etait erronné ! avec ton code je vais essayer de faire plusieur transfer en meme temp , un reseau qui envoie leur capture vers un seul poste !

1°) question comment savoir la provennance du fichier envoyé
2°) peux envoyé une video d'une webcame par exemple d'un pc distance

je travaille sur c/c++ builder

merci
@+
Messages postés
46
Date d'inscription
vendredi 14 janvier 2005
Statut
Membre
Dernière intervention
31 juillet 2006

help, comment on fait pour le faire marcher ?
Messages postés
12
Date d'inscription
vendredi 7 novembre 2003
Statut
Membre
Dernière intervention
12 janvier 2005

je te donne une note 10, car tu ma donné se que je cherché depuis 3 jours. je te remercier....
Messages postés
71
Date d'inscription
mercredi 29 septembre 2004
Statut
Membre
Dernière intervention
19 mars 2008

c'est pas possible d'avoir une petite note ici ? juste pour la forme, c'est pas grave si elle est pas bonne ! merci.
Afficher les 8 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.