我希望在C#中创建一个非常基本的屏幕共享应用程序。无需遥控器。我只是希望用户能够将他们的屏幕广播到网络服务器。
我该如何实现? (非常感谢任何指向正确方向的指针)。
它不需要高FPS。足以甚至更新5s左右。您是否认为仅将屏幕截图上传5秒钟到我的网络服务器就足够了?
答案 0 :(得分:13)
我之前在博客上发表了关于how remote screen sharing software works here的文章,它不是特定于C#,但它对该主题提供了很好的基本理解。在该文章中还链接了远程帧缓冲区规范,您可能也想要阅读它。
基本上,您需要截取屏幕截图,然后您可以传输这些屏幕截图并在另一侧显示。您可以保留最后一个屏幕截图并比较块中的屏幕截图,以查看您需要发送的屏幕截图块。在发送数据之前,您通常会进行某种压缩。
要进行遥控,您可以跟踪鼠标移动并传输它,并在另一端设置指针位置。关于击键也是如此。
就C#中的压缩而言,您可以使用JpegBitmapEncoder创建具有所需质量的Jpeg压缩截图。
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.QualityLevel = 40;
要比较文件块,最好在旧块和新块上创建一个哈希值,然后检查它们是否相同。你可以使用你想要的任何hashing algorithm。
答案 1 :(得分: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;
}
现在只需压缩它并通过电线发送,就完成了。
此代码将多屏幕设置中的所有屏幕合并为一个图像。根据需要调整。
答案 2 :(得分:1)
嗯,它可以像截取屏幕截图,压缩屏幕截图,然后通过网络发送一样简单。但是,现有的软件已经做到了这一点。这是为了练习吗?
答案 3 :(得分:0)
我正在寻找类似的东西,我刚刚在CodeProject上发现了这一点。我想这会对你有帮助。
http://www.codeproject.com/Articles/371955/Motion-JPEG-Streaming-Server
答案 4 :(得分:0)
共享/复制屏幕的关键人物是名为RPDViewer的COM组件
将该com组件添加到窗口表单和References中。 并且将此代码添加到表单加载中,您将在表单中复制屏幕:
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();
}
}
}