Як скопіювати дані у буфер обміну на C #


Відповіді:


799

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

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


Зауваження:


@KierenJohnstone Чи можна отримати доступ до вмісту буфера обміну за допомогою пар ключових значень?
Абдул

@Abdul - я не впевнений, що ти маєш на увазі. Вміст буфера обміну може бути текстом, файлами, зображеннями, будь-якими спеціальними даними. Концепція kv-пар, схоже, не має нічого спільного з ідеєю буфера обміну?
Кірен Джонстоун

@KierenJohnstone, що я намагаюся зробити, - це те, що користувач може зберігати в буфер обміну кілька речей. До цих речей можна було б отримати ключ. Це схоже на локальне зберігання HTML5. Або щось подібне неможливо через характер буфера обміну?
Абдул

Якщо ви отримуєте помилку з ASP.NET, спробуйте скористатися новою темою: var thread = new Thread (param => {Clipboard.SetText (txtName.Text);}); thread.SetApartmentState (ApartmentState.STA); нитка.Start ();
користувач3790692

1
Відповідь skia.heliou мені допоміг: після додавання атрибута [STAThreadAttribute] мій метод Clipboard.SetText почне працювати
viteo

44

Для консольних проектів в моді крок за кроком, ви повинні спочатку додати System.Windows.Formsпосилання. Наступні кроки працюють у Visual Studio Community 2013 з .NET 4.5:

  1. У Провіднику рішень розгорніть проект консолі.
  2. Клацніть правою кнопкою миші Список літератури , а потім натисніть Додати довідку ...
  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 System Class Library =)
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();

кредити до цієї публікації тут

Але це працює лише у localhost, тому не намагайтеся це робити на сервері, оскільки це не спрацює.

З боку сервера я це зробив, використовуючи zeroclipboard. Єдиний спосіб, після безлічі досліджень.


Я використовував його в автоматизованому тесті Selenium (webdriver), і він чудово працює!
andrew.fox

@ andrew.fox ви спробували це на своєму сервері - клієнтській моделі? тому що якщо це 2 окремі машини, я думаю, він не повинен працювати.
BMaximus

Lol ні, 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.