public IRandomAccessStream CloneStream() { var cloned = new MemoryRandomAccessStream(); CopyTo(cloned); return(cloned); }
/// <summary> /// Share the surface by using the Share-UI of Windows 10 /// </summary> /// <param name="shareInfo">ShareInfo</param> /// <param name="handle">IntPtr with the handle for the hosting window</param> /// <param name="surface">ISurface with the bitmap to share</param> /// <param name="captureDetails">ICaptureDetails</param> /// <returns>Task with string, which describes the application which was used to share with</returns> private async Task Share(ShareInfo shareInfo, IntPtr handle, ISurface surface, ICaptureDetails captureDetails) { using (var imageStream = new MemoryRandomAccessStream()) using (var logoStream = new MemoryRandomAccessStream()) using (var thumbnailStream = new MemoryRandomAccessStream()) { var outputSettings = new SurfaceOutputSettings(); outputSettings.PreventGreenshotFormat(); // Create capture for export ImageOutput.SaveToStream(surface, imageStream, outputSettings); imageStream.Position = 0; Log.Debug().WriteLine("Created RandomAccessStreamReference for the image"); var imageRandomAccessStreamReference = RandomAccessStreamReference.CreateFromStream(imageStream); // Create thumbnail RandomAccessStreamReference thumbnailRandomAccessStreamReference; using (var tmpImageForThumbnail = surface.GetBitmapForExport()) using (var thumbnail = tmpImageForThumbnail.CreateThumbnail(240, 160)) { ImageOutput.SaveToStream(thumbnail, null, thumbnailStream, outputSettings); thumbnailStream.Position = 0; thumbnailRandomAccessStreamReference = RandomAccessStreamReference.CreateFromStream(thumbnailStream); Log.Debug().WriteLine("Created RandomAccessStreamReference for the thumbnail"); } // Create logo RandomAccessStreamReference logoRandomAccessStreamReference; using (var logo = GreenshotResources.GetGreenshotIcon().ToBitmap()) using (var logoThumbnail = logo.CreateThumbnail(30, 30)) { ImageOutput.SaveToStream(logoThumbnail, null, logoStream, outputSettings); logoStream.Position = 0; logoRandomAccessStreamReference = RandomAccessStreamReference.CreateFromStream(logoStream); Log.Info().WriteLine("Created RandomAccessStreamReference for the logo"); } var dataTransferManagerHelper = new DataTransferManagerHelper(handle); dataTransferManagerHelper.DataTransferManager.ShareProvidersRequested += (sender, args) => { shareInfo.AreShareProvidersRequested = true; Log.Debug().WriteLine("Share providers requested: {0}", string.Join(",", args.Providers.Select(p => p.Title))); }; dataTransferManagerHelper.DataTransferManager.TargetApplicationChosen += (dtm, args) => { shareInfo.ApplicationName = args.ApplicationName; Log.Debug().WriteLine("TargetApplicationChosen: {0}", args.ApplicationName); }; var filename = FilenameHelper.GetFilename(OutputFormats.png, captureDetails); var storageFile = await StorageFile.CreateStreamedFileAsync(filename, async streamedFileDataRequest => { shareInfo.IsDeferredFileCreated = true; // Information on the "how" was found here: https://socialeboladev.wordpress.com/2013/03/15/how-to-use-createstreamedfileasync/ Log.Debug().WriteLine("Creating deferred file {0}", filename); try { using (var deferredStream = streamedFileDataRequest.AsStreamForWrite()) { await imageStream.CopyToAsync(deferredStream).ConfigureAwait(false); await imageStream.FlushAsync().ConfigureAwait(false); } // Signal that the stream is ready streamedFileDataRequest.Dispose(); } catch (Exception) { streamedFileDataRequest.FailAndClose(StreamedFileFailureMode.Incomplete); } }, imageRandomAccessStreamReference).AsTask().ConfigureAwait(false); dataTransferManagerHelper.DataTransferManager.DataRequested += (dataTransferManager, dataRequestedEventArgs) => { var deferral = dataRequestedEventArgs.Request.GetDeferral(); try { shareInfo.IsDataRequested = true; Log.Debug().WriteLine("DataRequested with operation {0}", dataRequestedEventArgs.Request.Data.RequestedOperation); var dataPackage = dataRequestedEventArgs.Request.Data; dataPackage.OperationCompleted += (dp, eventArgs) => { Log.Debug().WriteLine("OperationCompleted: {0}, shared with", eventArgs.Operation); shareInfo.CompletedWithOperation = eventArgs.Operation; shareInfo.AcceptedFormat = eventArgs.AcceptedFormatId; shareInfo.ShareTask.TrySetResult(true); }; dataPackage.Destroyed += (dp, o) => { shareInfo.IsDestroyed = true; Log.Debug().WriteLine("Destroyed"); shareInfo.ShareTask.TrySetResult(true); }; dataPackage.ShareCompleted += (dp, shareCompletedEventArgs) => { shareInfo.IsShareCompleted = true; Log.Debug().WriteLine("ShareCompleted"); shareInfo.ShareTask.TrySetResult(true); }; dataPackage.Properties.Title = captureDetails.Title; dataPackage.Properties.ApplicationName = "Greenshot"; dataPackage.Properties.Description = "Share a screenshot"; dataPackage.Properties.Thumbnail = thumbnailRandomAccessStreamReference; dataPackage.Properties.Square30x30Logo = logoRandomAccessStreamReference; dataPackage.Properties.LogoBackgroundColor = Color.FromArgb(0xff, 0x3d, 0x3d, 0x3d); dataPackage.SetStorageItems(new[] { storageFile }); dataPackage.SetBitmap(imageRandomAccessStreamReference); } finally { deferral.Complete(); Log.Debug().WriteLine("Called deferral.Complete()"); } }; dataTransferManagerHelper.ShowShareUi(); Log.Debug().WriteLine("ShowShareUi finished."); await shareInfo.ShareTask.Task.ConfigureAwait(false); } }