Как сохранить содержимое буфера обмена - PullRequest
4 голосов
/ 29 мая 2009

Есть ли способ сохранить содержимое буфера обмена? Я попробовал следующий код, но он не работает.

Dim iData As IDataObject = Clipboard.GetDataObject()
...(use clipboard)
Clipboard.SetDataObject(iData)

Спасибо.

Ответы [ 4 ]

3 голосов
/ 29 мая 2009

Самый простой способ сохранить содержимое буфера обмена - оставить буфер обмена в покое. Буфер обмена предназначен как временная область хранения для пользователя , а не для приложений, так что скорее всего то, что вы пытаетесь сделать, имеет лучшие решения, чем заглушить буфер обмена.

0 голосов
/ 13 июля 2010

Я согласен, что контекст важен. В моем случае я хотел вставить отформатированный, динамически заполненный документ титульной страницы в начало некоторого динамически сгенерированного текста (все в MS Word). Вот решение, которое я нашел (используя VSTO и C #):

                object start = 0;
                Word.Range startRng = a_TreatedDocument.Range(ref start, ref start);
                startRng.FormattedText = a_CoverPageDocument.Content.FormattedText;

Обратите внимание, это работает с таблицами и форматированным текстом.

0 голосов
/ 17 декабря 2009

Каким образом ваш код выше не работал? Когда я пробую эквивалентный код в C #, я получаю исключение «CloseClipboard Failed (исключение из 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);
0 голосов
/ 29 мая 2009

Вы можете использовать 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...