Простое приложение для обмена экрана C # - PullRequest
13 голосов
/ 21 июля 2010

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

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

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

Ответы [ 5 ]

13 голосов
/ 21 июля 2010

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

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

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

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

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

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

2 голосов
/ 21 июля 2010

Вот код для создания снимка экрана, распакованного в виде растрового изображения:

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

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

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

1 голос
/ 21 июля 2010

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

0 голосов
/ 14 апреля 2017

Ключевым игроком при совместном использовании / репликации экрана является COM-компонент под названием: RPDViewer 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();
        }
    }
}
0 голосов
/ 21 января 2013

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

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

...