クリップボードに問題があります。多くの場合、アクセスしようとすると (データの読み取りまたは書き込みは関係ありません)、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 にはプログラム固有のオブジェクトがあり、任意のエディターに貼り付けることができるいくつかのテキストに対応しています。