2013-03-15 35 views
4

我使用下面的代碼將文本複製到剪貼板。放入和退出剪貼板的循環沒有延遲

System.Windows.Forms.SendKeys.SendWait("^c"); 

然後我用

Clipboard.GetText() 

獲得從剪貼板中的文本。它工作正常,但是當我在循環中使用剪貼板並且我得到的內容應該被下一個複製的文本覆蓋時,它看起來像延遲了。如果我把Thread.sleep,它工作正常。我怎樣才能快速複製並從剪貼板中獲得正確的內容?

+0

很難回答,當你不提供有問題的代碼/循環,這是造成你所述的問題.. – MethodMan

回答

3

這似乎是一個記錄的問題。 MSDN承認「計時問題」,但沒有包括完全避開它們的方法,儘管似乎有一種「更新」的方法,您需要告訴程序默認使用。以下是部分文檔:

SendKeys類已針對.NET Framework 3.0進行了更新。 SendKeys類容易受到時間問題的影響,一些開發人員不得不解決。更新的實現仍然易受時間問題的影響,但速度稍快,可能需要更改解決方法。 SendKeys類嘗試首先使用先前的實現,如果失敗,則使用新的實現。因此,SendKeys類可能在不同的操作系統上表現不同。此外,SendKeys類使用新的實現時,SendWait方法不會等待郵件發送到另一個進程時處理。 如果您的應用程序依賴於一致的行爲而不考慮操作系統,則可以通過將以下應用程序設置添加到您的app.config文件來強制SendKeys類使用新實現。

<appSettings> 
<add key="SendKeys" value="SendInput"/> 
</appSettings> 

我發現了另一個布告欄similar (old) issue,但不幸的是他們的修復是一樣的你 - 在訪問剪貼板之前的幾分之一秒的延遲。我找不到解決此問題的其他解決方法。考慮到有一個Send和一個SendWait,期望後者實際等待發送似乎並不太多。 :)

3

您絕對無法在循環中更新剪貼板,並希望數據立即可用(並可供您的應用程序訪問)。您發送按鍵的應用程序正在其自己的進程中運行,而Windows則是多處理,多線程等。因此,您需要在其他應用程序獲得機會複製它。
此外,由於系統上可能還有其他程序正在運行,監視剪貼板以進行更新(剪貼板查看器),當您嘗試從剪貼板獲取數據時,您將與這些程序發生衝突。
我不知道你爲什麼試圖去做你正在做的事情,但你應該意識到它不會一直工作。您可能可以在某些情況下使用它,但不是所有情況。除非這是您自己使用的教育練習,否則您應該放棄這種方法。

並請閱讀本帖的主題:

「程序不應該將數據傳輸到我們的出剪貼板中沒有來自用戶的明確指令。」
- 查爾斯Petzold的,編程Windows 3。1,微軟出版社,1992