2010-07-20 33 views
11

Tôi đang tìm cách tạo một ứng dụng chia sẻ màn hình rất cơ bản trong C#. Không cần điều khiển từ xa. Tôi chỉ muốn người dùng có thể phát màn hình của họ lên máy chủ web.Đơn giản C# Ứng dụng chia sẻ màn hình

Tôi nên triển khai tính năng này như thế nào? (Bất kỳ con trỏ nào đi đúng hướng sẽ được đánh giá cao).

Nó KHÔNG cần phải là FPS cao. Sẽ là đủ để thậm chí cập nhật bao giờ 5s hoặc lâu hơn. Bạn có nghĩ rằng nó sẽ là đủ để chỉ cần tải lên một ảnh chụp màn hình bao giờ 5 giây để máy chủ web của tôi?

+4

Không phải những gì tôi gọi là "đơn giản". –

+0

yep bạn có thể gọi :) –

Trả lời

11

Tôi trước đây đã viết blog về how remote screen sharing software works here, nó không phải là cụ thể cho C# nhưng nó cung cấp cho một sự hiểu biết cơ bản tốt về chủ đề. Cũng được liên kết trong bài viết đó là đặc tả bộ đệm khung từ xa mà bạn cũng có thể muốn đọc lên.

Về cơ bản bạn sẽ muốn chụp ảnh màn hình và bạn có thể truyền những ảnh chụp màn hình đó và hiển thị chúng ở phía bên kia. Bạn có thể giữ ảnh chụp màn hình cuối cùng và so sánh ảnh chụp màn hình trong các khối để xem các khối ảnh chụp màn hình nào bạn cần gửi. Bạn thường sẽ thực hiện một số loại nén trước khi gửi dữ liệu.

Để điều khiển từ xa, bạn có thể theo dõi chuyển động của chuột và truyền nó và đặt vị trí con trỏ ở đầu kia. Ngoài ra ditto về tổ hợp phím.

Theo như nén đi trong C#, bạn có thể chỉ cần sử dụng JpegBitmapEncoder để tạo ảnh chụp màn hình của bạn với nén Jpeg với chất lượng mà bạn muốn.

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

Để so sánh các khối tệp bạn có thể tốt nhất để tạo băm trên khối cũ và khối mới nhất, sau đó kiểm tra xem chúng có giống nhau hay không. Bạn có thể sử dụng bất kỳ hashing algorithm nào bạn muốn cho việc này.

+0

Tuyệt vời!Tôi nên xem xét điều gì để so sánh các ảnh chụp màn hình và tôi sẽ xem loại nén nào? –

+0

@ user396077: Xem chỉnh sửa của tôi. –

1

Vâng, nó có thể đơn giản như chụp ảnh màn hình, nén chúng, và sau đó gửi chúng qua dây. Tuy nhiên, có phần mềm hiện có đã thực hiện điều này. Đây có phải là thực hành?

2

Dưới đây là code để có một ảnh chụp màn hình, không nén như một 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; 
    } 

Bây giờ chỉ cần nén nó và gửi nó qua dây, và bạn đã hoàn tất.

Mã này kết hợp tất cả các màn hình trong một thiết lập nhiều màn hình thành một hình ảnh. Tinh chỉnh khi cần thiết.

0

Các cầu thủ quan trọng về chia sẻ/sao chép một màn hình là một phần COM được gọi là: RPDViewer enter image description here

Thêm vào đó thành phần com mẫu cửa sổ của bạn và trong tài liệu tham khảo cũng .. và add mỏng mã này để tải biểu mẫu của bạn và bạn sẽ nhận được màn hình được sao chép trong biểu mẫu của bạn:

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(); 
     } 
    } 
} 
Các vấn đề liên quan