Jawaban:
Ada dua kelas yang hidup di majelis yang berbeda dan ruang nama yang berbeda.
WinForms: gunakan deklarasi namespace berikut, pastikan Main
ditandai 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 Main
ditandai 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:
Clipboard adalah konsep UI desktop, mencoba mengaturnya dalam kode sisi server seperti ASP.Net hanya akan menetapkan nilai pada server dan tidak berdampak pada apa yang dapat dilihat pengguna di browser mereka. Sementara jawaban yang ditautkan memungkinkan seseorang untuk menjalankan sisi server kode akses Clipboard SetApartmentState
tidak seperti apa yang ingin Anda capai.
Jika setelah mengikuti informasi dalam kode pertanyaan ini masih mendapatkan pengecualian, lihat kesalahan "Thread saat ini harus diatur ke apartemen single thread (STA)" dalam string salinan ke clipboard
Pertanyaan / jawaban ini mencakup .NET biasa, untuk .NET Core lihat - .Net Core - salin ke clipboard?
Untuk proyek konsol dengan cara selangkah demi selangkah, Anda harus terlebih dahulu menambahkan System.Windows.Forms
referensi. Langkah-langkah berikut ini berfungsi di Visual Studio Community 2013 dengan .NET 4.5:
System.Windows.Forms
.Kemudian, tambahkan using
pernyataan berikut dengan yang lain di bagian atas kode Anda:
using System.Windows.Forms;
Kemudian, tambahkan salah satu dari yang berikut ini Clipboard
. SetText
pernyataan untuk kode Anda:
Clipboard.SetText("hello");
// OR
Clipboard.SetText(helloString);
Dan terakhir, tambahkan metode STAThreadAttribute
Anda Main
sebagai berikut, untuk menghindari System.Threading.ThreadStateException
:
[STAThreadAttribute]
static void Main(string[] args)
{
// ...
}
StackOverflowException
segera mendahului STAThreadAttribute
dalam .NET Framework System Class Library =)
Pengalaman saya dengan masalah ini menggunakan WPF C # coping ke clipboard dan System.Threading.ThreadStateException
ada 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.
Clipboard.SetText("hello");
Anda harus menggunakan ruang nama System.Windows.Forms
atau System.Windows
untuk itu.
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;
}