2010-07-20 20 views
11

Sto cercando di creare un'applicazione di condivisione dello schermo molto semplice in C#. Non è necessario il telecomando. Voglio solo che un utente sia in grado di trasmettere il proprio schermo a un server web.Semplice applicazione di condivisione dello schermo C#

Come devo implementarlo? (Qualsiasi puntatore nella giusta direzione sarà molto apprezzato).

Non è necessario un valore FPS elevato. Sarebbe sufficiente aggiornare anche mai 5 secondi o giù di lì. Pensi che sarebbe sufficiente caricare solo uno screenshot di 5 secondi sul mio server web?

+4

Non è quello che definirei "semplice". –

+0

si può chiamare :) –

risposta

11

Ho scritto in precedenza circa how remote screen sharing software works here, non è specifico di C# ma offre una buona comprensione fondamentale sull'argomento. Inoltre, in questo articolo è collegato anche lo specifico del frame buffer remoto che probabilmente vorresti anche leggere.

In pratica si desidera acquisire schermate e trasmettere questi screenshot e visualizzarli dall'altra parte. È possibile mantenere l'ultima schermata e confrontare lo screenshot nei blocchi per vedere quali blocchi dello screenshot è necessario inviare. In genere, esegui una sorta di compressione prima di inviare i dati.

Per avere il controllo remoto è possibile tracciare il movimento del mouse e trasmetterlo e impostare la posizione del puntatore sull'altra estremità. Anche idem sulle sequenze di tasti.

Per quanto riguarda la compressione in C#, è possibile utilizzare semplicemente JpegBitmapEncoder per creare gli screenshot con compressione Jpeg con la qualità desiderata.

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

Per confrontare i blocchi file che si sta probabilmente meglio per creare un hash sul vecchio blocco e quello nuovo, e quindi controllare per vedere se sono la stessa cosa. È possibile utilizzare qualsiasi hashing algorithm desiderato per questo.

+0

Fantastico!Che cosa dovrei esaminare per confrontare gli screenshot e che tipo di compressione dovrei guardare? –

+0

@ user396077: vedere la mia modifica. –

1

Bene, può essere semplice come scattare screenshot, comprimerli e inviarli via cavo. Tuttavia, esiste già un software che già lo fa. È questo per la pratica?

2

Ecco il codice per prendere uno screenshot, non compresso in formato 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; 
    } 

Ora basta comprimerlo ed inviarlo oltre il filo, e il gioco è fatto.

Questo codice combina tutte le schermate in una configurazione multischermo in un'unica immagine. Tweak secondo necessità.

0

Il giocatore chiave sulla condivisione/replicare uno schermo è un componente COM denominato: RPDViewer enter image description here

Aggiungere tale componente COM al form finestra e nei riferimenti come pure .. e sottili add questo codice al vostro carico modulo ed otterrete lo schermo replicato nel modulo:

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(); 
     } 
    } 
} 
Problemi correlati