0

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

即使我抓住了这些,我也会得到这里描述的信息。不幸的是没有给出答案。有人可以为此提供解决方案或解释为什么会发生这种情况吗?我会给你我的剪贴板处理代码,但我不认为这是这里的问题。

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 有一个程序特定的对象和一些我可以粘贴到任何编辑器中的并行文本。

4

0 回答 0