Cara menyalin data ke clipboard di C #

Jawaban:

799

Ada dua kelas yang hidup di majelis yang berbeda dan ruang nama yang berbeda.

  • WinForms: gunakan deklarasi namespace berikut, pastikan Mainditandai dengan [STAThread]atribut:

    using System.Windows.Forms;
  • WPF: gunakan deklarasi namespace berikut

    using System.Windows;
  • konsol: tambahkan referensi System.Windows.Forms, gunakan deklarasi namespace berikut, pastikan Mainditandai dengan [STAThread]atribut. Panduan langkah demi langkah dalam jawaban lain

    using System.Windows.Forms;

Untuk menyalin string yang tepat (dalam hal ini literal):

Clipboard.SetText("Hello, clipboard");

Untuk menyalin konten kotak teks, gunakan TextBox.Copy () atau dapatkan teks terlebih dahulu lalu tetapkan nilai clipboard:

Clipboard.SetText(txtClipboard.Text);

Lihat di sini untuk contoh . Atau ... Dokumentasi resmi MSDN atau Di Sini untuk WPF .


Catatan:

Kieren Johnstone
sumber
@KierenJohnstone Apakah mungkin mengakses konten clipboard menggunakan pasangan nilai kunci?
Abdul
@ Abdul - Saya tidak yakin apa yang Anda maksud. Konten clipboard dapat berupa teks, file, gambar, segala jenis data khusus. Konsep kv-pair sepertinya tidak ada hubungannya dengan ide clipboard?
Kieren Johnstone
@KierenJohnstone yang saya coba buat adalah sesuatu di sana pengguna dapat menyimpan banyak hal di clipboard. Hal-hal itu akan diakses oleh kunci. Ini mirip dengan penyimpanan lokal HTML5. Atau apakah sesuatu seperti itu tidak mungkin karena sifat clipboard?
Abdul
Jika Anda mendapatkan kesalahan dengan ASP.NET, coba gunakan ke utas baru: var utas = utas baru (param => {Clipboard.SetText (txtName.Text);}); thread.SetApartmentState (ApartmentState.STA); thread.Start ();
user3790692
1
Jawaban skia.heliou membantu saya: setelah menambahkan atribut [STAThreadAttribute], metode Clipboard.SetText saya mulai berfungsi
viteo
44

Untuk proyek konsol dengan cara selangkah demi selangkah, Anda harus terlebih dahulu menambahkan System.Windows.Formsreferensi. Langkah-langkah berikut ini berfungsi di Visual Studio Community 2013 dengan .NET 4.5:

  1. Di Solution Explorer , rentangkan proyek konsol Anda.
  2. Klik kanan Referensi , lalu klik Tambahkan Referensi ...
  3. Di grup Assemblies , di bawah Framework , pilih System.Windows.Forms.
  4. Klik OK .

Kemudian, tambahkan usingpernyataan berikut dengan yang lain di bagian atas kode Anda:

using System.Windows.Forms;

Kemudian, tambahkan salah satu dari yang berikut ini Clipboard. SetTextpernyataan untuk kode Anda:

Clipboard.SetText("hello");
// OR
Clipboard.SetText(helloString);

Dan terakhir, tambahkan metode STAThreadAttributeAnda Mainsebagai berikut, untuk menghindari System.Threading.ThreadStateException:

[STAThreadAttribute]
static void Main(string[] args)
{
  // ...
}
skia.heliou
sumber
1
Kelas StackOverflowExceptionsegera mendahului STAThreadAttributedalam .NET Framework System Class Library =)
skia.heliou
42

Pengalaman saya dengan masalah ini menggunakan WPF C # coping ke clipboard dan System.Threading.ThreadStateExceptionada di sini dengan kode saya yang bekerja dengan benar dengan semua browser:

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();

kredit untuk posting ini di sini

Tapi ini hanya berfungsi di localhost, jadi jangan coba ini di server, karena ini tidak akan berfungsi.

Di sisi server, saya melakukannya dengan menggunakan zeroclipboard. Satu-satunya cara, setelah banyak penelitian.

BMaximus
sumber
Saya menggunakannya dalam uji Selenium otomatis (webdriver) dan berfungsi dengan baik!
andrew.fox
@ andrew.fox Anda mencobanya di server Anda - model klien? karena jika ini adalah 2 mesin terpisah saya kira itu tidak akan berfungsi.
BMaximus
Tidak, Selenium membuka jendela browser di mesin agen.
andrew.fox
41
Clipboard.SetText("hello");

Anda harus menggunakan ruang nama System.Windows.Formsatau System.Windowsuntuk itu.

Bradley Smith
sumber
1

Clip.exe adalah executable di Windows untuk mengatur clipboard. Perhatikan bahwa ini tidak bekerja untuk sistem operasi lain selain Windows, yang masih menyebalkan.

        /// <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;
        }
Kernel Korn
sumber