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


440

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


Ответы:


799

Есть два класса, которые живут в разных сборках и разных пространствах имен.

  • 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 .


Примечания:


@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:

  1. В обозревателе решений разверните консольный проект.
  2. Щелкните правой кнопкой мыши References , затем нажмите Add Reference ...
  3. В группе Сборки в разделе Framework выберите System.Windows.Forms.
  4. Нажмите ОК .

Затем добавьте следующее 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 =)
skia.heliou

42

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


Я использовал его в автоматическом тесте Selenium (webdriver), и он отлично работает!
andrew.fox

@ andrew.fox вы пробовали это на своем сервере - модель клиента? потому что, если это две отдельные машины, я думаю, это не должно работать.
BMaximus

Нет, Selenium открывает окно браузера на агентском компьютере.
andrew.fox

41
Clipboard.SetText("hello");

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


1

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;
        }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.