Простой 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
добавьте этот com-компонент в форму окна и в ссылки.. и тонкий добавьте этот код к загрузке формы, и вы получите экран, реплицированный в вашей форме:
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();
}
}
}