2010-07-20 13 views
11

Szukam stworzyć bardzo podstawową aplikację do udostępniania ekranu w języku C#. Nie wymaga zdalnego sterowania. Chcę tylko, żeby użytkownik mógł transmitować swój ekran na serwer internetowy.Prosta aplikacja do udostępniania ekranu nr

Jak mam to wdrożyć? (Każdy wskaźnik we właściwym kierunku zostanie bardzo doceniony).

To NIE musi być wysokie FPS. Wystarczyłoby nawet zaktualizować około 5 sekund. Czy sądzisz, że wystarczy przesłać zrzut ekranu w ciągu 5 sekund na mój serwer?

+4

Nie to, co nazwałbym "prostym". –

+0

tak możesz zadzwonić :) –

Odpowiedz

11

Poprzednio blogowałem o how remote screen sharing software works here, nie jest to specyficzne dla C#, ale daje dobre fundamentalne zrozumienie tematu. W tym artykule znajduje się również specyfikacja zdalnego bufora ramki, którą również prawdopodobnie będziesz chciał przeczytać.

Zasadniczo będziesz chciał robić zrzuty ekranu i możesz przesłać te zrzuty ekranu i wyświetlić je po drugiej stronie. Możesz zachować ostatni zrzut ekranu i porównać zrzut ekranu w blokach, aby zobaczyć, które bloki zrzutu ekranu musisz wysłać. Przed wysłaniem danych zazwyczaj wykonuje się kompresję.

Aby mieć pilota, można śledzić ruch myszy i przesyłać go, a następnie ustawić pozycję wskaźnika na drugim końcu. Również ditto o naciśnięciach klawiszy.

Jeśli chodzi o kompresję w języku C#, można po prostu użyć JpegBitmapEncoder, aby tworzyć zrzuty ekranu z kompresją Jpeg o pożądanej jakości.

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

Aby porównać bloki pliku, który chyba najlepiej utworzyć skrót na starym bloku i nowy, a następnie sprawdzić, czy są one takie same. Możesz użyć dowolnego hashing algorithm, który chcesz do tego.

+0

Awesome!Na co powinienem zaglądać, aby porównać zrzuty ekranu i jaką kompresję chciałbym oglądać? –

+0

@ user396077: Zobacz moją edycję. –

1

Cóż, może to być tak proste, jak robienie zrzutów ekranu, kompresowanie ich, a następnie wysyłanie ich przez przewód. Istnieje jednak oprogramowanie, które już to robi. Czy to jest praktyka?

2

Oto kod, aby zrobić zrzut ekranu, nieskompresowanego postaci bitmapy:

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

Teraz wystarczy ścisnąć go i wysłać go na drucie, i gotowe.

Ten kod łączy wszystkie ekrany w konfiguracji wieloekranowej na jednym obrazie. Dostosuj w razie potrzeby.

0

Kluczowym graczem na dzielenie/replikacji ekran jest komponentem COM o nazwie: RPDViewer enter image description here

Dodaj tego składnika com do formularza okna i zewnętrzne, a także .. i cienkie add ten kod do swojej formy obciążenia i dostaniesz ekran replikowane w postaci:

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(); 
     } 
    } 
} 
Powiązane problemy