private void ShowShareUI(string text) { IntPtr hwnd = this.Handle; DataTransferManagerHelper.ShowShareUIForWindow(hwnd); _text = text; }
private void ShowShareUI(string text) { IntPtr hwnd = new WindowInteropHelper(Application.Current.MainWindow).Handle; DataTransferManagerHelper.ShowShareUIForWindow(hwnd); _text = text; }
public Task RequestAsync(ShareTextRequest request) { var winuiApp = (UI.Xaml.Window)MauiWinUIApplication.Current.Application.Windows[0].Handler !.NativeView !; var windowsHandle = winuiApp.GetNativeWindowHandle(); var dataTransferManager = DataTransferManagerHelper.GetDataTransferManager(windowsHandle); dataTransferManager.DataRequested += ShareTextHandler; DataTransferManagerHelper.ShowShare(windowsHandle); void ShareTextHandler(DataTransferManager sender, DataRequestedEventArgs e) { var newRequest = e.Request; newRequest.Data.Properties.Title = request.Title ?? AppInfo.Name; if (!string.IsNullOrWhiteSpace(request.Text)) { newRequest.Data.SetText(request.Text); } if (!string.IsNullOrWhiteSpace(request.Uri)) { newRequest.Data.SetWebLink(new Uri(request.Uri)); } dataTransferManager.DataRequested -= ShareTextHandler; } return(Task.CompletedTask); }
private void MainWindow_Loaded(object sender, RoutedEventArgs e) { //Using WinRT DataTransferManager in Win32 IntPtr hwnd = new WindowInteropHelper(Application.Current.MainWindow).Handle; var dtm = DataTransferManagerHelper.GetForWindow(hwnd); dtm.DataRequested += OnDataRequested; UWPApplication.App.ShowShareUIForWindow += ShowShareUI; //Detect Orientation Microsoft.Win32.SystemEvents.DisplaySettingsChanged += SystemEvents_DisplaySettingsChanged; }
private void MainForm_Load(object sender, EventArgs e) { //Using WinRT DataTransferManager in Win32 IntPtr hwnd = this.Handle; var dtm = DataTransferManagerHelper.GetForWindow(hwnd); dtm.DataRequested += OnDataRequested; UWPApplication.App.ShowShareUIForWindow += ShowShareUI; //Detect Orientation Microsoft.Win32.SystemEvents.DisplaySettingsChanged += SystemEvents_DisplaySettingsChanged; //Pass the WinForm's Hwmd to the UWP Application (UWPApplication.App.Current as UWPApplication.App).WindowHandle = hwnd; }
private static bool Show(string title, string link) { var mainWindow = Application.Current.MainWindow; if (mainWindow == null) { return(false); } _title = title; _link = link; (Application.Current?.Dispatcher ?? Dispatcher.CurrentDispatcher).Invoke(() => { var handle = new WindowInteropHelper(mainWindow).Handle; var dataTransferManager = DataTransferManagerHelper.GetForWindow(handle); dataTransferManager.DataRequested -= OnDataRequested; dataTransferManager.DataRequested += OnDataRequested; DataTransferManagerHelper.ShowShareUIForWindow(handle); }); return(true); }
private void Form1_Shown(object sender, EventArgs e) { dtmHelper = new DataTransferManagerHelper(this.Handle); dtmHelper.DataTransferManager.DataRequested += new TypedEventHandler <DataTransferManager, DataRequestedEventArgs>(this.DataRequested); }
/// <summary> /// Share the screenshot with a windows app /// </summary> /// <param name="manuallyInitiated"></param> /// <param name="surface"></param> /// <param name="captureDetails"></param> /// <returns>ExportInformation</returns> public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) { var exportInformation = new ExportInformation(Designation, Description); try { var handle = PluginUtils.Host.GreenshotForm.Handle; var exportTarget = Task.Run(async() => { var taskCompletionSource = new TaskCompletionSource <string>(); 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.Info("Created RandomAccessStreamReference for the image"); var imageRandomAccessStreamReference = RandomAccessStreamReference.CreateFromStream(imageStream); RandomAccessStreamReference thumbnailRandomAccessStreamReference; RandomAccessStreamReference logoRandomAccessStreamReference; // Create thumbnail using (var tmpImageForThumbnail = surface.GetImageForExport()) { using (var thumbnail = ImageHelper.CreateThumbnail(tmpImageForThumbnail, 240, 160)) { ImageOutput.SaveToStream(thumbnail, null, thumbnailStream, outputSettings); thumbnailStream.Position = 0; thumbnailRandomAccessStreamReference = RandomAccessStreamReference.CreateFromStream(thumbnailStream); Log.Info("Created RandomAccessStreamReference for the thumbnail"); } } // Create logo using (var logo = GreenshotResources.getGreenshotIcon().ToBitmap()) { using (var logoThumbnail = ImageHelper.CreateThumbnail(logo, 30, 30)) { ImageOutput.SaveToStream(logoThumbnail, null, logoStream, outputSettings); logoStream.Position = 0; logoRandomAccessStreamReference = RandomAccessStreamReference.CreateFromStream(logoStream); Log.Info("Created RandomAccessStreamReference for the logo"); } } string applicationName = null; var dataTransferManagerHelper = new DataTransferManagerHelper(handle); dataTransferManagerHelper.DataTransferManager.TargetApplicationChosen += (dtm, args) => { Log.InfoFormat("Trying to share with {0}", args.ApplicationName); applicationName = args.ApplicationName; }; var filename = FilenameHelper.GetFilename(OutputFormat.png, captureDetails); var storageFile = await StorageFile.CreateStreamedFileAsync(filename, async streamedFileDataRequest => { // Information on how was found here: https://socialeboladev.wordpress.com/2013/03/15/how-to-use-createstreamedfileasync/ Log.DebugFormat("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); } // Signal transfer ready to the await down below taskCompletionSource.TrySetResult(applicationName); }, imageRandomAccessStreamReference).AsTask().ConfigureAwait(false); dataTransferManagerHelper.DataTransferManager.DataRequested += (sender, args) => { var deferral = args.Request.GetDeferral(); args.Request.Data.OperationCompleted += (dp, eventArgs) => { Log.DebugFormat("OperationCompleted: {0}, shared with", eventArgs.Operation); taskCompletionSource.TrySetResult(applicationName); }; var dataPackage = args.Request.Data; 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 List <IStorageItem> { storageFile }); dataPackage.SetBitmap(imageRandomAccessStreamReference); dataPackage.Destroyed += (dp, o) => { Log.Debug("Destroyed."); }; deferral.Complete(); }; dataTransferManagerHelper.ShowShareUi(); return(await taskCompletionSource.Task.ConfigureAwait(false)); } }).Result; if (string.IsNullOrWhiteSpace(exportTarget)) { exportInformation.ExportMade = false; } else { exportInformation.ExportMade = true; exportInformation.DestinationDescription = exportTarget; } } catch (Exception ex) { exportInformation.ExportMade = false; exportInformation.ErrorMessage = ex.Message; } ProcessExport(exportInformation, surface); return(exportInformation); }
/// <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); } }