2009-05-19 7 views
15

私は自分のアプリケーションのデスクトップの縮小されたスクリーンショットをユーザーに提供したいと考えています。ユーザーのWindowsデスクトップのスクリーンショットを取得する方法はありますか?

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

私はC#で書いていますが、他の言語ではより良い解決策があれば、私はそれを公開しています。

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

答えて

16

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

プログラムでスナップショットを取得する方法については、an articleもあります。

の編集に対する回答:「デスクトップ」の意味を誤解しています。あなたはデスクトップの写真を撮りたい場合は、する必要があります:

  1. Minimize all windows using the Win32APIMIN_ALLメッセージを送る)最初
  2. その後MIN_ALL_UNDOメッセージを送信する(すべて最小化を元に戻すスナップショット
  3. を取ります)。このを行うには

良い方法は、他のウィンドウを乱さないことだろうが、デスクトップ・ウィンドウから直接画像をコピーします。 GetDesktopWindow in User32は、デスクトップへのハンドルを返します。ウィンドウハンドルを取得したら、デバイスコンテキストを取得し、イメージを新しいビットマップにコピーします。

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

+1

私は自分のアプリケーションにフォーカスがある場合があることを行うことができます:ここを見てみましょうか?デスクトップの前にいる場合は、アプリケーションウィンドウ(および他のもの)をキャプチャしませんか? – Damovisa

+1

私は 'GetDesktopWindow'を試しましたが、デスクトップの前にあるウィンドウをキャプチャします –

+0

完全なソースコードサンプルを扱う最終的な解決策はどれですか? – Kiquenet

10

私はあなたが(壁紙とアイコンで)実際のデスクトップ、そして他には何の写真を撮るために撮影している印象を受けます。

1)現在のデスクトップ領域にコピーするCOM
2)使用Graphics.CopyFromScreenを使用してShell32はでコールToggleDesktop()
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; 

    } 

は、複数のモニタシナリオに味に調整します。

は、ここで私は一緒にホイップ更新されたバージョンです。

+0

すばらしい答え!ペーストされていない状態で必要なものを綴ります。私はより多くのSOの答えがこのようなものだったら幸いです。 –

+0

ありがとう、それはまさに私が後にしたものです。私は後で焦点を当てるためにアプリケーションを復元するために呼び出すことができるShell32にも同様のメソッドがあると仮定しています。 – Damovisa

+0

@Damovisa - 復元する必要があるのはアプリケーションだけではありません。ユーザーのためにすべてのアプリケーションを無作為に最小化するのは良い方法ではありません。 –

2

あなたは、デバイスコンテキストを取得し、あなたのスナップショットを取得、その後、P /呼び出してGetDesktopWindowを使用してで見えるかもしれません。非常に詳細なチュートリアルhereがあります。既存のウィンドウを混乱させるよりも良いかもしれません。

+0

+1優れたチュートリアルです。 –

0

すべての元の答えは完全に間違っている(最小限のアプリケーション不合理である)
は単にSHW APIを使用します。コードの一行(キャッシュされているデスクトップのビットマップ、APIは、単にあなたのHDCにそれをブリット...)

+2

"SHW api"に関するリンクや詳細情報はありますか?あなたが何を意味するのか分かりません... – Damovisa

0

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

関連する問題