在没有延迟的情况下放入并离开剪贴板

时间:2013-03-15 20:03:57

标签: c# clipboard

我正在使用以下代码将文本复制到剪贴板。

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

然后我用

Clipboard.GetText()

从剪贴板中获取文本。它运行正常,但是当我在循环中使用剪贴板时它看起来像是在延迟,我得到的内容应该被下一个复制的文本覆盖。如果我把Thread.sleep,它工作正常。我怎样才能快速复制并从一个循环中获取正确的内容而没有延迟?

2 个答案:

答案 0 :(得分:3)

这似乎是一个记录在案的问题。 MSDN承认“时间问题”,但不包括完全绕过它们的方法,尽管似乎有一种“更新”的方法,您需要告诉您的程序默认使用。以下是文档的一部分:

  

已针对.NET Framework 3.0更新了SendKeys类。 SendKeys类易受时序问题的影响,一些开发人员不得不解决这些问题。更新后的实现仍然容易受到时序问题的影响,但速度稍快,可能需要更改解决方法。 SendKeys类首先尝试使用先前的实现,如果失败,则使用新实现。因此,SendKeys类在不同的操作系统上可能会有不同的行为。此外,当SendKeys类使用新实现时,SendWait方法将不会等待将消息发送到另一个进程时进行处理。   如果您的应用程序依赖于一致行为而不考虑操作系统,则可以通过将以下应用程序设置添加到app.config文件来强制SendKeys类使用新实现。

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

我在另一个公告牌上找到了similar (old) issue,但遗憾的是他们的修复与你的一样 - 在访问剪贴板之前延迟了几分之一秒。我找不到任何其他问题的解决方法。考虑到有SendSendWait,期望后者在发送后实际等待似乎并不太多! :)

答案 1 :(得分:3)

您绝对无法在循环中更新剪贴板并希望数据立即可用(并可供您的应用访问)。您发送击键的应用程序正在其自己的进程中运行,并且Windows是多处理,多线程等。所以您正在寻找要更新的剪贴板,在其他应用程序获得之前有机会复制它。
此外,由于可以在系统上运行其他程序,监视剪贴板以进行更新(剪贴板查看器),当您尝试从剪贴板获取数据时,您将与这些程序发生冲突。 我不知道你为什么要做你正在做的事情,但你应该意识到它不会一直有效。在某些情况下,您可以使其工作,但不是所有情况。除非这是您自己使用的教育练习,否则您应该放弃这种方法。

请阅读有关该主题的引用:

“如果没有用户的明确指示,程序不应将数据传输到我们的剪贴板中。” - Charles Petzold,Windows 3.1编程,Microsoft Press,1992