C#で非常に基本的な画面共有アプリケーションを作成したいと考えています。リモコンは必要ありません。ユーザーが自分の画面をWebサーバーにブロードキャストできるようにしたいだけです。
これをどのように実装すればよいですか? (正しい方向へのポインタは大歓迎です)。
高FPSである必要はありません。 5秒程度を更新するのに十分でしょう。スクリーンショットを5秒ごとに私のWebサーバーにアップロードするだけで十分だと思いますか?
私は以前に リモート画面共有ソフトウェアがここでどのように機能するか についてブログを書きました。これは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;
}
これで、圧縮してネットワーク経由で送信するだけで完了です。
このコードは、マルチスクリーン設定のすべての画面を1つの画像に結合します。必要に応じて微調整します。
スクリーンショットを撮り、圧縮してから、ネットワーク経由で送信するのと同じくらい簡単です。ただし、すでにこれを行っている既存のソフトウェアがあります。これは練習用ですか?
私は似たようなことをしたいと思っていますが、CodeProjectでこれを見つけました。これはあなたを助けると思います。
http://www.codeproject.com/Articles/371955/Motion-JPEG-Streaming-Server
画面の共有/複製の主要なプレーヤーは、RPDViewerと呼ばれるCOMコンポーネントです
その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();
}
}
}