Есть ли способ сохранить содержимое буфера обмена? Я попробовал следующий код, но он не работает.
Dim iData As IDataObject = Clipboard.GetDataObject()
...(use clipboard)
Clipboard.SetDataObject(iData)
Спасибо.
Есть ли способ сохранить содержимое буфера обмена? Я попробовал следующий код, но он не работает.
Dim iData As IDataObject = Clipboard.GetDataObject()
...(use clipboard)
Clipboard.SetDataObject(iData)
Спасибо.
Самый простой способ сохранить содержимое буфера обмена — оставить его в покое. Буфер обмена предназначен для временного хранения для пользователя, а не для приложений, поэтому, вероятно, то, что вы пытаетесь сделать, имеет лучшие решения, чем затирание буфера обмена.
Вы можете использовать OpenClipboard и CloseClipboard. Согласно MSDN открытие буфера обмена сохранит другие приложений от изменения данных.
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern bool OpenClipboard(IntPtr hWndNewOwner);
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern bool CloseClipboard();
Каким образом ваш код выше не работал? Когда я пробую эквивалентный код на С#, я получаю исключение «CloseClipboard Failed (Exception from HRESULT: 0x800401D4 (CLIPBRD_E_CANT_CLOSE))» при вызове Clipboard.SetDataObject(iData).
Тем не менее, следующий обходной путь делает работу для меня:
// save
Dictionary<String, Object> d = new Dictionary<String, Object>();
IDataObject ido = Clipboard.GetDataObject();
foreach (String s in ido.GetFormats(false))
d.Add(s, ido.GetData(s));
// ...
// restore
var da = new DataObject();
foreach (String s in d.Keys)
da.SetData(s, d[s]);
Clipboard.SetDataObject(da);
Я согласен, что контекст важен. В моем случае я хотел вставить отформатированный, динамически заполненный документ титульной страницы на переднюю часть динамически сгенерированного текста (все в MS Word). Вот решение, которое я нашел (используя VSTO и С#):
object start = 0;
Word.Range startRng = a_TreatedDocument.Range(ref start, ref start);
startRng.FormattedText = a_CoverPageDocument.Content.FormattedText;
Обратите внимание, что это работает с таблицами и форматированным текстом.