Відповіді:
Є два класи, які живуть у різних збірках та різних просторах імен.
WinForms: використовуйте наступне оголошення простору імен, переконайтеся, що Mainпозначено [STAThread]атрибутом:
using System.Windows.Forms;WPF: використовувати наступне оголошення простору імен
using System.Windows;консоль: додайте посилання на 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 System Class Library =)
Мій досвід роботи з цією проблемою з використанням 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();
кредити до цієї публікації тут
Але це працює лише у localhost, тому не намагайтеся це робити на сервері, оскільки це не спрацює.
З боку сервера я це зробив, використовуючи 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;
}