我在剪贴板上遇到了一些问题。通常当我尝试访问它(读取或写入数据无关紧要)时,我得到了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有一个特定于程序的对象,并且可以在任何编辑器中粘贴一些文本。