2011-04-18 49 views
11
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

其他人可能打開了剪貼板。我的猜測是有人打開它,忘記關閉它。既然你沒有顯示任何代碼,我只能猜測。 – 2011-04-18 19:58:15

+0

東西被粘貼到dataGridCell中。我沒有任何代碼可以做任何事情,它是控制本身 – KristenApril 2011-04-18 20:25:44

回答

5

有類似的問題。發現這個entry, 基本上說來設置retryTimes 2呼叫:

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

要試試。如果有人可以發佈一個可重複的測試用例,那將會很好。

+1

我想避免使用setDataObject。有什麼辦法可以在使用setText時使用retry/retryDelay選項? – KristenApril 2011-04-27 19:44:39

+1

@KristenApril:如果你看看SetText方法是如何實現的(使用Reflector或類似的東西),它只是將對SetDataObject的調用包裝起來。它首先將文本包裝到DataObject類中,然後將其傳遞到SetDataObject,然後調用SetDataObject將自動爲您執行此操作,因此您只需使用它在內部用於調用SetText的相同選項,即SetDataObject(data ,真的,10,100);' – BrutalDev 2012-07-05 20:19:19

+0

@BrutalDev:但是如果'SetText'在內部使用'SetDataObject(data,true,10,100)',那麼爲什麼直接調用'SetDataObject(data,true,10,100)'會改變什麼? – user276648 2017-01-19 03:04:45

4

容易!我有同樣的問題,並修復它。

只要打開任務管理器,在Processes下搜索rdpclip.exe,殺死它。然後,打開一個新任務並再次運行。

+0

這解決了Git擴展的崩潰。謝謝。有關詳細信息,請參閱https://social.msdn.microsoft.com/Forums/en-US/a23c31df-e645-4500-ab4a-e6178510a9b1/clipboard-error?forum=Vsexpressvb。 – toddwz 2016-06-15 11:06:50

2

這是一些其他應用程序現在使用剪貼板。找出應用程序監控剪貼板並殺死進程。適用於我。

4

我有一個應用程序的問題,但只有在HP mini上運行時纔有問題。

如果我有C#快遞運行,所以我可以檢查異常,

關閉谷歌瀏覽器中刪除的問題。

重新開啓谷歌瀏覽器導致它重新出現。

但在我的主要64位機器上,沒有問題;並在我以前的32位機器上,也沒有問題。有限的內存的副作用也許?

傑拉德

5

的根本原因很可能是你正在做兩個操作,通常是複製和糊狀,假設剪貼板將可用。會發生什麼是,你做了一個副本(更新剪貼板),然後當你嘗試粘貼時,其他剪貼板查看器對它做出了反應。辯護是圍繞粘貼操作有一個除/睡眠/重試機制,以便您可以正常處理它。告訴用戶關閉rpdclip等不會在生產應用程序中飛行。 另外請確保你沒有(ab)使用剪貼板作爲柺杖。提供剪貼板是爲了方便用戶,而不是PROGRAMMER。

+0

同意,但是在做VBA/Office編程時,並沒有太多好的方式來回傳輸數據,系統的設計真的是剪貼板作爲主要的傳輸工具。 – Rob 2016-09-27 17:39:26

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

至於我自己,我發現,剪貼板仍在處理我的請求,而我 是把一個新的。 SendKeys.SendWait("^c"); Clipboard.GetText();

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