title: Use MediaCapture on a Windows 8 desktop app
body: <p>On a Windows 8 desktop app, I need to take a photo using the camera in C# 4.5.</p>
  
  <p>I've tried to use the CameraCaptureUI class, but it is not available on a desktop app.</p>
  
  <p>So I try to use the MediaCapture class, which is available for Metro app or desktop app. It works great, based on the example found here : <a href="http://code.msdn.microsoft.com/windowsapps/media-capture-sample-adf87622/" rel="noreferrer">http://code.msdn.microsoft.com/windowsapps/media-capture-sample-adf87622/</a></p>
  
  <pre><code>var capture = new MediaCapture();
  // Find the camera device id to use
  string deviceId = "";
  var devices = await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(Windows.Devices.Enumeration.DeviceClass.VideoCapture);
  for (var i = 0; i &lt; devices.Count; i++) {
       Console.WriteLine(devices[i]);
       deviceId = devices[i].Id;
  }
  
  // init the settings of the capture
  var settings = new MediaCaptureInitializationSettings();
  settings.AudioDeviceId = "";
  settings.VideoDeviceId = deviceId;
  settings.PhotoCaptureSource = Windows.Media.Capture.PhotoCaptureSource.Photo;
  settings.StreamingCaptureMode = Windows.Media.Capture.StreamingCaptureMode.Video;
  await capture.InitializeAsync(settings);
  
  // Find the highest resolution available
  VideoEncodingProperties resolutionMax = null;
  int max = 0;
  var resolutions = capture.VideoDeviceController.GetAvailableMediaStreamProperties(MediaStreamType.Photo);
  for (var i = 0; i &lt; resolutions.Count; i++) {
       VideoEncodingProperties res = (VideoEncodingProperties)resolutions[i];
       Console.WriteLine("resolution : " + res.Width + "x" + res.Height);
       if (res.Width * res.Height &gt; max) {
            max = (int)(res.Width * res.Height);
            resolutionMax = res;
       }
  }
  await capture.VideoDeviceController.SetMediaStreamPropertiesAsync(MediaStreamType.Photo, resolutionMax);
  
  ImageEncodingProperties imageProperties = ImageEncodingProperties.CreateJpeg();
  var fPhotoStream = new InMemoryRandomAccessStream();
  
  // THE 2 LINES I NEED TO ADD
  // captureElement.Source = capture;
  // await capture.StartPreviewAsync();
  
  // Take the photo and show it on the screen
  await capture.CapturePhotoToStreamAsync(imageProperties, fPhotoStream);
  await fPhotoStream.FlushAsync();
  fPhotoStream.Seek(0);
  
  byte[] bytes = new byte[fPhotoStream.Size];
  await fPhotoStream.ReadAsync(bytes.AsBuffer(), (uint)fPhotoStream.Size, InputStreamOptions.None);
  
  BitmapImage bitmapImage = new BitmapImage();
  MemoryStream byteStream = new MemoryStream(bytes);
  bitmapImage.BeginInit();
  bitmapImage.StreamSource = byteStream;
  bitmapImage.EndInit();
  image.Source = bitmapImage;
  </code></pre>
  
  <p>I can take a photo using the camera, but I'm unable to show a preview before taking the photo.
  To be able to show the preview, I have to use the component CaptureElement, for example with the following code :</p>
  
  <pre><code>captureElement.Source = mediaCapture;
  await mediaCapture.startPreviewAsync();
  </code></pre>
  
  <p>Unfortunately, I cannot use a CaptureElement on a non store app.
  Is there another component that I can use in a WPF or WinForm app, to be able to show the preview of the camera ?</p>