6

C++画面のすべてのピクセルの色の値を取得してファイルにダンプできるRDP クライアントを実装したいと思います。これが RDP の動作とは概念的に異なることはわかっていますが、アプリケーションには必要です。freerdpを利用しようとしていますが、ファイル内のすべてのピクセルを単純にダンプするクライアントを効率的に作成する方法がわかりません。

これまでのところ、私の最善の試みは関数を利用することですgdi_GetPixel_32bppが、もちろん、この関数をピクセルごとに順番に呼び出すことは効率的ではありません。

別のライブラリを利用するソリューションも大歓迎です。

4

4 に答える 4

2

これは、libfreerdp-gdi を使用して非常に効率的な方法で簡単に実行できるはずです。FreeRDP はすべてをソフトウェア バッファにレンダリングし、それをファイルにダンプできます。必要に応じて、X11 環境なしで、これを完全にメモリ内で行うことができます。Linux が言及されているため、開始するための簡単な方法の 1 つは、/gdi:sw オプションを指定して xfreerdp を使用し、libfreerdp-gdi を使用して (デフォルトでは X11 ベースの実装を使用することです)、ピクセルを更新としてダンプすることです。更新の配列の最後で呼び出される xf_sw_end_paint に自分自身をフックできます。無効な領域とピクセル バッファー (すべて rdpGdi* gdi 構造の下) にアクセスできます。重要なフィールドは、gdi->primary_buffer、gdi->dstBpp、gdi->bytesPerPixel、gdi->width、および gdi->height です。ほとんどの場合、XRGB32 バッファを取得します。これは扱いやすいです。疑わしい場合は、内部バッファーの初期化について gdi_init() を見てください。

于 2014-03-25T19:05:40.503 に答える
1

これを試すことができます(免責事項、テストされていない疑似コード):

HGDI_DC memDC = gdi_CreateCompatibleDC ( hDC );
HGDI_BITMAP memBM = gdi_CreateCompatibleBitmap ( hDC, screenWidth, screenHeight );
gdi_SelectObject ( memDC, memBM );
gdi_BitBlt(memDC, 0, 0, screenWidth, screenHeight, hDC, 0, 0, GDI_SRCCOPY);

これでmemBM->data、ピクセル データの完全な配列が得られます。memBM->data のサイズは次のとおりです。memBM->width * memBM->height * memBM->bytesPerPixel

これが少なくともいくらか役立つことを願っています。

于 2014-01-06T14:58:03.453 に答える
0

WebRTC には、スクリーン キャプチャーウィンドウ キャプチャーなど、参照できるコードが含まれている場合があります。

デスクトップ キャプチャーは、(1) 最小限のコンテンツをキャプチャーするために差分を取り、(2) マウスもキャプチャーするため、より複雑です。デスクトップは、 で取得した特別な「ウィンドウ」に過ぎず、::GetDesktopWindow()そのDCウィンドウまたは だけで取得GetDC(NULL)できるため、ウィンドウ キャプチャーを使用して、より複雑なビットを無視できます。詳細については、ウィンドウ キャプチャーのキャプチャー機能を確認してください。また、Aero やその他の合成/オフスクリーンの問題の処理に関する役立つヒントもいくつかあります。

于 2014-01-07T04:37:41.380 に答える
0

VNC X サーバーを実行し、その中で RDP クライアントをフルスクリーンで起動する場合 (ウィンドウ マネージャーなどを使用せずに)、描画シーケンスは次のようになります。

  1. RDP クライアントがリモート セッションから更新を受信する
  2. RDP クライアントは更新を X11 メッセージに変換し、共有メモリ トランスポート経由で送信される可能性が高い
  3. VNC サーバーは X11 リクエストを受信し、それらを使用してビットマップをレンダリングします

したがって、オーバーヘッドは X11 プロトコルだけにする必要があります。これは確かに扱いにくいですが、少なくとも共有メモリ セグメントを介して送信する必要があります。

正直なところ、最初にこのゼロ コーディング アプローチを試して、パフォーマンスが本当に問題になるかどうかを確認します。

于 2014-01-06T15:02:36.267 に答える