我期待在C#中創建一個非常基本的屏幕共享應用程序。不需要遙控器。我只想讓用戶能夠將他們的屏幕廣播到網絡服務器。簡單的C#屏幕共享應用程序
我該如何實施? (任何指針在正確的方向將不勝感激)。
它不需要高FPS。足以甚至更新5秒左右。你認爲只要將截圖5秒鐘上傳到我的Web服務器就足夠了嗎?
我期待在C#中創建一個非常基本的屏幕共享應用程序。不需要遙控器。我只想讓用戶能夠將他們的屏幕廣播到網絡服務器。簡單的C#屏幕共享應用程序
我該如何實施? (任何指針在正確的方向將不勝感激)。
它不需要高FPS。足以甚至更新5秒左右。你認爲只要將截圖5秒鐘上傳到我的Web服務器就足夠了嗎?
我以前在博客上寫過關於how remote screen sharing software works here的文章,它並不特定於C#,但它對這個主題有了很好的基本理解。該文章中還鏈接了遠程幀緩衝區規範,您可能還需要閱讀它。
基本上你會想要截圖,你可以傳輸這些截圖並在另一邊顯示它們。您可以保留最後的屏幕截圖,並以塊的形式比較屏幕截圖,以查看您需要發送哪些屏幕截圖。在發送數據之前,您通常會進行某種壓縮。
要有遙控器,您可以跟蹤鼠標移動並傳輸它,並在另一端設置指針位置。還有關於擊鍵的內容。只要使用C#進行壓縮,您就可以簡單地使用JpegBitmapEncoder以您想要的質量創建帶有Jpeg壓縮的屏幕截圖。
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.QualityLevel = 40;
要比較文件塊,您可能最好在舊塊和新塊上創建一個散列,然後檢查它們是否相同。你可以使用任何你想要的hashing algorithm。
太棒了!我應該查看哪些內容來比較屏幕截圖以及我將要查看的壓縮類型? – 2010-07-21 00:19:51
@ user396077:查看我的編輯。 – 2010-07-21 00:28:29
嗯,它可以像截圖一樣簡單,壓縮它們,然後通過電線發送它們。但是,現有的軟件已經這樣做了。這是爲了練習嗎?
這裏的代碼進行屏幕截圖,解壓縮爲位圖:
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();
}
}
}
不是我所說的「簡單」。 – 2010-07-21 00:00:43
是的,你可以打電話:) – 2016-05-30 20:15:58