Как я копирую содержание Строки к буферу обмена в C#?

Пожалуйста, смотрите этот комментарий об ошибке 1.7.x. Кажется, проблема заключается в импорте лениво загруженного модуля в AppModule. Удаление этого импорта решило проблему для меня: https://github.com/angular/angular-cli/issues/9488#issuecomment-374037802

257
задан Peter Mortensen 15 January 2017 в 05:22
поделиться

5 ответов

Вы можете использовать System.Windows.Forms.Clipboard.SetText (...) .

329
ответ дан 23 November 2019 в 02:43
поделиться
137
ответ дан 23 November 2019 в 02:43
поделиться

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

Winforms: System.Windows.Forms.Clipboard

Оба имеют статический Метод SetText .

22
ответ дан 23 November 2019 в 02:43
поделиться

Я бы хотел, чтобы вызов SetText был таким простым, но есть немало подводных камней, с которыми вам придется иметь дело. Вы должны убедиться, что поток, который вы вызываете, работает в STA. Иногда он может выйти из строя с ошибкой отказа в доступе, а затем работать через несколько секунд без проблем - что-то связано с проблемами синхронизации COM в буфере обмена. И если доступ к вашему приложению осуществляется через удаленный рабочий стол, доступ к буферу обмена будет отрывочным. Мы используем централизованный метод для обработки всех этих сценариев вместо прямого вызова SetText .

@Stecy: Вот наш централизованный код:

Класс StaHelper просто выполняет некоторый произвольный код в потоке в Single Thread Apartment (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();
64
ответ дан 23 November 2019 в 02:43
поделиться

В Windows Forms, если ваша строка находится в текстовом поле, вы можете легко использовать это:

textBoxcsharp.SelectAll();
textBoxcsharp.Copy();
textBoxcsharp.DeselectAll();
7
ответ дан 23 November 2019 в 02:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: