Простое приложение для совместного использования экрана С#
Я хочу создать очень базовое приложение для совместного использования экрана на С#. Не требуется пульт дистанционного управления. Я просто хочу, чтобы пользователь мог транслировать свой экран на веб-сервер.
Как мне это реализовать? (Любой указатель в правильном направлении будет с благодарностью).
НЕ нужно быть высоким 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
Ну, это может быть так же просто, как сделать скриншоты, сжать их, а затем отправить их по проводу. Однако есть уже существующее программное обеспечение, которое уже делает это. Это для практики?
Ответ 4
Я хочу сделать что-то подобное, и я только что нашел это в CodeProject. Я думаю, это поможет вам.
http://www.codeproject.com/Articles/371955/Motion-JPEG-Streaming-Server
Ответ 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();
}
}
}