首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在C#中将字符串的内容复制到剪贴板?

如何在C#中将字符串的内容复制到剪贴板?
EN

Stack Overflow用户
提问于 2009-05-22 18:39:36
回答 6查看 193.2K关注 0票数 286

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-05-22 18:42:22

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

票数 372
EN

Stack Overflow用户

发布于 2009-05-22 18:41:31

票数 160
EN

Stack Overflow用户

发布于 2009-05-22 19:09:11

我希望调用SetText有那么简单,但有相当多的陷阱,你必须处理。您必须确保正在调用它的线程正在STA中运行。它有时会因为拒绝访问错误而失败,然后在几秒钟后正常工作-这与剪贴板中的COM计时问题有关。如果您的应用程序是通过远程桌面访问的,则对剪贴板的访问是粗略的。我们使用一个集中的方法来处理所有这些场景,而不是直接调用SetText

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

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

代码语言:javascript
复制
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。

代码语言:javascript
复制
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 );
    }
}

用法如下所示:

代码语言:javascript
复制
new SetClipboardHelper( DataFormats.Text, "See, I'm on the clipboard" ).Go();
票数 68
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/899350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档