IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Création d'un Remote Desktop


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2010
    Messages : 46
    Points : 73
    Points
    73
    Par défaut Création d'un Remote Desktop
    Bonjour,
    J'ai eu comme projet de créer un Remote Desktop en VB.NET en utilisant les sockets, dont j'ai déjà une 'bonne' base fonctionnelle.
    J'ai déjà commencé, je peux contrôler la souris à distance, il me restera le clavier qui sera lui aussi, simple à faire.
    Cependant, mon réel problème se trouve sur la transmission de l'image, j'avais déjà il y a quelques semaines un peu regardé la chose, et résultat, je ne vois vraiment pas.
    Tout d'abord, je prends une screenshot de l'écran du client avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim b As Bitmap
    b = New Bitmap(My.Computer.Screen.WorkingArea.Width, _
            My.Computer.Screen.WorkingArea.Height, _
            Imaging.PixelFormat.Format16bppRgb555)
    Dim g As Graphics = Graphics.FromImage(b)
    g.CopyFromScreen(New Point(0, 0), New Point(0, 0), _
    New Size(My.Computer.Screen.WorkingArea.Width, My.Computer.Screen.WorkingArea.Height))
    Une fois arrivé là, j'ai mon image, plutôt lourde (résolution 1920*1080), j'ai déjà décidé de faire une image réduite de moitié question dimensions (960*540 pour ma part). Pour la passer, je me suis dit qu'il fallait que je transforme cette image en String étant donné que je contacte mon serveur comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    toSend = System.Text.Encoding.ASCII.GetBytes("message$")
    serverStream.Write(toSend , 0, toSend .Length)
    serverStream.Flush()
     
    buffSize = clientSocket.ReceiveBufferSize
    serverStream.Read(inStream, 0, buffSize)
    returnedData = System.Text.Encoding.ASCII.GetString(inStream)
    Les trois dernières lignes sont donc l'attente de la réponse du serveur, qui à lui-même attendu mon envois dans un thread séparé.

    Du coup, j'ai commencé à faire une fonction pour convertir mon Bitmap en String cependant, aucun des résultats n'étaient probants, généralement plus de 3mn! Je pense que 0.005 FPS c'est un peu just pour un Remote Desktop. J'aimerais donc savoir, comment les vraies s'il vous plait? ma méthode est-elle mauvaise?

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    ce qu'il faut transférer ce sont les octets en jpeg
    img.Save(un memorystream, format.jpeg)
    ensuite le memorystream.getbytes je crois

    après renvoyer toutes l'image n'est pas la bonne méthode, il faut seulement envoyer ce qui a changé, la 1ère fois tu capture tout et tu envoies tout, et tu gardes cette variable image, au tour d'après, tu compares l'image avec l'ancienne
    sur le transfère il faut donc envoyer aussi les coordonnées x et y (le width et le height ce n'est pas la peine, c'est codé dans le jpeg qui sera recréé de l'autre coté avec les octets (system.Drawing.image.fromstream(un memorystream rempli avec les octets)
    pour la détection de modification, la seule idée que j'ai, c'est de faire des captures de genre 100x100 pixels, et tu compares chaque morceau avec le précédent (si les octets sont les même)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2010
    Messages : 46
    Points : 73
    Points
    73
    Par défaut
    Salut, merci de ta réponse rapide.
    Je ne vois pas exactement ce dont tu parles dans ton premier paragraphe, je vais aller chercher sur Internet.
    Pour le second, merci, je pense que c'est une très bonne idée. Par contre, vaut-il mieux que je fasse ma screenshot et que je la sépare ou alors que je fasse mes captures 100*100 (environ 208 avec ma résolution :o) et que je les compares directement (donc pas besoin de la séparer).
    Merci. Je vais aller me documenter sur les MemoryStream.

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    la méthode pour obtenir les octets d'une image, ou une image à partir des octets est connue, elle passe souvent ici, elle sert aussi quand on veut mettre une image dans une base de données
    la méthode save de la classe Bitmap permet de faire une sauvegarde dans un memorystream, qui est une classe gérant un stream en mémoire (par rappot à un stream fichier ou un stream réseau par exemple)

    pour la comparaison pour comparer les octets il faut 2 images de même taille
    donc soit capturer tout et découper en morceaux, soit capturer des morceaux, et garder des variables vers les morceaux (dans une collection)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2010
    Messages : 46
    Points : 73
    Points
    73
    Par défaut
    Alors voilà, j'y travaille un peu depuis tout à l'heure et je pense avancer, un peu. Je suis en train de splitter mon image, j'ai rapidement pensé aux tableaux d'images. Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Dim i As Integer = 0
    Dim x As Integer = 0
    Dim y As Integer = 0
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim b() As Image
        b(i) = New Bitmap(100, 100, Imaging.PixelFormat.Format16bppRgb555)
        Dim g() As Graphics
        g(i) = Graphics.FromImage(b(i))
        g(i).CopyFromScreen(New Point(x, y), New Point(x, y), New Size(100, 100))
     
        PictureBox1.Image = b(i)
        If x < My.Computer.Screen.WorkingArea.Width - 100 Then
            x += 100
        Else
            x = 0
            y += 100
        End If
        If x >= My.Computer.Screen.WorkingArea.Width - 100 And y >= My.Computer.Screen.WorkingArea.Height - 100 Then
            Timer1.Stop()
        End If
    End Sub
    Je pensais m'en sortir comme ça, cependant, petit problème, une exception m'a rattrapé:
    La référence d'objet n'est pas définie à une instance d'un objet.
    à propos de la ligne suivante: b(i) = New Bitmap(100, 100, Imaging.PixelFormat.Format16bppRgb555).

    J'ai supposés qu'il fallait que je mette "New" lors de sa déclaration mais non, pas possible, c'est un tableau. Y'a-t-il un moyen de contourner ça? je ne vois pas comment faire sans utiliser les tableaux donc j'espère
    Merci d'avance, désolé du dérangement, et merci pour tout ce que vous avez déjà fait.

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    dim b() as image définit un tableau, mais vide ...
    b(0) (ou autre nombre) n'existe pas d'où ton erreur

    dim b(6) as image permet de faire b(0 à 5)

    le mieux étant d'utiliser une collection
    dim l as new list(of image)
    l.Add(new bitmap(...))
    l(0) correspond à la première image ajoutée
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2010
    Messages : 46
    Points : 73
    Points
    73
    Par défaut
    Merci, j'ai un peu essayé les listes mais j'ai vite bloqué sur cette ligne que je n'arrivais pas à "transcrire" en List, g(i).CopyFromScreen(New Point(x, y), New Point(x, y), New Size(100, 100)).
    Du coup, je me suis rabattu sur les tableaux en gérant un peu mieux mon truc. Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Dim i As Integer = 0
    Dim x As Integer = 0
    Dim y As Integer = 0
     
    Dim b((Int(My.Computer.Screen.WorkingArea.Width / 100) + 1) * (Int(My.Computer.Screen.WorkingArea.Height / 100) + 1)) As Image
    Dim g((Int(My.Computer.Screen.WorkingArea.Width / 100) + 1) * (Int(My.Computer.Screen.WorkingArea.Height / 100) + 1)) As Graphics
    'J'ai donc pour changer géré la taille de mes tableaux dynamiquement, selon la résolution de l'utilisateur
     
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        b(i) = New Bitmap(My.Computer.Screen.WorkingArea.Width, My.Computer.Screen.WorkingArea.Height, Imaging.PixelFormat.Format16bppRgb555)
        g(i) = Graphics.FromImage(b(i))
        g(i).CopyFromScreen(New Point(x, y), New Point(x, y), New Size(100, 100))
     
    	Dim TempImg As New Bitmap(100, 100)
        Dim TempGraph As Graphics = Graphics.FromImage(TempImg)
        Dim rect As New Rectangle(0, 0, 100, 100)
        TempGraph.DrawImage(b(i), rect, x, y, 100, 100, GraphicsUnit.Pixel)
        b(i) = TempImg
        'PictureBox1.Image = b(i)
        If x < My.Computer.Screen.WorkingArea.Width - 100 Then
            x += 100
        Else
            x = 0
            y += 100
        End If
        If x >= My.Computer.Screen.WorkingArea.Width - 100 And y >= My.Computer.Screen.WorkingArea.Height - 100 Then
            Timer1.Stop()
        End If
        i += 1
    End Sub
    C'est cool, ça fonctionne bien. Cependant, problème annexe, mais pas des moindre, ce code prend 12s pour s'afficher! :o (1920x1080), moitié moins si je n'affiche pas l'image dans la PictureBox, ça fait toujours 6s et 6(/5)s de trop. Je ne vois pas ce qui pourrait accélérer, sachant que je n'ai même pas encore fait le truc de la comparaison! je vais peut-être finalement faire la screenshot et ensuite la splitter (j'hésitais dessus au début) au lieu de faire directement plusieurs screenshots pré-splitté.
    Je me demande vraiment pourquoi c'est si lent.
    Je vais un peu y réfléchir, mais là, je m'absente environ 6h.
    Merci encore de toute l'aide que vous m'avez apporté.

Discussions similaires

  1. Utilisation de Remote Desktop connection
    Par wassim_kh dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 04/08/2006, 12h04
  2. Question à propos de Remote Desktop
    Par rikidi dans le forum Autres Logiciels
    Réponses: 6
    Dernier message: 03/11/2005, 15h56
  3. Remote Desktop Protocol
    Par Jean-Jacques Engels dans le forum Windows XP
    Réponses: 1
    Dernier message: 12/10/2005, 21h40
  4. Création d’une icône sur desktop PC
    Par Enrique dans le forum Windows
    Réponses: 6
    Dernier message: 03/12/2004, 10h56
  5. Création d'un "remote server" sur un réseau
    Par Papino dans le forum Débuter
    Réponses: 2
    Dernier message: 05/09/2004, 16h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo