Пожалуйста, смотрите этот комментарий об ошибке 1.7.x. Кажется, проблема заключается в импорте лениво загруженного модуля в AppModule. Удаление этого импорта решило проблему для меня: https://github.com/angular/angular-cli/issues/9488#issuecomment-374037802
Вы можете использовать System.Windows.Forms.Clipboard.SetText (...)
.
System.Windows.Forms.Clipboard.SetText
(Windows Forms) or System.Windows.Clipboard.SetText
(WPF)
WPF: System.Windows.Clipboard
(PresentationCore.dll)
Winforms: System.Windows.Forms.Clipboard
Оба имеют статический Метод SetText
.
Я бы хотел, чтобы вызов 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();
В Windows Forms, если ваша строка находится в текстовом поле, вы можете легко использовать это:
textBoxcsharp.SelectAll();
textBoxcsharp.Copy();
textBoxcsharp.DeselectAll();