Простой c# экран приложений обмена

Я ищу, чтобы создать очень простое приложение для демонстрации экрана в C#. Нет необходимости в дистанционном управлении. Я просто хочу, чтобы пользователь мог транслировать свой экран на веб-сервер.

Как я должен это реализовать? (Любой указатель в правильном направлении будет очень признателен).

Он не должен быть высоким FPS. Было бы достаточно, чтобы даже не 5s или так. Как вы думаете, было бы достаточно просто загрузить скриншот когда-либо 5 секунд на мой веб сервер?

5 ответов


ранее я писал в блоге о как удаленный экран программное обеспечение работает здесь, это не специфично для C#, но это дает хорошее фундаментальное понимание по этой теме. Также в этой статье связана спецификация удаленного буфера кадров, которую вы также, вероятно, захотите прочитать.

в основном вы захотите сделать скриншоты, и вы можете передать эти скриншоты и отобразить их на другой стороне. Вы можете сохранить последний скриншот и сравнить скриншот в блоки, чтобы увидеть, какие блоки скриншота вам нужно отправить. Обычно перед отправкой данных вы выполняете какое-то сжатие.

для дистанционного управления вы можете отслеживать движение мыши и передавать его и устанавливать положение указателя на другом конце. Также Дитто о нажатий.

что касается сжатия в C#, вы можете просто использовать JpegBitmapEncoder чтобы создать скриншоты с сжатием Jpeg с качеством, которое вы хотеть.

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

чтобы сравнить блоки файлов, вам, вероятно, лучше всего создать хэш на старом блоке и Новом, а затем проверить, совпадают ли они. Вы можете использовать любой алгоритм хеширования вы хотите за это.


вот код, чтобы сделать снимок экрана, несжатый как растровое изображение:

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

теперь просто сожмите его и отправьте по проводу, и все готово.

этот код объединяет все экраны в многоэкранной настройке в одно изображение. Настройка по мере необходимости.


Ну, это может быть так же просто, как делать скриншоты, сжимать их, а затем отправлять их по проводу. Однако, существует программное обеспечение, которое уже делает это. Это для практики?


Я хочу сделать что-то подобное, и я только что нашел это на CodeProject. Думаю, это тебе поможет.

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


ключевым игроком при совместном использовании / репликации экрана является com-компонент под названием: RPDViewer enter image description here

добавьте этот 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();
        }
    }
}