访问剪贴板时有几个ExternalExceptions

时间:2013-07-24 14:23:59

标签: c# clipboard comexception

我在剪贴板上遇到了一些问题。通常当我尝试访问它(读取或写入数据无关紧要)时,我得到了ExternalExceptions。我知道为什么会出现错误代码为CLIPBRD_E_CANT_OPEN的异常,所以我发现了这些异常。但现在我得到错误代码E_FAIL的其他异常,这意味着未指定的失败。我不喜欢抓住这些想法。这就像捕获Exeception并且什么都不做。

即使我抓住这些,我也会收到here所描述的消息。不幸的是,没有给出答案。有人可以为此提供解决方案或解释为什么会这样吗?我会给你剪贴板处理代码,但我认为这不是问题所在。

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 个答案:

没有答案