web-dev-qa-db-ja.com

要求されたクリップボード操作は成功しませんでした

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のドキュメントには、ユーザーが別のアプリケーションに切り替えたときにこれが頻繁に発生すると記載されていますが、そうではないようです。

16
KristenApril

同様の問題を抱えています。これが見つかりました entry 、これは基本的に呼び出しでretryTimesを2に設定することを示しています。

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

それを試してみるつもりです。誰かが再現可能なテストケースを投稿できればいいのにと思います。

8
WireGuy

根本的な原因は、通常はコピーと貼り付けの2つの操作を実行していて、クリップボードが使用可能であると想定していることである可能性があります。何が起こるかというと、(クリップボードを更新するために)コピーを実行し、貼り付けようとすると、他のクリップボードビューアがそれに反応します。防御は、貼り付け操作の周りに例外/スリープ/再試行メカニズムを持たせることです。これにより、適切に処理できます。 rpdclipなどをシャットダウンするようにユーザーに指示しても、実稼働アプリケーションでは機能しません。また、クリップボードを松葉杖として(ab)使用していないことを確認してください。クリップボードは、プログラマーではなく、ユーザーの便宜のために提供されています。

6
Chris Thornton

簡単!同じ問題が発生し、修正しました。

タスクマネージャを開き、Processesの下でrdpclip.exeを検索し、それを強制終了します。次に、新しいタスクを開いて再度実行します。

4
hector

アプリでこの問題が発生しましたが、HPminiで実行した場合のみです。

例外を確認できるようにC#Expressを実行している場合は、

googleをシャットダウンするChromeは問題を取り除きます。

google Chromeを再度開くと、Googleが再び表示されます。

しかし、私のメインの64ビットマシンでは問題ありません。以前の32ビットマシンでも問題ありません。限られたの副作用RAMおそらく?

ジェラルド

4

現在クリップボードを使用している他のアプリケーションがあります。クリップボードを監視しているアプリケーションを見つけて、プロセスを強制終了します。私のために働きます。

3
tealcwu

一部のVNCプログラム(RealVNC)を使用していて、アプリケーションがメインスレッドでSystem.Windows.Forms.dllのクリップボードを使用している場合、「要求されたクリップボード操作に失敗しました」が発生します。これは、C#for .NET3.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
Sashus

私もこの問題を抱えていたので、このコードを WireGuy 回答として使用します。しかし、このコードコードは私のPCで「要求されたクリップボード操作が成功しませんでした」という例外を作ります。この行をTryCatchステートメントに入れます

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

            }

正しく動作しました。

1
Ali Ahmadvand

私自身、新しいものを入れている間、クリップボードがまだ私の要求を処理していることに気づきました。 SendKeys.SendWait("^c"); Clipboard.GetText();

そこで、Sleepを追加しましたが、今ではうまく機能しています。 SendKeys.SendWait("^c"); Thread.Sleep(250); Clipboard.GetText();

0
Carol

何らかの理由で、実行時に毎回「要求されたクリップボード操作が成功しませんでした」という例外が発生しました

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
Tim Hall

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