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