简单的C#屏幕共享应用程序

时间:2010-07-20 23:56:07

标签: c# desktop screen sharing

我希望在C#中创建一个非常基本的屏幕共享应用程序。无需遥控器。我只是希望用户能够将他们的屏幕广播到网络服务器。

我该如何实现? (非常感谢任何指向正确方向的指针)。

它不需要高FPS。足以甚至更新5s左右。您是否认为仅将屏幕截图上传5秒钟到我的网络服务器就足够了?

5 个答案:

答案 0 :(得分:13)

我之前在博客上发表了关于how remote screen sharing software works here的文章,它不是特定于C#,但它对该主题提供了很好的基本理解。在该文章中还链接了远程帧缓冲区规范,您可能也想要阅读它。

基本上,您需要截取屏幕截图,然后您可以传输这些屏幕截图并在另一侧显示。您可以保留最后一个屏幕截图并比较块中的屏幕截图,以查看您需要发送的屏幕截图块。在发送数据之前,您通常会进行某种压缩。

要进行遥控,您可以跟踪鼠标移动并传输它,并在另一端设置指针位置。关于击键也是如此。

就C#中的压缩而言,您可以使用JpegBitmapEncoder创建具有所需质量的Jpeg压缩截图。

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

要比较文件块,最好在旧块和新块上创建一个哈希值,然后检查它们是否相同。你可以使用你想要的任何hashing algorithm

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

现在只需压缩它并通过电线发送,就完成了。

此代码将多屏幕设置中的所有屏幕合并为一个图像。根据需要调整。

答案 2 :(得分:1)

嗯,它可以像截取屏幕截图,压缩屏幕截图,然后通过网络发送一样简单。但是,现有的软件已经做到了这一点。这是为了练习吗?

答案 3 :(得分:0)

我正在寻找类似的东西,我刚刚在CodeProject上发现了这一点。我想这会对你有帮助。

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

答案 4 :(得分:0)

共享/复制屏幕的关键人物是名为RPDViewer的COM组件 enter image description here

将该com组件添加到窗口表单和References中。 并且将此代码添加到表单加载中,您将在表单中复制屏幕:

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