15

アプリケーションでデスクトップの縮小スクリーンショットをユーザーに提供したいと考えています。

現在のユーザーの Windows デスクトップのスクリーンショットを撮る方法はありますか?

私は C# で書いていますが、別の言語でより良い解決策があれば、それを受け入れます。

明確にするために、Windows デスクトップのスクリーンショットが必要です。これは壁紙とアイコンのみです。アプリケーションやフォーカスのあるものはありません。

4

5 に答える 5

16

Graphics.CopyFromScreenを探しています。適切なサイズの新しい Bitmap を作成し、コピーする領域の Bitmap の Graphics オブジェクト画面座標を渡します。

プログラムでスナップショットを作成する方法を説明した記事もあります。

編集への対応: 「デスクトップ」の意味を誤解していました。デスクトップの写真を撮りたい場合は、次のことを行う必要があります。

  1. 最初に Win32API (MIN_ALLメッセージの送信)を使用してすべてのウィンドウを最小化します。
  2. スナップショットを撮る
  3. 次に、すべての最小化を元に戻します (MIN_ALL_UNDOメッセージを送信します)。

これを行うためのより良い方法は、他のウィンドウを妨害するのではなく、デスクトップ ウィンドウから画像を直接コピーすることです。User32 の GetDesktopWindowはデスクトップへのハンドルを返します。ウィンドウ ハンドルを取得したら、そのデバイス コンテキストを取得し、イメージを新しいビットマップにコピーします。

そこから画像をコピーする方法のCodeProject の優れた例があります。「ウィンドウ コンテンツのキャプチャ」セクションで、デバイス コンテキストの取得と作成に関するサンプル コードを探します。

于 2009-05-19T03:52:30.860 に答える
10

実際のデスクトップ (壁紙とアイコンを含む) の写真を撮るためだけに撮影しているような印象を受けます。

1) COM を使用して Shell32 で ToggleDesktop() を呼び出す
2) Graphics.CopyFromScreen を使用して現在のデスクトップ領域をコピーする
3) ToggleDesktop() を呼び出して以前のデスクトップ状態を復元する

編集:はい、MinimizeAll() の呼び出しは好戦的です。

ここに私が一緒にホイップした更新版があります:

    /// <summary>
    /// Minimizes all running applications and captures desktop as image
    /// Note: Requires reference to "Microsoft Shell Controls and Automation"
    /// </summary>
    /// <returns>Image of desktop</returns>
    private Image CaptureDesktopImage() {

        //May want to play around with the delay.
        TimeSpan ToggleDesktopDelay = new TimeSpan(0, 0, 0, 0, 150);

        Shell32.ShellClass ShellReference = null;

        Bitmap WorkingImage = null;
        Graphics WorkingGraphics = null;
        Rectangle TargetArea = Screen.PrimaryScreen.WorkingArea;
        Image ReturnImage = null;

        try
        {

            ShellReference = new Shell32.ShellClass();
            ShellReference.ToggleDesktop();

            System.Threading.Thread.Sleep(ToggleDesktopDelay);

            WorkingImage = new Bitmap(TargetArea.Width,
                TargetArea.Height);

            WorkingGraphics = Graphics.FromImage(WorkingImage);
            WorkingGraphics.CopyFromScreen(TargetArea.X, TargetArea.X, 0, 0, TargetArea.Size);

            System.Threading.Thread.Sleep(ToggleDesktopDelay);
            ShellReference.ToggleDesktop();

            ReturnImage = (Image)WorkingImage.Clone();

        }
        catch
        {
            System.Diagnostics.Debugger.Break();
            //...
        }
        finally
        {
            WorkingGraphics.Dispose();
            WorkingImage.Dispose();
        }

        return ReturnImage;

    }

複数のモニターのシナリオの好みに合わせて調整します (ただし、これはアプリケーションで問題なく機能するはずです)。

于 2009-05-19T04:12:06.597 に答える
2

p / invokeを介してGetDesktopWindowを使用することを検討してから、デバイスコンテキストを取得し、スナップショットを取得することができます。ここに非常に詳細なチュートリアルがあります。既存のウィンドウを混乱させるよりも良いかもしれません。

于 2009-05-19T04:28:15.263 に答える
0

アプリケーションが実行される前、またはデスクトップ切り替えを使用して他のデスクトップを使用する前に、Windows の起動時にいつでもスクリーンショットをキャプチャできます。ここを見てください: http://www.codeproject.com/Articles/7666/Desktop-Switching 他のデスクトップに切り替え、写真を撮り、「デスクトップ」を作成するだけで表示する必要がないことを覚えておいてください

于 2012-09-26T07:45:24.260 に答える
-2

以前の答えはすべて完全に間違っています(アプリを最小化するのはばかげています)
単純にSHW APIを使用します:1行のコード(デスクトップビットマップがキャッシュされ、APIは単にそれをHDCにブリットします...)

于 2009-05-20T14:31:55.330 に答える