2010-07-20 9 views
11

Ich bin auf der Suche nach einer sehr einfachen Bildschirmfreigabe-Anwendung in C# zu erstellen. Keine Fernbedienung notwendig. Ich möchte nur, dass ein Benutzer seinen Bildschirm an einen Webserver senden kann.Einfache C# Bildschirmfreigabe-Anwendung

Wie soll ich das umsetzen? (Jeder Zeiger in die richtige Richtung wird sehr geschätzt).

Es muss nicht hohe FPS sein. Wäre ausreichend um überhaupt je 5s oder so upzudaten. Denkst du, es wäre ausreichend, nur einen Screenshot alle 5 Sekunden auf meinen Webserver zu laden?

+4

Nicht was ich "einfach" nennen würde. –

+0

yep können Sie anrufen :) –

Antwort

11

Ich zuvor blogged über how remote screen sharing software works here, es ist nicht spezifisch für C#, aber es gibt ein gutes grundlegendes Verständnis zu dem Thema. In diesem Artikel ist auch die Remote-Frame-Puffer-Spezifikation verlinkt, über die Sie wahrscheinlich auch nachlesen möchten.

Im Grunde werden Sie Screenshots machen und diese Screenshots übertragen und auf der anderen Seite anzeigen können. Sie können den letzten Screenshot behalten und den Screenshot in Blöcken vergleichen, um zu sehen, welche Blöcke des Screenshots Sie senden müssen. Sie würden normalerweise eine Art von Komprimierung vor dem Senden der Daten vornehmen.

Um eine Fernbedienung zu haben, können Sie die Mausbewegung verfolgen und übertragen und die Zeigerposition am anderen Ende einstellen. Auch über Tastenanschläge.

Soweit Kompression in C# geht, können Sie einfach JpegBitmapEncoder verwenden, um Ihre Screenshots mit JPEG-Komprimierung in der gewünschten Qualität zu erstellen.

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

Um Dateiblocks Sie sind wahrscheinlich am besten einen Hash auf dem alten Block zu erstellen und die neuen, und dann überprüfen, um zu sehen, ob sie gleich sind zu vergleichen. Sie können dafür eine beliebige hashing algorithm verwenden.

+0

Awesome!Worauf sollte ich achten, um die Screenshots zu vergleichen, und welche Komprimierung würde ich mir ansehen? –

+0

@ user396077: Siehe meine Bearbeitung. –

1

Nun, es kann so einfach sein, wie Screenshots zu machen, sie zu komprimieren und dann über den Draht zu senden. Es gibt jedoch bereits existierende Software, die dies bereits tut. Ist das für die Praxis?

2

Hier Code um einen Screenshot aufzunehmen, unkomprimiert als 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; 
    } 

Jetzt ist es nur komprimieren und über den Draht senden, und Sie sind fertig.

Dieser Code fasst alle Bildschirme in einem Multiscreen-Setup zu einem Bild zusammen. Tweak nach Bedarf.

0

Der Schlüsselspieler auf Sharing/einen Bildschirm zu replizieren ist eine COM-Komponente genannt: RPDViewer enter image description here

hinzufügen, die COM-Komponente in der Fensterform und in Referenzen sowie .. und dünn add dieser Code in das Formular laden, und Sie werden auf dem Bildschirm in der Form repliziert:

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