Exception Type: ExternalException
Message: Requested Clipboard operation did not succeed.
Method: ThrowIfFailed
Source: System.Windows.Forms
Stack Trace:
at System.Windows.Forms.Clipboard.ThrowIfFailed(Int32 hr)
at System.Windows.Forms.Clipboard.SetDataObject(Object data, Boolean copy, Int32 retryTimes, Int32 retryDelay)
at System.Windows.Forms.Clipboard.SetText(String text, TextDataFormat format)
at System.Windows.Forms.Clipboard.SetText(String text)
at Deerfield.Base.Controls.DataGridView.ProcessCmdKey(Message& msg, Keys keyData) in C:\Users\Developer\Desktop\deerfield\src\core\Deerfield\Deerfield.Base\Controls\DataGridView.cs:line 555
at System.Windows.Forms.Control.ProcessCmdKey(Message& msg, Keys keyData)
at System.Windows.Forms.Control.ProcessCmdKey(Message& msg, Keys keyData)
at System.Windows.Forms.TextBoxBase.ProcessCmdKey(Message& msg, Keys keyData)
at System.Windows.Forms.Control.PreProcessMessage(Message& msg)
at System.Windows.Forms.Control.PreProcessControlMessageInternal(Control target, Message& msg)
at System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG& msg)
我用谷歌搜索了这个,但我无法得到关于为什么会发生这种情况的正确答案。
MSDN 文档称,当用户切换到另一个应用程序时,通常会发生这种情况,但事实似乎并非如此。
有类似的问题。找到这个条目, 基本上就是说在通话中将
retryTimes
设置为 2:
Clipboard.SetDataObject(object data, bool copy, int retryTimes, int retryDelay)
要去尝试一下。如果有人可以发布可重现的测试用例,那就太好了。
根本原因可能是您正在执行两个操作,通常是复制和粘贴,并假设剪贴板可用。发生的情况是,您进行复制(以更新剪贴板),然后当您尝试粘贴时其他剪贴板查看器会对它做出反应。防御方法是在粘贴操作周围有一个例外/睡眠/重试机制,以便您可以优雅地处理它。告诉用户关闭 rpdclip 等,在生产应用程序中是行不通的。 还要确保您没有将剪贴板用作拐杖。提供剪贴板是为了方便用户,而不是程序员。
简单!我有同样的问题并解决了它。
只需打开任务管理器,在
rdpclip.exe
下搜索Processes
,将其杀死。然后,打开一个新任务并再次运行它。
我的应用程序遇到此问题,但仅在 HP mini 上运行该应用程序时出现。
如果我正在运行 C# Express,那么我可以检查异常,
关闭 Google Chrome 即可解决该问题。
重新打开 Google Chrome 会导致其重新出现。
但是在我的主64位机器上,没问题;在我以前的 32 位机器上也没有问题。也许是内存有限的副作用?
杰拉德
现在有其他应用程序正在使用剪贴板。找出监控剪贴板的应用程序并杀死该进程。对我有用。
如果您正在使用某些VNC程序(RealVNC)并且您的应用程序在主线程上使用System.Windows.Forms.dll中的剪贴板,则会发生“请求的剪贴板操作失败”。这是我用 C# 为 .NET 3.5 编写的解决方案:
using System.Threading;
var dataObject = new DataObject();
private Clipboard()
{
//dataObject logic here
Thread clipboardThread = new Thread(new ThreadStart(GetClipboard));
clipboardThread.SetApartmentState(ApartmentState.STA);
clipboardThread.Start();
}
private void GetClipboard()
{
Clipboard.SetDataObject(dataObject, true, 10, 100);
}
我使用了System.Windows.Forms.Control.WndProc方法和PostMessage。
string clipboardText;
{
clipboardText = "TEXT FOR CLIPBOARD";
PostMessage(Handle, CLIPBOARD_BACKUP_MSG, 0, 0);
}
protected override void WndProc(ref Message m)
{
if (m.Msg == CLIPBOARD_BACKUP_MSG)
{
Clipboard.SetText(clipboardText);
}
base.WndProc(ref m);
}
我也遇到了这个问题,并使用此代码作为WireGuy回答。但此代码在我的电脑中出现异常“请求的剪贴板操作未成功”。我将这一行放在 Try Catch 语句中
try
{
Clipboard.SetDataObject(textBoxCodePan.Text, true, 10, 100);
}
catch (Exception)
{
}
并且工作正常。
尝试在 while 循环中使用 Try catch 运行 GetDataObject。最终一定会成功的。
while (tempObj == null)
{// get from the clipboard
try
{
tempObj = Clipboard.GetDataObject();
}
catch (Exception excep)
{
}
}
对于我自己来说,我发现剪贴板仍在处理我的请求,而我 正在放一个新的。
SendKeys.SendWait("^c");
Clipboard.GetText();
所以我添加了睡眠,现在效果很好。
SendKeys.SendWait("^c");
Thread.Sleep(250);
Clipboard.GetText();
由于某种原因,我每次运行时都会遇到“请求的剪贴板操作未成功”异常
Dim s = "test"
Clipboard.SetDataObject(s, True, 10, 200)
但是
Dim s = "test"
Clipboard.ContainsText()
Clipboard.SetDataObject(s, True, 10, 200)
每次都有效。
不过,有趣的是
Try
Dim s = "test"
Clipboard.SetDataObject(s, True, 10, 200)
catch ex as exception
Dim s = "test"
Clipboard.ContainsText()
Clipboard.SetDataObject(s, True, 10, 200)
end try
两次 SetDataObject 调用都会失败
我确信它是短暂的错误,就像我前几天设置剪贴板内容时没有问题一样。
我在从 Microsoft SQL Server Management Studio 复制数据时突然出现此错误,从那以后我无法复制任何内容。 重新启动 explorer.exe 进程解决了该问题。我想资源管理器进程处理大部分剪贴板操作。
我遇到了这个问题,这对我有用,在将文本设置到剪贴板之前添加此内容(Clipboard.SetText(string Text))
最终变成了
Clipboard.Clear();
Clipboard.SetText(string Text);