Ответы:
Есть два класса, которые живут в разных сборках и разных пространствах имен.
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 () или сначала получите текст, а затем установите значение буфера обмена:
Clipboard.SetText(txtClipboard.Text);
Смотрите здесь для примера . Или ... Официальная документация 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
утверждение вместе с другими в верхней части вашего кода:
using System.Windows.Forms;
Затем добавьте одно из следующего Clipboard
. SetText
заявления к вашему коду:
Clipboard.SetText("hello");
// OR
Clipboard.SetText(helloString);
И, наконец, добавьте STAThreadAttribute
к вашему Main
методу следующее, чтобы избежать System.Threading.ThreadStateException
:
[STAThreadAttribute]
static void Main(string[] args)
{
// ...
}
StackOverflowException
непосредственно STAThreadAttribute
перед библиотекой классов системы .NET Framework =)
Мой опыт решения этой проблемы с использованием WPF C # копируется в буфер обмена и System.Threading.ThreadStateException
здесь с моим кодом, который корректно работал со всеми браузерами:
Thread thread = new Thread(() => Clipboard.SetText("String to be copied to clipboard"));
thread.SetApartmentState(ApartmentState.STA); //Set the thread to STA
thread.Start();
thread.Join();
кредиты на этот пост здесь
Но это работает только на локальном хосте, поэтому не пытайтесь сделать это на сервере, так как он не будет работать.
На стороне сервера я сделал это с помощью zeroclipboard
. Единственный способ, после долгих исследований.
Clipboard.SetText("hello");
Для этого вам нужно будет использовать пространства имен System.Windows.Forms
или System.Windows
.
Clip.exe - исполняемый файл в Windows для установки буфера обмена. Обратите внимание, что это не работает для других операционных систем, кроме Windows, которая все еще отстой.
/// <summary>
/// Sets clipboard to value.
/// </summary>
/// <param name="value">String to set the clipboard to.</param>
public static void SetClipboard(string value)
{
if (value == null)
throw new ArgumentNullException("Attempt to set clipboard with null");
Process clipboardExecutable = new Process();
clipboardExecutable.StartInfo = new ProcessStartInfo // 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;
}