我正在使用以下代码将文本复制到剪贴板。
System.Windows.Forms.SendKeys.SendWait("^c");
然后我用
Clipboard.GetText()
从剪贴板中获取文本。它运行正常,但是当我在循环中使用剪贴板时它看起来像是在延迟,我得到的内容应该被下一个复制的文本覆盖。如果我把Thread.sleep,它工作正常。我怎样才能快速复制并从一个循环中获取正确的内容而没有延迟?
答案 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,但遗憾的是他们的修复与你的一样 - 在访问剪贴板之前延迟了几分之一秒。我找不到任何其他问题的解决方法。考虑到有Send
和SendWait
,期望后者在发送后实际等待似乎并不太多! :)
答案 1 :(得分:3)
您绝对无法在循环中更新剪贴板并希望数据立即可用(并可供您的应用访问)。您发送击键的应用程序正在其自己的进程中运行,并且Windows是多处理,多线程等。所以您正在寻找要更新的剪贴板,在其他应用程序获得之前有机会复制它。
此外,由于可以在系统上运行其他程序,监视剪贴板以进行更新(剪贴板查看器),当您尝试从剪贴板获取数据时,您将与这些程序发生冲突。
我不知道你为什么要做你正在做的事情,但你应该意识到它不会一直有效。在某些情况下,您可以使其工作,但不是所有情况。除非这是您自己使用的教育练习,否则您应该放弃这种方法。
请阅读有关该主题的引用:
“如果没有用户的明确指示,程序不应将数据传输到我们的剪贴板中。” - Charles Petzold,Windows 3.1编程,Microsoft Press,1992