如果我在字符串中有一些文本,我如何将其复制到剪贴板,以便用户可以将其粘贴到另一个窗口(例如,从我的应用程序到记事本)?


当前回答

使用这个问题中显示的解决方案System.Windows.Forms.Clipboard.SetText(…),会导致异常:

在OLE调用之前,当前线程必须设置为单线程公寓(STA)模式

为了防止这种情况,你可以添加属性:

[STAThread]

to

static void Main(string[] args)

其他回答

使用try-catch,即使它有错误,它仍然会复制。

Try
   Clipboard.SetText("copy me to clipboard")
Catch ex As Exception

End Try

如果使用消息框捕获异常,它将显示错误,但值仍然复制到剪贴板。

System.Windows.Clipboard (PresentationCore.dll)

Winforms: System.Windows.Forms.Clipboard

两者都有一个静态的SetText方法。

System.Windows.Forms.Clipboard.SetText (Windows窗体)或System.Windows.Clipboard.SetText (WPF)

你可以使用System.Windows.Forms.Clipboard.SetText(…)。

这对我来说很管用:

你想做的是:

System.Windows.Forms.Clipboard.SetText("String to be copied to Clipboard");

但是它会导致一个错误,说它必须在ApartmentState.STA的单个线程中。

让我们让它在这样一个线程中运行。它的代码:

public void somethingToRunInThread()
{
    System.Windows.Forms.Clipboard.SetText("String to be copied to Clipboard");
}

protected void copy_to_clipboard()
{
    Thread clipboardThread = new Thread(somethingToRunInThread);
    clipboardThread.SetApartmentState(ApartmentState.STA);
    clipboardThread.IsBackground = false;
    clipboardThread.Start();
}

在调用copy_to_clipboard()之后,字符串被复制到剪贴板中,因此您可以使用Paste或Ctrl + V并将字符串作为string返回,以复制到剪贴板中。