Несколько внешних исключений при доступе к буферу обмена

У меня есть некоторые проблемы с буфером обмена. Часто, когда я пытаюсь получить к нему доступ (чтение или запись данных не имеют значения), я получаю 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 имеет программный объект и параллельный текст, который я могу вставить в любой редактор.

0 ответов

Другие вопросы по тегам