Запрошенная операция буфера обмена не удалась - PullRequest
15 голосов
/ 18 апреля 2011
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 говорится, что это часто происходит, когда пользователь переключается на другое приложение, но не похоже, что это было так.

Ответы [ 9 ]

8 голосов
/ 26 апреля 2011

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

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

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

6 голосов
/ 29 октября 2012

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

4 голосов
/ 07 апреля 2012

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

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

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

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

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

Gerald

4 голосов
/ 20 января 2012

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

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

2 голосов
/ 03 апреля 2012

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

1 голос
/ 09 октября 2018

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

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

            }

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

0 голосов
/ 21 сентября 2018

Если вы используете какую-либо программу 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);
   }
0 голосов
/ 25 января 2015

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

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

0 голосов
/ 16 сентября 2013

Я использовал метод 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...