На самом деле может быть другая проблема под рукой. Фреймворковый вызов (как WPF, так и winform) к чему-то вроде этого (код от отражателя):
private static void SetDataInternal(string format, object data)
{
bool flag;
if (IsDataFormatAutoConvert(format))
{
flag = true;
}
else
{
flag = false;
}
IDataObject obj2 = new DataObject();
obj2.SetData(format, data, flag);
SetDataObject(obj2, true);
}
Обратите внимание, что в этом случае SetDataObject всегда вызывается с true.
Внутренне это вызывает два вызова API win32: один для установки данных, а другой - для сброса их из вашего приложения, чтобы они были доступны после закрытия приложения.
Я видел несколько приложений (несколько плагинов Chrome и менеджер загрузок), которые прослушивают событие буфера обмена. Как только поступит первый вызов, приложение откроет буфер обмена, чтобы просмотреть данные, и второй вызов сброса не удастся.
Не нашел хорошего решения, кроме как написать свой собственный класс буфера обмена, использующий прямой win32 API, или вызвать setDataObject напрямую со значением false для хранения данных после закрытия приложения.