Jak skopiować dane do schowka w C #

Odpowiedzi:

798

Istnieją dwie klasy, które żyją w różnych zestawach i różnych przestrzeniach nazw.

  • WinForms: użyj następującej deklaracji przestrzeni nazw, upewnij się, że Mainjest oznaczony [STAThread]atrybutem:

    using System.Windows.Forms;
  • WPF: użyj następującej deklaracji przestrzeni nazw

    using System.Windows;
  • konsola: dodaj odniesienie do System.Windows.Forms, użyj następującej deklaracji przestrzeni nazw, upewnij się, że Mainjest oznaczony [STAThread]atrybutem. Przewodnik krok po kroku w innej odpowiedzi

    using System.Windows.Forms;

Aby skopiować dokładny ciąg znaków (w tym przypadku dosłowny):

Clipboard.SetText("Hello, clipboard");

Aby skopiować zawartość pola tekstowego, użyj TextBox.Copy () lub pobierz najpierw tekst, a następnie ustaw wartość schowka:

Clipboard.SetText(txtClipboard.Text);

Zobacz tutaj przykład . Lub ... Oficjalna dokumentacja MSDN lub tutaj dla WPF .


Uwagi:

Kieren Johnstone
źródło
@KierenJohnstone Czy można uzyskać dostęp do zawartości schowka za pomocą par klucz-wartość?
Abdul
@Abdul - Nie jestem pewien, co masz na myśli. Treść schowka może być tekstem, plikami, obrazami, dowolnymi niestandardowymi danymi. Koncepcja par kv wydaje się nie mieć nic wspólnego z pomysłem schowka?
Kieren Johnstone
@KierenJohnstone to, co próbuję zrobić, to coś, w którym użytkownik może przechowywać wiele rzeczy w schowku. Do tych rzeczy można uzyskać dostęp za pomocą klucza. Jest podobny do lokalnego magazynu HTML5. A może coś takiego nie jest możliwe ze względu na charakter schowka?
Abdul
Jeśli otrzymujesz błąd związany z ASP.NET, spróbuj użyć nowego wątku: var thread = new Thread (param => {Clipboard.SetText (txtName.Text);}); thread.SetApartmentState (ApartmentState.STA); thread.Start ();
user3790692
1
Odpowiedź skia.heliou pomogła mi: po dodaniu atrybutu [STAThreadAttribute] moja metoda Clipboard.SetText zaczyna działać
viteo 14.09.17
44

W przypadku projektów konsolowych krok po kroku musisz najpierw dodać System.Windows.Formsodniesienie. Następujące kroki działają w Visual Studio Community 2013 z .NET 4.5:

  1. W Eksploratorze rozwiązań rozwiń projekt konsoli.
  2. Kliknij prawym przyciskiem myszy Referencje , a następnie kliknij polecenie Dodaj referencję ...
  3. W grupie Złożenia w ramach Framework wybierzSystem.Windows.Forms .
  4. Kliknij OK .

Następnie dodaj następującą usinginstrukcję wraz z innymi na górze kodu:

using System.Windows.Forms;

Następnie dodaj jedno z poniższych Clipboard. SetTextinstrukcje do twojego kodu:

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

Na koniec dodaj STAThreadAttributedo swojej Mainmetody w następujący sposób, aby uniknąć System.Threading.ThreadStateException:

[STAThreadAttribute]
static void Main(string[] args)
{
  // ...
}
skia.heliou
źródło
1
Klasa StackOverflowExceptionnatychmiast poprzedza STAThreadAttributebibliotekę klas systemu .NET Framework =)
skia.heliou
42

Moje doświadczenia z tym problemem związanym z kopiowaniem WPF C # do schowka i System.Threading.ThreadStateExceptionmój kod działający poprawnie ze wszystkimi przeglądarkami:

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

kredyty do tego postu tutaj

Ale działa to tylko na localhost, więc nie próbuj tego na serwerze, ponieważ to nie zadziała.

Po stronie serwera zrobiłem to za pomocą zeroclipboard. Jedyny sposób, po wielu badaniach.

BMaximus
źródło
Użyłem go w automatycznym teście Selenium (webdriver) i działa świetnie!
andrew.fox
@ andrew.fox próbowałeś tego na swoim serwerze - modelu klienta? ponieważ jeśli są to 2 oddzielne maszyny, to chyba nie powinno działać.
BMaximus
Lol nie, Selenium otwiera okno przeglądarki na komputerze agenta.
andrew.fox
41
Clipboard.SetText("hello");

W tym celu musisz użyć przestrzeni nazw System.Windows.Formslub System.Windows.

Bradley Smith
źródło
1

Clip.exe to plik wykonywalny w systemie Windows do ustawiania schowka. Pamiętaj, że nie działa to w przypadku innych systemów operacyjnych innych niż Windows, który wciąż jest do bani.

        /// <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;
        }
Jądro Korn
źródło