Есть два класса, которые живут в разных сборках и разных пространствах имен.
WinForms: используйте следующую декларацию пространства имен, убедитесь, что Mainпомечены [STAThread]атрибутом:
using System.Windows.Forms;
WPF: используйте следующую декларацию пространства имен
using System.Windows;
console: добавить ссылку на System.Windows.Forms, использовать следующую декларацию пространства имен, убедиться, что Mainпомечен [STAThread]атрибутом. Пошаговое руководство в другом ответе
using System.Windows.Forms;
Чтобы скопировать точную строку (в данном случае, литерал):
Clipboard.SetText("Hello, clipboard");
Чтобы скопировать содержимое текстового поля, используйте TextBox.Copy () или сначала получите текст, а затем установите значение буфера обмена:
Буфер обмена - это концепция пользовательского интерфейса рабочего стола, попытка установить его в коде на стороне сервера, например ASP.Net, будет устанавливать значение только на сервере и не будет влиять на то, что пользователь может видеть в своем браузере. В то время как связанный ответ позволяет запустить буфер обмена кода доступа со стороны сервера, SetApartmentStateвряд ли это то, чего вы хотите достичь.
@KierenJohnstone Можно ли получить доступ к содержимому буфера обмена, используя пары ключ-значение?
Абдул
@Abdul - Я не уверен, что ты имеешь в виду. Содержимое буфера обмена может быть текстом, файлами, изображениями, любым видом пользовательских данных. Концепция kv-пар не имеет ничего общего с идеей буфера обмена?
Кирен Джонстон
@KierenJohnstone - то, что я пытаюсь сделать, это то, что пользователь может хранить в буфере обмена несколькими вещами. Эти вещи будут доступны по ключу. Это похоже на локальное хранилище HTML5. Или что-то подобное невозможно из-за природы буфера обмена?
Абдул
Если вы получаете ошибку в ASP.NET, попробуйте использовать в новом потоке: var thread = new Thread (param => {Clipboard.SetText (txtName.Text);}); thread.SetApartmentState (ApartmentState.STA); Thread.start ();
user3790692
1
Мне помог ответ skia.heliou: после добавления атрибута [STAThreadAttribute] мой метод Clipboard.SetText начал работать
viteo
44
Для консольных проектов в пошаговом режиме, вам сначала нужно добавить System.Windows.Formsссылку. Следующие шаги работают в Visual Studio Community 2013 с .NET 4.5:
В обозревателе решений разверните консольный проект.
Щелкните правой кнопкой мыши References , затем нажмите Add Reference ...
В группе Сборки в разделе Framework выберите System.Windows.Forms.
Нажмите ОК .
Затем добавьте следующее usingутверждение вместе с другими в верхней части вашего кода:
using System.Windows.Forms;
Затем добавьте одно из следующего Clipboard. SetTextзаявления к вашему коду:
Класс находится StackOverflowExceptionнепосредственно STAThreadAttributeперед библиотекой классов системы .NET Framework =)
skia.heliou
42
Мой опыт решения этой проблемы с использованием WPF C # копируется в буфер обмена и System.Threading.ThreadStateExceptionздесь с моим кодом, который корректно работал со всеми браузерами:
Thread thread =newThread(()=>Clipboard.SetText("String to be copied to clipboard"));
thread.SetApartmentState(ApartmentState.STA);//Set the thread to STA
thread.Start();
thread.Join();
Clip.exe - исполняемый файл в Windows для установки буфера обмена. Обратите внимание, что это не работает для других операционных систем, кроме Windows, которая все еще отстой.
/// <summary>/// Sets clipboard to value./// </summary>/// <param name="value">String to set the clipboard to.</param>publicstaticvoidSetClipboard(stringvalue){if(value==null)thrownewArgumentNullException("Attempt to set clipboard with null");Process clipboardExecutable =newProcess();
clipboardExecutable.StartInfo=newProcessStartInfo// Creates the process{RedirectStandardInput=true,FileName=@"clip",};
clipboardExecutable.Start();
clipboardExecutable.StandardInput.Write(value);// CLIP uses STDIN as input.// When we are done writing all the string, close it so clip doesn't wait and get stuck
clipboardExecutable.StandardInput.Close();return;}
Ответы:
Есть два класса, которые живут в разных сборках и разных пространствах имен.
WinForms: используйте следующую декларацию пространства имен, убедитесь, что
Main
помечены[STAThread]
атрибутом:WPF: используйте следующую декларацию пространства имен
console: добавить ссылку на
System.Windows.Forms
, использовать следующую декларацию пространства имен, убедиться, чтоMain
помечен[STAThread]
атрибутом. Пошаговое руководство в другом ответеЧтобы скопировать точную строку (в данном случае, литерал):
Чтобы скопировать содержимое текстового поля, используйте TextBox.Copy () или сначала получите текст, а затем установите значение буфера обмена:
Смотрите здесь для примера . Или ... Официальная документация MSDN или Здесь для WPF .
Примечания:
Буфер обмена - это концепция пользовательского интерфейса рабочего стола, попытка установить его в коде на стороне сервера, например ASP.Net, будет устанавливать значение только на сервере и не будет влиять на то, что пользователь может видеть в своем браузере. В то время как связанный ответ позволяет запустить буфер обмена кода доступа со стороны сервера,
SetApartmentState
вряд ли это то, чего вы хотите достичь.Если после следующей информации в этом вопросе код все еще получает исключение, см. Ошибку «Текущий поток должен быть установлен как однопотоковая квартира (STA)» в строке копирования в буфер обмена.
Этот вопрос / ответ касается обычного .NET, для .NET Core см. - .Net Core - скопировать в буфер обмена?
источник
Для консольных проектов в пошаговом режиме, вам сначала нужно добавить
System.Windows.Forms
ссылку. Следующие шаги работают в Visual Studio Community 2013 с .NET 4.5:System.Windows.Forms
.Затем добавьте следующее
using
утверждение вместе с другими в верхней части вашего кода:Затем добавьте одно из следующего
Clipboard
.SetText
заявления к вашему коду:И, наконец, добавьте
STAThreadAttribute
к вашемуMain
методу следующее, чтобы избежатьSystem.Threading.ThreadStateException
:источник
StackOverflowException
непосредственноSTAThreadAttribute
перед библиотекой классов системы .NET Framework =)Мой опыт решения этой проблемы с использованием WPF C # копируется в буфер обмена и
System.Threading.ThreadStateException
здесь с моим кодом, который корректно работал со всеми браузерами:кредиты на этот пост здесь
Но это работает только на локальном хосте, поэтому не пытайтесь сделать это на сервере, так как он не будет работать.
На стороне сервера я сделал это с помощью
zeroclipboard
. Единственный способ, после долгих исследований.источник
Для этого вам нужно будет использовать пространства имен
System.Windows.Forms
илиSystem.Windows
.источник
Clip.exe - исполняемый файл в Windows для установки буфера обмена. Обратите внимание, что это не работает для других операционных систем, кроме Windows, которая все еще отстой.
источник