Простое приложение для совместного использования экрана С#

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

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

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

Ответ 1

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

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

Чтобы иметь дистанционное управление, вы можете отслеживать движение мыши и передавать его и устанавливать позицию указателя на другом конце. Кроме того, о нажатиях клавиш.

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

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

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

Ответ 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;
    }

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

Этот код объединяет все экраны в многоэкранной настройке в одно изображение. При необходимости отрегулируйте.

Ответ 3

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

Ответ 5

Ключевым игроком при совместном использовании/репликации экрана является COM-компонент, называемый RPDViewer введите описание изображения здесь

Добавьте этот комком компонент в форму окна и в Ссылки. и тонкий добавьте этот код в свою форму, и вы получите экран, реплицированный в вашей форме:

введите описание изображения здесь

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