在不延迟的情况下循环执行剪贴板的复制和粘贴操作。

4
我正在使用以下代码将文本复制到剪贴板。
System.Windows.Forms.SendKeys.SendWait("^c");

然后我使用:
Clipboard.GetText()

从剪贴板获取文本。它可以正常工作,但是当我在循环中使用剪贴板并获取应该被下一个复制的文本覆盖的内容时,它似乎会延迟。如果我加上Thread.sleep,它就可以正常工作。如何在循环中快速复制并获取正确的剪贴板内容而不延迟?


很难回答,因为你没有提供引起问题的代码/循环。 - MethodMan
2个回答

3
这似乎是一个已记录的问题。MSDN 承认存在“时间问题”,但没有提供完全解决它们的方法,尽管似乎有一种“更新”的方法需要默认告诉程序使用。以下是文档的一部分:

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

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

我在另一个布告板上找到了一个类似(旧)问题,但不幸的是他们的解决方法与您的相同 - 在访问剪贴板之前延迟一小部分时间。我找不到其他解决方法。考虑到有一个Send和一个SendWait,期望后者在发送后实际等待似乎并不过分! :)

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

请阅读以下关于此主题的引用:

"程序不应该在没有用户明确指示的情况下将数据传输到剪贴板或从剪贴板传出。”
— Charles Petzold,《Programming Windows 3.1》,Microsoft Press,1992


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接