代码之家  ›  专栏  ›  技术社区  ›  Elie

如何将字符串的内容复制到c_中的剪贴板?

  •  240
  • Elie  · 技术社区  · 15 年前

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

    8 回复  |  直到 7 年前
        1
  •  308
  •   bluish dmajkic    12 年前

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

        3
  •  62
  •   Noctis    9 年前

    我希望打电话 SetText 是不是很容易,但有很多问题你必须处理。您必须确保调用它的线程正在STA中运行。它有时会因拒绝访问错误而失败,几秒钟后就可以正常工作,这与剪贴板中的COM计时问题有关。如果您的应用程序是通过远程桌面访问的,那么对剪贴板的访问是粗略的。我们使用集中的方法来处理所有这些场景,而不是调用 设置文本 直接。

    @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();
    }
    

    然后我们有一个特定的类来设置剪贴板上的文本。创建一个 DataObject 在某些版本的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();
    
        4
  •  21
  •   bluish dmajkic    10 年前

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

    WiFrase: System.Windows.Forms.Clipboard

    两者都有静电 SetText 方法。

        5
  •  16
  •   Peter Mortensen John Conde    7 年前

    这对我很有用:

    你想做的事:

    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 把绳子拿回来 要复制到剪贴板的字符串 .

        6
  •  12
  •   Peter Mortensen John Conde    7 年前

    使用这个问题中的解决方案, System.Windows.Forms.Clipboard.SetText(...) ,导致异常:

    在进行OLE调用之前,必须将当前线程设置为单线程单元(STA)模式。

    要防止出现这种情况,可以添加属性:

    [STAThread]
    

    static void Main(string[] args)
    
        7
  •  5
  •   Peter Mortensen John Conde    7 年前

    在Windows窗体中,如果字符串位于文本框中,则可以轻松地使用:

    textBoxcsharp.SelectAll();
    textBoxcsharp.Copy();
    textBoxcsharp.DeselectAll();
    
        8
  •  0
  •   Peter Mortensen John Conde    7 年前

    使用 try - catch ,即使有错误,它仍然会复制。

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

    如果使用消息框捕获异常,它将显示错误,但值仍被复制到剪贴板。