4

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

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

然后我用

Clipboard.GetText()

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

4

2 回答 2

3

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

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

“在没有用户明确指示的情况下,程序不应将数据从剪贴板传输到我们的外部。”<br> — Charles Petzold,Programming Windows 3.1,Microsoft Press,1992

于 2013-03-15T20:34:05.860 回答
3

这似乎是一个记录在案的问题。MSDN承认“时间问题”,但不包括完全解决这些问题的方法,尽管似乎确实有一种“较新”的方法,您需要告诉您的程序默认使用该方法。这是文档的一部分:

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

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

我在另一个公告板上发现了类似的(旧)问题,但不幸的是,他们的修复与您的相同 - 在访问剪贴板之前延迟几分之一秒。我找不到任何其他解决该问题的方法。考虑到有 aSend和 a SendWait,期望后者在发送后实际等待似乎并不过分!:)

于 2013-03-15T20:25:57.993 回答