Yanıtlar:
Farklı meclislerde ve farklı ad alanlarında yaşayan iki sınıf vardır.
WinForms: aşağıdaki ad alanı bildirimini kullanın, özellik Main
ile işaretlendiğinden emin olun [STAThread]
:
using System.Windows.Forms;
WPF: aşağıdaki ad alanı bildirimini kullanın
using System.Windows;
konsol: referans ekleyin System.Windows.Forms
, aşağıdaki ad alanı bildirimini kullanın, öznitelik Main
ile işaretlendiğinden emin olun [STAThread]
. Başka bir cevapta adım adım kılavuz
using System.Windows.Forms;
Tam bir dizeyi kopyalamak için (bu durumda değişmez değer):
Clipboard.SetText("Hello, clipboard");
Bir metin kutusunun içeriğini kopyalamak için ya TextBox.Copy () kullanın ya da önce metni alın ve ardından pano değerini ayarlayın:
Clipboard.SetText(txtClipboard.Text);
Bir örnek için buraya bakın . Veya ... Resmi MSDN belgeleri veya WPF için Burada .
Uyarılar:
Pano, masaüstü kullanıcı arayüzü konseptidir, ASP.Net gibi sunucu tarafı kodunda ayarlamaya çalışmak sadece sunucuda değer ayarlayacak ve kullanıcının tarayıcıda görebilecekleri üzerinde hiçbir etkisi olmayacaktır. Bağlantılı yanıt, bir kişinin Pano erişim kodu sunucu tarafını çalıştırmasına izin verirken SetApartmentState
, elde etmek istediğiniz şey pek olası değildir.
Bu soru kodunda aşağıdaki bilgileri hala bir istisna alırsa , panoya kopyalama dizesinde "Geçerli iş parçacığı tek iş parçacığı dairesine (STA) ayarlanmalıdır" hatası konusuna bakın.
Bu soru / cevap düzenli .NET kapsar, .NET Core bkz. - .Net Core - panoya kopyalansın mı?
İçin konsol bir adım-adım moda projelerde, önce eklemek gerekecek System.Windows.Forms
referansı. Aşağıdaki adımlar .NET 4.5 ile Visual Studio Community 2013'te çalışır:
System.Windows.Forms
.Ardından, using
kodunuzun üst kısmındaki diğerleriyle birlikte aşağıdaki ifadeyi ekleyin :
using System.Windows.Forms;
Ardından, aşağıdakilerden birini ekleyin Clipboard
. SetText
kodunuzun ifadeleri:
Clipboard.SetText("hello");
// OR
Clipboard.SetText(helloString);
Ve son olarak, aşağıdakilerden kaçınmak STAThreadAttribute
için Main
yönteminize aşağıdaki gibi ekleyin System.Threading.ThreadStateException
:
[STAThreadAttribute]
static void Main(string[] args)
{
// ...
}
StackOverflowException
hemen STAThreadAttribute
.NET Framework Sistem Sınıf Kitaplığı'nda yer alır =)
WPF C # panoya başa çıkma kullanarak bu sorun ile Deneyimim ve System.Threading.ThreadStateException
burada tüm tarayıcılar ile doğru çalışan benim kod ile:
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();
burada bu gönderiye kredi
Ancak bu yalnızca localhost üzerinde çalışır, bu yüzden işe yaramayacağı için bunu bir sunucuda denemeyin.
Sunucu tarafında, bunu kullanarak yaptım zeroclipboard
. Bir çok araştırmadan sonra tek yol.
Clipboard.SetText("hello");
Bunun için System.Windows.Forms
veya System.Windows
ad alanlarını kullanmanız gerekir .
Clip.exe, panoyu ayarlamak için Windows'ta yürütülebilir bir dosyadır. Bu durumun hala berbat olan Windows dışındaki diğer işletim sistemleri için çalışmadığını unutmayın .
/// <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;
}