Запрошенная операция буфера обмена не удалась

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 говорится, что это часто происходит, когда пользователь переключается на другое приложение, но, похоже, это не так.

Ответ 1

Аналогичная проблема. Нашли это запись, который в основном говорит, чтобы установить retryTimes в 2 в вызове:

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

Попытка. Было бы неплохо, если бы кто-нибудь мог опубликовать воспроизводимый тестовый пример.

Ответ 2

Коренной причиной может быть то, что вы выполняете две операции, обычно копию и вставку, и предполагаете, что буфер обмена будет доступен. Случается, что вы делаете копию (для обновления буфера обмена), а затем другие зрители буфера обмена реагируют на нее при попытке вставить. Защита состоит в том, чтобы во время операции вставки был задействован механизм сна/сна/повтора, чтобы вы могли обработать его изящно. Говоря пользователю о закрытии rpdclip и т.д., Он не будет летать в производственном приложении. Также убедитесь, что вы не (ab) используете буфер обмена как костыль. Буфер обмена предоставляется для удобства ПОЛЬЗОВАТЕЛЯ, а не ПРОГРАММА.

Ответ 3

ЛЕГКО! У меня была такая же проблема и исправлено.

Просто откройте диспетчер задач, найдите rdpclip.exe под Processes, убейте его. Затем откройте новую задачу и запустите ее снова.

Ответ 4

У меня была эта проблема с приложением, но только при ее запуске на HP mini.

Если у меня запущен С#, я могу проверить исключение,

завершение работы Google Chrome устраняет проблему.

Открытие Google Chrome заставляет его снова появляться.

Но на моей основной 64-битной машине нет проблем; и на моей предыдущей 32-битной машине тоже не проблема. Возможно ли побочный эффект ограниченной ОЗУ?

Геральд

Ответ 5

Теперь какое-то другое приложение использует буфер обмена. Узнайте об отслеживании приложения Clipboard и убейте процесс. Работает для меня.

Ответ 6

У меня тоже была эта проблема, и я использую этот код в ответе WireGuy. но этот код кода делает исключение на моем ПК "Запрошенная операция буфера обмена не удалась". Я поставил в этой строке утверждение Try Catch

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

            }

и работал правильно.

Ответ 7

Я использовал метод 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

Для себя я обнаружил, что буфер обмена по-прежнему обрабатывал мой запрос, пока я ставил новый. SendKeys.SendWait("^c"); Clipboard.GetText();

Итак, я добавил Sleep, и теперь он отлично работает. SendKeys.SendWait("^c"); Thread.Sleep(250); Clipboard.GetText();

Ответ 9

Если вы используете какую-либо программу VNC (RealVNC) и ваше приложение использует буфер обмена из System.Windows.Forms.dll в главном потоке, то "Запрошенная операция буфера обмена завершилась неудачно". Это мое решение, написанное на С# для .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);
   }

Ответ 10

По какой-то причине я получаю исключения "Запрошенная операция буфера обмена не выполняется" каждый раз при запуске

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

Я уверен, что это такая же кратковременная ошибка, как когда я настраивал содержимое буфера обмена на днях без проблем.