我正尝试用下面的代码从剪贴板获取数据。
private void TestBtn_Click(object sender, EventArgs e)
{
Thread sampleThread = new Thread(SampleMethod);
sampleThread.IsBackground = true;
sampleThread.Start();
Thread.Sleep(2000);
var textFromMain = Clipboard.GetText(TextDataFormat.Text);
}
private void SampleMethod()
{
var textFromThread = Clipboard.GetText(TextDataFormat.Text);
Thread.Sleep(1000);
}
我把这行复制到剪贴板的所有文本-
第一个月
但下面一行返回空字符串或空字符串。var textFromThread = Clipboard.GetText(TextDataFormat.Text);
我不明白是什么问题。有人能帮我弄明白吗?如果是多线程,请给我指出正确的方向。
3条答案
按热度按时间guykilcj1#
Clipboard.GetText(TextDataFormat.Text)
使用COM,如果在未标记STAThreadAttribute
的线程中调用,则引发异常。一种解决方法是使用delegate将
Clipboard.GetText
的调用返回给Invoke的主线程。但是在这种情况下,线程将冻结它在Invoke上的执行,直到SampleMethod()
结束它在主窗体线程上的执行,主线程将被释放。另一种方法是使用自己对COM的调用来获取剪贴板文本,而不是
System.Windows.Forms.Clipboard.GetText()
,请参见ClipboardCom.GetText()
,此方法不需要等待主窗体线程。j8ag8udp2#
我最后使用下面的方法来访问剪贴板文本。
t9eec4r03#
下面的代码对我有效。
灵感来自本文和来源Thread Apartment Safe Open/Save File Dialogs for C#