请求的剪贴板操作没有成功

时间:2011-04-18 19:41:06

标签: winforms clipboard

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)

我用Google搜索了这个,但我无法得到一个正确的答案,为什么会发生这种情况。

MSDN文档说这种情况经常发生在用户切换到另一个应用程序时,但似乎并非如此。

12 个答案:

答案 0 :(得分:7)

有类似的问题。找到了这个entry, 这基本上就是说在呼叫中将retryTimes设置为2:

Clipboard.SetDataObject(object data, bool copy, int retryTimes, int retryDelay)

去尝试一下。如果有人能发布一个可重复的测试用例,那就太好了。

答案 1 :(得分:6)

根本原因可能是您正在进行两项操作,通常是复制和粘贴,并假设剪贴板可用。当你尝试粘贴时,会发生一个副本(更新剪贴板)然后其他剪贴板查看器对它做出反应。防御是在粘贴操作周围有一个except / sleep / retry机制,这样你就可以优雅地处理它。告诉用户关闭rpdclip等,不会在生产应用程序中飞行。 还要确保你没有(ab)使用剪贴板作为拐杖。提供剪贴板是为了方便用户而不是PROGRAMMER。

答案 2 :(得分:4)

EASY!我遇到了同样的问题并修复了它。

只需打开任务管理器,在rdpclip.exe下搜索Processes,然后将其删除即可。然后,打开一个新任务并再次运行它。

答案 3 :(得分:4)

我在应用中遇到了这个问题,但只有在HP mini上运行时才会出现这个问题。

如果我有C#express运行,那么我可以检查异常,

关闭Google Chrome可以解决问题。

重新开启Google Chrome会使其重新出现。

但在我的64位主机上,没问题;在我之前的32位机器上,也没问题。有限RAM的副作用可能是什么?

杰拉德

答案 4 :(得分:2)

现在其他一些应用程序正在使用剪贴板。找出应用程序监控剪贴板并终止该过程。适合我。

答案 5 :(得分:1)

我也遇到了这个问题,并以WireGuy的答案使用此代码。但是此代码在我的PC中出现了“请求的剪贴板操作未成功”的异常。我在这一行中输入了try Catch语句

            try
            {
                Clipboard.SetDataObject(textBoxCodePan.Text, true, 10, 100);
            }
            catch (Exception)
            {

            }

并且工作正常。

答案 6 :(得分:1)

尝试使用try catch在while循环中运行GetDataObject。最终它将成功。

    while (tempObj == null)
    {// get from the clipboard
        try
        {
            tempObj = Clipboard.GetDataObject();
        }
        catch (Exception excep)
        {

        }
    }

答案 7 :(得分:0)

我使用了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);
}

答案 8 :(得分:0)

对于我自己,我发现剪贴板仍在处理我的请求 正在推出一个新的。 SendKeys.SendWait("^c"); Clipboard.GetText();

所以我添加了Sleep,它现在效果很好。 SendKeys.SendWait("^c"); Thread.Sleep(250); Clipboard.GetText();

答案 9 :(得分:0)

如果您使用某些VNC程序(RealVNC),并且您的应用程序使用主线程“请求的剪贴板操作失败”中System.Windows.Forms.dll中的剪贴板,则会发生。这是我为.NET 3.5用C#编写的解决方案:

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);
   }

答案 10 :(得分:0)

由于某种原因,每次运行时都会出现“请求的剪贴板操作未成功”异常

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调用上都会失败

我确定这是暂时性错误,因为前几天我设置剪贴板内容没有问题。

答案 11 :(得分:0)

从Microsoft SQL Server Management Studio复制数据时,突然出现此错误,因为那时我什么也无法复制。 重新启动explorer.exe进程即可解决此问题。我猜想资源管理器进程可以处理大多数剪贴板操作。