Why do you need a backup of IDataObject?
If it was possible in all cases it would look like this
Backup
// expiremental list of formats to exclude. Doesn't cover all possible cases but most of it.
private static readonly string[] clipboardMetaFormats = { "application/x-moz-nativeimage", "FileContents", "EnhancedMetafile", "System.Drawing.Imaging.Metafile", "MetaFilePict", "Object Descriptor", "ObjectLink", "Link Source Descriptor", "Link Source", "Embed Source", "Hyperlink" };
private DataObject ReadClipboard()
{
DataObject result = new DataObject();
IDataObject dataObject = Clipboard.GetDataObject();
string[] formats = dataObject.GetFormats()?.Except(clipboardMetaFormats).ToArray() ?? Array.Empty<string>();
foreach (string format in formats)
{
try
{
object data = dataObject.GetData(format);
if (data != null) result.SetData(format, data);
}
catch (ExternalException ex)
{
Debug.WriteLine($"Error {ex.ErrorCode}: {ex.Message}");
}
}
return result;
}
DataObject backup = ReadClipboard();
Then you may use it as local data storage. For example in case you want to change Clipboard, use the changed value e.g. paste it into some application and the restore the previous data to Clipboard.
Restore
private void UpdateClipboard(DataObject data)
{
if (data == null) return;
try
{
Clipboard.SetDataObject(data);
}
catch (ExternalException ex)
{
Debug.WriteLine($"Error {ex.ErrorCode}: {ex.Message}");
}
}
UpdateClipboard(backup);
But in your case that's a simple string. You may do it this way:
string text = Clipboard.GetText(TextDataFormat.UnicodeText);
Clipboard.SetText(text, TextDataFormat.UnicodeText);