11

状況: インターネット経由で画面共有を実行するソフトウェアを使用しています。この場合、1 人のユーザーがプレゼンターとして機能し、他のユーザーが視聴者/出席者として機能します。

プレゼンテーション ウィンドウの他に、プレゼンターには、画面に表示される非共有ウィンドウのセット (共有の開始/共有の停止などのボタン バー、Skype ウィンドウなど) もあります。

プレゼンターは、画面共有ソフトウェアのセットアップから、これらの非共有ウィンドウを非表示にするように構成できます (つまり、出席者に送信される画面共有には表示されませんが、その背後にあるウィンドウ コンテンツはスクリーンショットに表示されます)。 )。

スクリーンショットは、毎秒約 10 フレームまたはそれ以上の速度で送信されます。

質問: これらの NON-SHARING-WINDOWS ウィンドウを除いて、プログラムで画面をキャプチャするにはどうすればよいですか?

:

  • 1 秒あたりのフレーム数が高いため、ウィンドウがちらつくため、これらのウィンドウのアルファを最小化/最大化/設定することはできません。アプリケーションは Win32 C++ で書かれています。
  • レイヤード ウィンドウを使用しますが、Windows 7 のデスクトップ コンポジション機能のため、そのままでは使用できません (Windows 8 では、DwmEnableComposition を使用して一時的かつプログラム的にコンポジションを無効にすることはできなくなりました)。
  • Windows XP/2000/7 などにはレイヤード ウィンドウ アプローチを使用し、Windows 8 (存在する場合) には別のアプローチを使用できますが、すべてのシステムで動作する単一のプロセスを好みます。
  • 個々の画像 (デスクトップ、キャプチャする必要があるウィンドウ) をキャプチャし、z-index を使用して最終的な画像を作成することで、スクリーンショットを「作成」することもできますが、必要なフレーム/秒の値のためです。 、このプロセスは遅すぎます。
4

3 に答える 3

1

Windows では、デスクトップもウィンドウと見なされ、独自の HWND があります。ただし、「壁紙」を単独でコピーすることは容易ではないようです。

したがって、基本的には2つの方法があります。1. デスクトップ全体をコピーします。例: BitBlt(GetWindowDC(GetDesktopWindow()),...)

また

  1. GetWindow次のように、GetDesktopWindow() で決定できる HWND を持つデスクトップ ウィンドウから開始して、ウィンドウ リストを逆方向に 使用およびトラバースします。

    // paint on a black DC hwnd=GetDesktopWindow() while (hwnd = GetWindow(hwnd, GW_HWNDPREV)) { // is this window not shared? continue // else bitblt it into our dc }

インスピレーションを与えてくれることを願っています:-) 誰かが子ウィンドウなしでデスクトップのみをコピーする方法を知っているなら、私に知らせてください.

于 2016-02-19T08:31:41.950 に答える
-1

大きなウィンドウ内でキャプチャ コンテンツを制限する方が簡単だと思います。そうしないと、スクリーン キャプチャからいくつかのウィンドウを切り取る必要があります。

于 2012-05-04T19:40:14.420 に答える