title: WPF: Way to take screenshots
body: <p>Looking to modify the following to take a screenshot off all monitors. I have tried adapting it but my images are blank. Writing it to test.png is for testing. The <code>byte[]</code> will be sent to the receiving app.</p>
  
  <pre><code>public byte[] Take()
  {
      int screenWidth = Convert.ToInt32(SystemParameters.VirtualScreenWidth);
      int screenHeight = Convert.ToInt32(SystemParameters.VirtualScreenHeight);
      int screenLeft = Convert.ToInt32(SystemParameters.VirtualScreenLeft);
      int screenTop = Convert.ToInt32(SystemParameters.VirtualScreenTop);
  
      RenderTargetBitmap renderTarget = new RenderTargetBitmap(screenWidth, screenHeight, 96, 96, PixelFormats.Pbgra32);
      VisualBrush sourceBrush = new VisualBrush();
  
      DrawingVisual drawingVisual = new DrawingVisual();
      DrawingContext drawingContext = drawingVisual.RenderOpen();
  
      using (drawingContext)
      {
          drawingContext.PushTransform(new ScaleTransform(1, 1));
          drawingContext.DrawRectangle(sourceBrush, null, new Rect(new Point(0, 0), new Point(screenWidth, screenHeight)));
      }
      renderTarget.Render(drawingVisual);
  
      PngBitmapEncoder pngEncoder = new PngBitmapEncoder();
      pngEncoder.Frames.Add(BitmapFrame.Create(renderTarget));
  
      Byte[] _imageArray;
  
      using (MemoryStream outputStream = new MemoryStream())
      {
          pngEncoder.Save(outputStream);
          _imageArray = outputStream.ToArray();
      }
  
      using (FileStream stream = new FileStream(@"c:\test.png", FileMode.Create, FileAccess.ReadWrite))
      {
          using (BinaryWriter writer = new BinaryWriter(stream))
          {
              writer.Write(_imageArray);
          }
      }
  
      return _imageArray;
  }
  </code></pre>