diff --git a/src/modules/AdvancedPaste/AdvancedPaste/Helpers/ClipboardHelper.cs b/src/modules/AdvancedPaste/AdvancedPaste/Helpers/ClipboardHelper.cs index 4cfa524ad33..66ee7aa3e24 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/Helpers/ClipboardHelper.cs +++ b/src/modules/AdvancedPaste/AdvancedPaste/Helpers/ClipboardHelper.cs @@ -6,7 +6,6 @@ using System.Threading; using System.Threading.Tasks; using ManagedCommon; -using Microsoft.UI.Xaml.Media.Imaging; using Windows.ApplicationModel.DataTransfer; using Windows.Storage.Streams; using Windows.System; @@ -21,9 +20,30 @@ internal static void SetClipboardTextContent(string text) if (!string.IsNullOrEmpty(text)) { + Logger.LogDebug("Text to set to clipboard: " + text); + DataPackage output = new(); output.SetText(text); - Clipboard.SetContentWithOptions(output, null); + bool success = Clipboard.SetContentWithOptions(output, null); + Logger.LogDebug("Setting Clipboard data was success?: " + success); + + // Wait 50 ms in a loop until setting the clipboard content has really finished. + while (!Clipboard.GetContent().GetTextAsync().GetAwaiter().GetResult().Contains(text)) + { + Thread.Sleep(50); + } + +#if DEBUG + try + { + string clipContent = Clipboard.GetContent().GetTextAsync().GetAwaiter().GetResult(); + Logger.LogDebug("Clipboard content for current process: " + clipContent); + } + catch (Exception ex) + { + Logger.LogError("Failed to get clipboard content: ", ex.GetBaseException()); + } +#endif // TODO(stefan): For some reason Flush() fails from time to time when directly activated via hotkey. // Calling inside a loop makes it work. @@ -39,14 +59,24 @@ internal static void SetClipboardTextContent(string text) { Task.Run(() => { - Clipboard.Flush(); + try + { + Clipboard.Flush(); + } + catch (Exception ex) + { + Logger.LogError("Clipboard.Flush() failed. Real reason:", ex.GetBaseException()); + throw; + } }).Wait(); flushed = true; + Logger.LogDebug("Clipboard flushed."); } catch (Exception ex) { Logger.LogError("Clipboard.Flush() failed", ex); + Thread.Sleep(50); } } } diff --git a/src/modules/AdvancedPaste/AdvancedPaste/ViewModels/OptionsViewModel.cs b/src/modules/AdvancedPaste/AdvancedPaste/ViewModels/OptionsViewModel.cs index 894b8e5536a..60cdca1abe7 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/ViewModels/OptionsViewModel.cs +++ b/src/modules/AdvancedPaste/AdvancedPaste/ViewModels/OptionsViewModel.cs @@ -6,6 +6,7 @@ using System.Collections.ObjectModel; using System.Globalization; using System.Net; +using System.Threading; using System.Threading.Tasks; using AdvancedPaste.Helpers; using AdvancedPaste.Models; @@ -252,6 +253,8 @@ internal void ToPlainTextFunction() { Logger.LogTrace(); + string originalClipboardData = ClipboardData.GetTextAsync().GetAwaiter().GetResult(); + string outputString = MarkdownHelper.PasteAsPlainTextFromClipboard(ClipboardData); SetClipboardContentAndHideWindow(outputString); @@ -260,6 +263,13 @@ internal void ToPlainTextFunction() { ClipboardHelper.SendPasteKeyCombination(); } + + // Sleeping 250 ms that paste command can be completely executed before resetting the clipboard. + // Otherwise we reset the clipboard to early and past the original content. Or the clipboard is still used while resetting and resetting fails. + Thread.Sleep(250); + + // Resetting clipboard content + SetClipboardContentAndHideWindow(originalClipboardData); } catch { @@ -272,6 +282,8 @@ internal void ToMarkdownFunction(bool pasteAlways = false) { Logger.LogTrace(); + string originalClipboardData = ClipboardData.GetTextAsync().GetAwaiter().GetResult(); + string outputString = MarkdownHelper.ToMarkdown(ClipboardData); SetClipboardContentAndHideWindow(outputString); @@ -280,6 +292,13 @@ internal void ToMarkdownFunction(bool pasteAlways = false) { ClipboardHelper.SendPasteKeyCombination(); } + + // Sleeping 250 ms that paste command can be completely executed before resetting the clipboard. + // Otherwise we reset the clipboard to early and past the original content. Or the clipboard is still used while resetting and resetting fails. + Thread.Sleep(250); + + // Resetting clipboard content + SetClipboardContentAndHideWindow(originalClipboardData); } catch { @@ -292,6 +311,8 @@ internal void ToJsonFunction(bool pasteAlways = false) { Logger.LogTrace(); + string originalClipboardData = ClipboardData.GetTextAsync().GetAwaiter().GetResult(); + string jsonText = JsonHelper.ToJsonFromXmlOrCsv(ClipboardData); SetClipboardContentAndHideWindow(jsonText); @@ -300,6 +321,13 @@ internal void ToJsonFunction(bool pasteAlways = false) { ClipboardHelper.SendPasteKeyCombination(); } + + // Sleeping 250 ms that paste command can be completely executed before resetting the clipboard. + // Otherwise we reset the clipboard to early and past the original content. Or the clipboard is still used while resetting and resetting fails. + Thread.Sleep(250); + + // Resetting clipboard content + SetClipboardContentAndHideWindow(originalClipboardData); } catch {