Application Simple de partage D'écran C#

je cherche à créer une application de partage d'écran très basique dans C#. Pas de contrôle à distance nécessaire. Je veux juste qu'un utilisateur puisse diffuser son écran sur un serveur web.

Comment dois-je mettre en oeuvre ceci? (Un pointeur dans la bonne direction sera grandement appréciée).

il n'est pas nécessaire d'avoir un FPS élevé. Serait suffisant pour même mettre à jour jamais 5s ou ainsi. Pensez-vous qu'il suffirait de simplement télécharger une capture d'écran toutes les 5 secondes sur mon serveur web?

12
demandé sur Andy Hin 2010-07-21 03:56:07

5 réponses

j'ai déjà blogué sur comment partage d'écran à distance le logiciel fonctionne ici, il n'est pas spécifique à C# mais il donne une bonne compréhension fondamentale sur le sujet. Vous trouverez également dans cet article la spécification de la mémoire tampon remote frame sur laquelle vous voudrez probablement vous reporter.

fondamentalement, vous voudrez prendre des screenshots et vous pouvez transmettre ces screenshots et les afficher de l'autre côté. Vous pouvez garder la dernière capture d'écran et comparer la capture d'écran en blocs pour voir les blocs de la capture d'écran, vous devez envoyer. Vous feriez typiquement une sorte de compression avant d'envoyer les données.

pour avoir la commande à distance vous pouvez suivre le mouvement de la souris et le transmettre et régler la position du pointeur sur l'autre extrémité. Aussi idem sur les frappes de touches.

en ce qui concerne la compression en C#, vous pouvez simplement utiliser JpegBitmapEncoder pour créer vos screenshots avec la compression Jpeg avec la qualité que vous vouloir.

JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.QualityLevel = 40; 

Pour comparer des blocs, vous êtes probablement mieux de créer un hachage sur le bloc d'ancien et le nouveau, puis vérifiez pour voir si elles sont la même chose. Vous pouvez utiliser n'importe quel algorithme de hachage vous voulez vous pour cette.

13
répondu Brian R. Bondy 2010-07-21 00:31:29

voici le code pour prendre une capture d'écran, non compressé comme un bitmap:

    public static Bitmap TakeScreenshot() {
        Rectangle totalSize = Rectangle.Empty;

        foreach (Screen s in Screen.AllScreens)
            totalSize = Rectangle.Union(totalSize, s.Bounds);

        Bitmap screenShotBMP = new Bitmap(totalSize.Width, totalSize.Height, PixelFormat.
            Format32bppArgb);

        Graphics screenShotGraphics = Graphics.FromImage(screenShotBMP);

        screenShotGraphics.CopyFromScreen(totalSize.X, totalSize.Y, 0, 0, totalSize.Size,
            CopyPixelOperation.SourceCopy);

        screenShotGraphics.Dispose();

        return screenShotBMP;
    }

maintenant, compresse - le et envoie-le par télégramme, et c'est fini.

ce code regroupe tous les écrans d'une configuration multi-écrans en une seule image. Ajuster si nécessaire.

2
répondu Gabriel Magana 2010-07-21 00:09:09

Eh bien, cela peut être aussi simple que de prendre des captures d'écran, de les compresser, puis de les envoyer par fil. Cependant, il existe des logiciels qui le font déjà. Est-ce pour la pratique?

1
répondu Ed S. 2010-07-20 23:59:17

je cherche à faire quelque chose de similaire, et je viens de trouver ça sur CodeProject. Je pense que cela va vous aider.

http://www.codeproject.com/Articles/371955/Motion-JPEG-Streaming-Server

0
répondu btompkins 2013-01-21 15:55:04

Le joueur clé sur le partage/la reproduction d'un écran est un composant COM appelé: RPDViewer enter image description here

ajouter ce component com à votre forme de fenêtre et dans les références aussi.. et mince ajouter ce code à votre charge formulaire et vous obtiendrez l'écran reproduit dans votre formulaire:

enter image description here

using RDPCOMAPILib;
using System;
using System.Windows.Forms;

namespace screenSharingAttempt
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        RDPSession x = new RDPSession(); 
        private void Incoming(object Guest)
        {
            IRDPSRAPIAttendee MyGuest = (IRDPSRAPIAttendee)Guest; 
            MyGuest.ControlLevel = CTRL_LEVEL.CTRL_LEVEL_INTERACTIVE;
        }


        //access to COM/firewall will prompt 
        private void button1_Click(object sender, EventArgs e)
        {
            x.OnAttendeeConnected += Incoming;
            x.Open();
        }

        //connect
        private void button2_Click(object sender, EventArgs e)
        {
            IRDPSRAPIInvitation Invitation = x.Invitations.CreateInvitation("Trial", "MyGroup", "", 10);
            textBox1.Text = Invitation.ConnectionString;
        }

        //Share screen

        private void button4_Click(object sender, EventArgs e)
        {
            string Invitation = textBox1.Text;// "";// Interaction.InputBox("Insert Invitation ConnectionString", "Attention");
            axRDPViewer1.Connect(Invitation, "User1", "");
        }


        //stop sharing
        private void button5_Click(object sender, EventArgs e)
        {
            axRDPViewer1.Disconnect();
        }
    }
}
0
répondu Mahmoud Sayed 2017-04-14 20:51:46