C # panoya veri kopyalama


Yanıtlar:


799

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


@KierenJohnstone Pano içeriğine anahtar / değer çiftlerini kullanarak erişmek mümkün müdür?
Abdul

@Abdul - Ne demek istediğinden emin değilim. Pano içeriği metin, dosya, resim, her türlü özel veri olabilir. Kv-pairs kavramı pano fikri ile ilgisi yok mu?
Kieren Johnstone

@KierenJohnstone yapmaya çalıştığım şey, kullanıcının panoda birden fazla şeyi saklayabileceği bir şey. Bu şeylere bir anahtarla erişilirdi. HTML5 Yerel depolamaya benzer. Yoksa panonun doğası gereği böyle bir şey mümkün değil mi?
Abdul

ASP.NET ile hata alıyorsanız, yeni bir iş parçacığı kullanmayı deneyin: var thread = new Thread (param => {Clipboard.SetText (txtName.Text);}); thread.SetApartmentState (ApartmentState.STA); thread.Start ();
user3790692

1
skia.heliou'nun yanıtı bana yardımcı oldu: [STAThreadAttribute] özniteliğini ekledikten sonra, Clipboard.SetText yöntemi çalışmaya başladı
viteo

44

İçin konsol bir adım-adım moda projelerde, önce eklemek gerekecek System.Windows.Formsreferansı. Aşağıdaki adımlar .NET 4.5 ile Visual Studio Community 2013'te çalışır:

  1. Gelen Çözüm Explorer , sizin konsolu projesini genişletmek.
  2. Referanslar'a sağ tıklayın , ardından Referans Ekle ... 'ye tıklayın .
  3. In Meclisleri grup altında Framework seçin System.Windows.Forms.
  4. Tıklayın Tamam .

Ardından, usingkodunuzun üst kısmındaki diğerleriyle birlikte aşağıdaki ifadeyi ekleyin :

using System.Windows.Forms;

Ardından, aşağıdakilerden birini ekleyin Clipboard. SetTextkodunuzun ifadeleri:

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

Ve son olarak, aşağıdakilerden kaçınmak STAThreadAttributeiçin Mainyönteminize aşağıdaki gibi ekleyin System.Threading.ThreadStateException:

[STAThreadAttribute]
static void Main(string[] args)
{
  // ...
}

1
Sınıf StackOverflowExceptionhemen STAThreadAttribute.NET Framework Sistem Sınıf Kitaplığı'nda yer alır =)
skia.heliou

42

WPF C # panoya başa çıkma kullanarak bu sorun ile Deneyimim ve System.Threading.ThreadStateExceptionburada 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.


Otomatik Selenyum testinde (webdriver) kullandım ve harika çalışıyor!
andrew.fox

@ andrew.fox sunucunuzda-istemci modelinde denediniz mi? çünkü 2 ayrı makine ise çalışmamalı.
BMaximus

Lol no, Selenium, ajan makinesinde tarayıcı penceresini açar.
andrew.fox

41
Clipboard.SetText("hello");

Bunun için System.Windows.Formsveya System.Windowsad alanlarını kullanmanız gerekir .


1

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;
        }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.