简单的C#屏幕共享应用程序

我期待在C#中创建一个非常基本的屏幕共享应用程序。 无需遥控器。 我只是希望用户能够将他们的屏幕广播到网络服务器。

我该如何实现呢? (非常感谢任何指向正确方向的指针)。

它不需要高FPS。 足以甚至更新5s左右。 您认为只需将屏幕截图上传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

共享/复制屏幕的关键角色是名为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(); } } }