Как скопировать данные в буфер обмена в C #

356

Как скопировать строку (например, "привет" ) в системный буфер обмена на С#, поэтому в следующий раз я нажимаю CTRL+V, я получу "привет"?

Теги:
clipboard

4 ответа

646
Лучший ответ

Вам понадобится объявление пространства имен:

using System.Windows.Forms;

ИЛИ для WPF:

using System.Windows;

Чтобы скопировать точную строку (буквальный в этом случае):

Clipboard.SetText("Hello, clipboard");

Чтобы скопировать содержимое текстового поля:

Clipboard.SetText(txtClipboard.Text);

См. здесь пример. Или... Официальная документация MSDN или Здесь для WPF.

  • 2
    Да, WinForms и WPF ... Есть ли шанс сделать это в консольном приложении?
  • 0
    @KierenJohnstone Возможно ли получить доступ к содержимому буфера обмена, используя пары ключ-значение?
Показать ещё 5 комментариев
40
Clipboard.SetText("hello");

Для этого вам нужно использовать пространства имен System.Windows.Forms или System.Windows.

  • 1
    Тот же ответ, что и stackoverflow.com/a/3546026/206730 - Может быть, лучше удалить его, IMHO, будучи новичком с SO
33

Мой опыт решения этой проблемы с использованием WPF С# для копирования в буфер обмена и 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. Единственный способ, после долгих исследований.

  • 0
    Я использовал его в автоматическом тесте Selenium (webdriver), и он отлично работает!
  • 0
    @ andrew.fox вы пробовали это на своем сервере - модель клиента? потому что, если это 2 отдельные машины, я думаю, это не должно работать.
Показать ещё 1 комментарий
27

Для консольных проектов поэтапно вы должны сначала добавить ссылку 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)
{
  // ...
}
  • 1
    Класс StackOverflowException непосредственно предшествует STAThreadAttribute в .NET Framework System Class Library =)
  • 1
    Вы можете сократить [STAThreadAttribute] до [STAThread] Fyi

Ещё вопросы

Сообщество Overcoder
Наверх
Меню