Відповіді:
Є два класи, які живуть у різних збірках та різних просторах імен.
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;
}