c# - 如何通过任务使用 Clipboard.GetText?

标签 c# multithreading task clipboard

我正在编写一个 Windows 窗体应用程序来自动化一个旧软件。为了在该软件和我的应用程序之间传输信息,我使用剪贴板。单击旧软件上的按钮会将一些信息放入剪贴板。

要使用 Clipboard.GetText,我应该从 Windows 窗体调用它。但我不希望 UI 线程上的所有内容。

在另一个任务中调用 Clipboard.GetText 时,我得到它说你应该从 STAThread 调用 Clipboard.GetText。

最佳答案

您将不得不改变您的期望。标准要求是只有 UI 线程与剪贴板交互。

从技术上讲,如文档中所述,实际要求只是 single-threaded apartment (STA) threads可以访问剪贴板。由于大多数后台线程(如 .NET 中的 ThreadPool 类创建的线程)都是多线程单元 (MTA) 线程,因此它们无法访问剪贴板。您可以通过手动创建自己的 STA 线程并在其上运行消息泵来解决此问题,但仅使用 UI 线程要容易得多,因此每个人都这样做。

但是,尝试使用剪贴板在两个进程之间共享信息是一个糟糕的设计。剪贴板旨在供用户 存储信息。您写入剪贴板的任何内容都会破坏用户存储在那里的任何内容。如果您的应用程序这样做,并覆盖了我想保留的内容,我会非常生您的气。

有更好的方法让进程相互通信;搜索“进程间通信”(缩写为“IPC”)以获取各种想法。

关于c# - 如何通过任务使用 Clipboard.GetText?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40828588/

相关文章:

c# - 测试此任务的正确方法是什么?

c# - Resharper 的 "Object allocation (evident)"是什么意思?

c# - 在 EF 的延迟加载上使用自定义 where 子句

java - 我怎样才能停止我的申请?

c++ - Windows 驱动程序、自旋锁获取和条件测试

workflow - Odoo 8 项目工作流程 - 为任务添加新阶段

c# - 创建垂直菜单

c# - WMI 太慢了

java - 短暂但频繁的工作:HandlerThread或ThreadPoolExecutor?

c# - MaxDegreeOfParallelism 不适用于任务列表?