Несколько внешних исключений при доступе к буферу обмена
У меня есть некоторые проблемы с буфером обмена. Часто, когда я пытаюсь получить к нему доступ (чтение или запись данных не имеют значения), я получаю ExternalExceptions. Я знаю, почему возникают исключения с кодом ошибки CLIPBRD_E_CANT_OPEN, поэтому я поймал эти исключения. Но теперь я получаю другие исключения с кодом ошибки E_FAIL, что означает неуказанный сбой. Мне не нравится идея поймать их. Это все равно что ловить Exeception и ничего не делать.
Даже если я поймаю их, я получу сообщение, описанное здесь. К сожалению, ответа не было. Может кто-нибудь дать решение или объяснить, почему это происходит? Я дам вам свой код обработки буфера обмена, но я не думаю, что это проблема здесь.
internal class ClipboardHandle
{
private const int MaxTries = 5;
private const int DelayBetweenTries = 200;
private const int CantOpenClipboardCode = -2147221040;
private const int UnspecifiedFailure = -2147467259;
private readonly Timer setDataTimer = new Timer(DelayBetweenTries) { AutoReset = false };
private int setDataTries;
private DataObject clipboardDataObject;
public ClipboardHandle()
{
setDataTimer.Elapsed += OnSetDataTimerElapsed;
}
internal void SetDataObject(DataObject clipboardData)
{
setDataTimer.Enabled = false;
setDataTries = 0;
clipboardDataObject = clipboardData;
SetClipboardData();
}
private void SetClipboardData()
{
try
{
System.Windows.Clipboard.SetDataObject(clipboardDataObject,false);
clipboardDataObject = null;
}
catch (ExternalException e)
{
if (e.ErrorCode != CantOpenClipboardCode && e.ErrorCode != UnspecifiedFailure) throw;
if (setDataTries < MaxTries)
{
setDataTries++;
setDataTimer.Enabled = true;
}
}
}
private void OnSetDataTimerElapsed(object sender, ElapsedEventArgs elapsedEventArgs)
{
SetClipboardData();
}
internal bool ContainsData(string key)
{
try
{
return System.Windows.Clipboard.ContainsData(key);
}
catch (ExternalException e)
{
if (e.ErrorCode != CantOpenClipboardCode && e.ErrorCode != UnspecifiedFailure) throw;
}
return false;
}
internal object GetData(string key)
{
try
{
return System.Windows.Clipboard.GetData(key);
}
catch (ExternalException e)
{
if (e.ErrorCode != CantOpenClipboardCode && e.ErrorCode != UnspecifiedFailure) throw;
}
return null;
}
}
РЕДАКТИРОВАТЬ
Я только что нашел новое исключение. После того, как программа была запущена в течение нескольких часов и компьютер перешел в спящий режим, снова разбудите его. Я получил OutOfMemoryException при чтении буфера обмена.
Для информации: DataObject имеет программный объект и параллельный текст, который я могу вставить в любой редактор.