如果字符串中有一些文本,我如何将其复制到剪贴板,以便用户可以将其粘贴到另一个窗口中(例如,从我的应用程序粘贴到记事本)?
发布于 2009-05-22 18:42:22
您可以使用System.Windows.Forms.Clipboard.SetText(...)
。
发布于 2009-05-22 18:41:31
System.Windows.Forms.Clipboard.SetText
(Windows窗体)或System.Windows.Clipboard.SetText
(WPF)
发布于 2009-05-22 19:09:11
我希望调用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中,手动创建DataObject
是必需的,我现在已经记不清具体的场景了,在Windows3.5中可能不需要手动创建.NET。
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();
https://stackoverflow.com/questions/899350
复制相似问题