请求的剪贴板操作未成功

问题描述 投票:0回答:13
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 文档称,当用户切换到另一个应用程序时,通常会发生这种情况,但事实似乎并非如此。

winforms clipboard
13个回答
14
投票

有类似的问题。找到这个条目, 基本上就是说在通话中将

retryTimes
设置为 2:

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

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


7
投票

根本原因可能是您正在执行两个操作,通常是复制和粘贴,并假设剪贴板可用。发生的情况是,您进行复制(以更新剪贴板),然后当您尝试粘贴时其他剪贴板查看器会对它做出反应。防御方法是在粘贴操作周围有一个例外/睡眠/重试机制,以便您可以优雅地处理它。告诉用户关闭 rpdclip 等,在生产应用程序中是行不通的。 还要确保您没有将剪贴板用作拐杖。提供剪贴板是为了方便用户,而不是程序员。


6
投票

简单!我有同样的问题并解决了它。

只需打开任务管理器,在

rdpclip.exe
下搜索
Processes
,将其杀死。然后,打开一个新任务并再次运行它。


4
投票

我的应用程序遇到此问题,但仅在 HP mini 上运行该应用程序时出现。

如果我正在运行 C# Express,那么我可以检查异常,

关闭 Google Chrome 即可解决该问题。

重新打开 Google Chrome 会导致其重新出现。

但是在我的主64位机器上,没问题;在我以前的 32 位机器上也没有问题。也许是内存有限的副作用?

杰拉德


3
投票

现在有其他应用程序正在使用剪贴板。找出监控剪贴板的应用程序并杀死该进程。对我有用。


2
投票

如果您正在使用某些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);
   }

1
投票

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

1
投票

我也遇到了这个问题,并使用此代码作为WireGuy回答。但此代码在我的电脑中出现异常“请求的剪贴板操作未成功”。我将这一行放在 Try Catch 语句中

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

            }

并且工作正常。


1
投票

尝试在 while 循环中使用 Try catch 运行 GetDataObject。最终一定会成功的。

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

        }
    }

0
投票

对于我自己来说,我发现剪贴板仍在处理我的请求,而我 正在放一个新的。


SendKeys.SendWait("^c");
Clipboard.GetText();

所以我添加了睡眠,现在效果很好。


SendKeys.SendWait("^c");
Thread.Sleep(250);
Clipboard.GetText();


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

我确信它是短暂的错误,就像我前几天设置剪贴板内容时没有问题一样。


0
投票

我在从 Microsoft SQL Server Management Studio 复制数据时突然出现此错误,从那以后我无法复制任何内容。 重新启动 explorer.exe 进程解决了该问题。我想资源管理器进程处理大部分剪贴板操作。


0
投票

我遇到了这个问题,这对我有用,在将文本设置到剪贴板之前添加此内容(Clipboard.SetText(string Text))

最终变成了

Clipboard.Clear();
Clipboard.SetText(string Text);
© www.soinside.com 2019 - 2024. All rights reserved.