如何将string的内容复制到C#中的剪贴板?

如果我有一些string中的文本,我怎样才能将其复制到剪贴板,以便用户可以将其粘贴到另一个窗口(例如,从我的应用程序到记事本)?

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

System.Windows.Forms.Clipboard.SetText (Winforms)或System.Windows.Clipboard.SetText (WPF)

我希望打电话给SetText是很容易的,但是还有很多问题需要处理。 您必须确保您正在调用它的线程正在STA中运行。 它有时可能会因访问被拒绝错误而失败,然后几秒钟后就会毫无问题地出现 – 这与剪贴板中的COM时间问题有关。 如果您的应用程序通过远程桌面访问剪贴板是粗略的。 我们使用集中式方法来处理所有这些场景,而不是直接调用SetText

@Stecy:这是我们的集中代码:

StaHelper类只是在单线程单元(STA)中的线程上执行一些任意代码 – 剪贴板所需的。

 abstract class StaHelper { readonly ManualResetEvent _complete = new ManualResetEvent( false ); public void Go() { var thread = new Thread( new ThreadStart( DoWork ) ) { IsBackground = true, } thread.SetApartmentState( ApartmentState.STA ); thread.Start(); } // Thread entry method private void DoWork() { try { _complete.Reset(); Work(); } catch( Exception ex ) { if( DontRetryWorkOnFailed ) throw; else { try { Thread.Sleep( 1000 ); Work(); } catch { // ex from first exception LogAndShowMessage( ex ); } } } finally { _complete.Set(); } } public bool DontRetryWorkOnFailed{ get; set; } // Implemented in base class to do actual work. protected abstract void Work(); } 

然后我们有一个特定的类来设置剪贴板上的文本。 在某些Windows / .NET版本的某些边缘情况下,需要手动创buildDataObject 。 我现在不记得确切的情况,它可能不需要在.NET 3.5中。

 class SetClipboardHelper : StaHelper { readonly string _format; readonly object _data; public SetClipboardHelper( string format, object data ) { _format = format; _data = data; } protected override void Work() { var obj = new System.Windows.Forms.DataObject( _format, _data ); Clipboard.SetDataObject( obj, true ); } } 

用法如下所示:

 new SetClipboardHelper( DataFormats.Text, "See, I'm on the clipboard" ).Go(); 

WPF: System.Windows.Clipboard (PresentationCore.dll)

Winforms: 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() ,string被复制到剪贴板,所以你可以粘贴或Ctrl + V,并获取string作为string复制到剪贴板

使用此问题中显示的解决scheme, System.Windows.Forms.Clipboard.SetText(...) ,导致exception:

当前的线程必须设置为单线程单元(STA)模式才能进行OLE调用

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

 [STAThread] 

 static void Main(string[] args) 

在Windows窗体中,如果你的string在文本框中,你可以很容易地使用这个:

 textBoxcsharp.SelectAll(); textBoxcsharp.Copy(); textBoxcsharp.DeselectAll(); 

Clipboard.SetText是你想要的。

使用trycatch ,即使它有错误仍会复制。

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

如果使用消息框来捕获exception,则会显示错误,但该值仍然被复制到剪贴板。