System.Windows.Forms.Clipboard.SetText(...)
。System.Windows.Forms.Clipboard.SetText
(Windows Forms)或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版本中的一些边缘情况下需要手动创建,我现在不记得确切的情况了,在.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();
Task
/async
/await
)。 - Alexei LevenkovWPF: 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()
后,字符串将被复制到剪贴板中,因此您可以粘贴或使用 Ctrl + V 将其粘贴回来,获取字符串作为要复制到剪贴板的字符串。
使用这个问题中展示的解决方案,System.Windows.Forms.Clipboard.SetText(...)
会导致以下异常:
在进行OLE调用之前,当前线程必须设置为单线程公寓(STA)模式
为了避免这种情况,你可以添加以下属性:
[STAThread]
为了
static void Main(string[] args)
在Windows Forms中,如果您的字符串在文本框中,则可以轻松使用以下方法:
textBoxcsharp.SelectAll();
textBoxcsharp.Copy();
textBoxcsharp.DeselectAll();
即使有错误,也要使用try
-catch
,它仍然会复制。
Try
Clipboard.SetText("copy me to clipboard")
Catch ex As Exception
End Try