2010-07-20 11 views
11

मैं सी # में एक बहुत ही बुनियादी स्क्रीन साझा करने का आवेदन करना चाहता हूं। कोई रिमोट कंट्रोल आवश्यक नहीं है। मैं बस एक उपयोगकर्ता को अपनी स्क्रीन को वेबसर्वर पर प्रसारित करने में सक्षम होना चाहता हूं।सरल सी # स्क्रीन साझाकरण अनुप्रयोग

मुझे इसे कैसे कार्यान्वित करना चाहिए? (सही दिशा में किसी भी सूचक की सराहना की जाएगी)।

इसे उच्च एफपीएस होने की आवश्यकता नहीं है। कभी भी 5s या तो अपडेट करने के लिए पर्याप्त होगा। क्या आपको लगता है कि मेरे वेब सर्वर पर कभी भी 5 सेकंड स्क्रीनशॉट अपलोड करना पर्याप्त होगा?

+4

मैं "सरल" कहूंगा नहीं। –

+0

हाँ आप कॉल कर सकते हैं :) –

उत्तर

11

मैंने पहले how remote screen sharing software works here पर ब्लॉग किया था, यह सी # के लिए विशिष्ट नहीं है लेकिन यह विषय पर एक अच्छी मौलिक समझ देता है। उस आलेख में भी लिंक किया गया रिमोट फ्रेम बफर स्पेक है जिसे आप शायद पढ़ना भी चाहेंगे।

असल में आप स्क्रीनशॉट लेना चाहते हैं और आप उन स्क्रीनशॉट को प्रेषित कर सकते हैं और उन्हें दूसरी तरफ प्रदर्शित कर सकते हैं। आप अंतिम स्क्रीनशॉट रख सकते हैं और स्क्रीनशॉट की तुलना ब्लॉकों में कर सकते हैं यह देखने के लिए कि आपको कौन से स्क्रीनशॉट भेजने की आवश्यकता है। डेटा भेजने से पहले आप आमतौर पर कुछ प्रकार के संपीड़न करेंगे।

रिमोट कंट्रोल के लिए आप माउस आंदोलन को ट्रैक कर सकते हैं और इसे प्रेषित कर सकते हैं और दूसरी तरफ पॉइंटर स्थिति सेट कर सकते हैं। Keystrokes के बारे में भी ditto।

जहां तक ​​संपीड़न सी # में जाता है, आप बस अपनी गुणवत्ता के साथ जेपीईजी संपीड़न के साथ अपने स्क्रीनशॉट बनाने के लिए JpegBitmapEncoder का उपयोग कर सकते हैं।

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

फ़ाइल ब्लॉक आप शायद पुराने ब्लॉक और नए एक पर एक हैश बनाने के लिए, और उसके बाद अगर वे एक ही कर रहे हैं देखने के लिए जाँच के लिए सबसे अच्छा कर रहे हैं की तुलना करने के। आप किसी भी hashing algorithm का उपयोग कर सकते हैं जो आप चाहते हैं।

+0

बहुत बढ़िया!स्क्रीनशॉट की तुलना करने के लिए मुझे क्या देखना चाहिए, और मैं किस तरह का संपीड़न देख रहा हूं? –

+0

@ user396077: मेरा संपादन देखें। –

1

ठीक है, यह स्क्रीनशॉट लेने, उन्हें संपीड़ित करने और फिर तार पर भेजने के रूप में सरल हो सकता है। हालांकि, मौजूदा सॉफ्टवेयर है जो पहले से ही ऐसा करता है। क्या यह अभ्यास के लिए है?

2

यहाँ एक स्क्रीनशॉट, एक बिटमैप के रूप में असम्पीडित लेने के लिए कोड है:

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

अब बस यह सेक और तार पर भेज सकते हैं और आपका काम हो गया।

यह कोड एक स्क्रीन में एक मल्टीस्क्रीन सेटअप में सभी स्क्रीन को जोड़ता है। जरूरत के रूप में चिमटा।

0

मैं कुछ ऐसा करने की तलाश में हूं, और मुझे इसे कोडप्रोजेक्ट पर मिला है। मुझे लगता है कि यह आपकी मदद करेगा। .. RPDViewer enter image description here

अपने विंडो फार्म के लिए और संदर्भ में भी है कि कॉम घटक जोड़े और पतली ऐड:

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

0

साझा करने पर प्रमुख खिलाड़ी/एक स्क्रीन नकल एक COM घटक कहा जाता है आपके प्रपत्र लोड करने के लिए इस कोड को और आप स्क्रीन अपने प्रपत्र में दोहराया जाएगा:

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

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^