如何将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
是你想要的。
使用try
– catch
,即使它有错误仍会复制。
Try Clipboard.SetText("copy me to clipboard") Catch ex As Exception End Try
如果使用消息框来捕获exception,则会显示错误,但该值仍然被复制到剪贴板。