15

C#で非常に基本的な画面共有アプリケーションを作成したいと考えています。リモコンは必要ありません。ユーザーが自分の画面をWebサーバーにブロードキャストできるようにしたいだけです。

これをどのように実装すればよいですか?(正しい方向へのポインタは大歓迎です)。

高FPSである必要はありません。5秒程度でさえ更新するのに十分でしょう。スクリーンショットを5秒ごとに私のWebサーバーにアップロードするだけで十分だと思いますか?

4

5 に答える 5

18

以前、ここでリモート画面共有ソフトウェアがどのように機能するかについてブログを書きました。これはC#に固有のものではありませんが、このトピックに関する基本的な理解を深めることができます。また、その記事にリンクされているのは、おそらく読みたいリモートフレームバッファの仕様です。

基本的にはスクリーンショットを撮りたいと思うでしょう、そしてあなたはそれらのスクリーンショットを送信して反対側にそれらを表示することができます。最後のスクリーンショットを保持し、スクリーンショットをブロック単位で比較して、スクリーンショットのどのブロックを送信する必要があるかを確認できます。通常、データを送信する前に、ある種の圧縮を行います。

リモコンを使用するには、マウスの動きを追跡して送信し、もう一方の端にポインタの位置を設定します。キーストロークについても同じです。

圧縮がC#で行われる限り、JpegBitmapEncoderを使用するだけで、必要な品質のJpeg圧縮でスクリーンショットを作成できます。

JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.QualityLevel = 40; 

ファイルブロックを比較するには、古いブロックと新しいブロックにハッシュを作成してから、それらが同じであるかどうかを確認するのがおそらく最善です。これには、任意のハッシュアルゴリズムを使用できます。

于 2010-07-20T23:58:37.240 に答える
3

次に、ビットマップとして非圧縮のスクリーンショットを撮るコードを示します。

    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つの画像に結合します。必要に応じて微調整します。

于 2010-07-21T00:09:09.790 に答える
2

それは、スクリーンショットを撮り、それらを圧縮してから、ネットワーク経由で送信するのと同じくらい簡単です。ただし、すでにこれを行っている既存のソフトウェアがあります。これは練習用ですか?

于 2010-07-20T23:59:17.573 に答える
2

私は似たようなことをしたいと思っていますが、CodeProjectでこれを見つけました。これはあなたを助けると思います。

http://www.codeproject.com/Articles/371955/Motion-JPEG-Streaming-Server

于 2013-01-21T15:55:04.360 に答える
1

画面の共有/複製の主要なプレーヤーは、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();
        }
    }
}
于 2017-04-14T20:51:46.663 に答える