So kopieren Sie Daten in C # in die Zwischenablage

Antworten:

798

Es gibt zwei Klassen, die in unterschiedlichen Assemblys und unterschiedlichen Namespaces leben.

  • WinForms: Verwenden Sie die folgende Namespace-Deklaration und stellen Sie sicher, dass Mainsie mit dem [STAThread]Attribut markiert ist :

    using System.Windows.Forms;
  • WPF: Verwenden Sie die folgende Namespace-Deklaration

    using System.Windows;
  • Konsole: Verweis auf hinzufügen System.Windows.Forms, folgende Namespace-Deklaration verwenden, sicherstellen, dass Mainmit [STAThread]Attribut markiert ist . Schritt-für-Schritt-Anleitung in einer anderen Antwort

    using System.Windows.Forms;

So kopieren Sie eine genaue Zeichenfolge (in diesem Fall Literal):

Clipboard.SetText("Hello, clipboard");

Um den Inhalt eines Textfelds zu kopieren, verwenden Sie entweder TextBox.Copy () oder rufen Sie zuerst Text ab und legen Sie dann den Wert für die Zwischenablage fest:

Clipboard.SetText(txtClipboard.Text);

Ein Beispiel finden Sie hier . Oder ... Offizielle MSDN-Dokumentation oder Hier für WPF .


Bemerkungen:

Kieren Johnstone
quelle
@KierenJohnstone Ist es möglich, über Schlüssel-Wert-Paare auf Inhalte der Zwischenablage zuzugreifen?
Abdul
@Abdul - Ich bin mir nicht sicher, was du meinst. Der Inhalt der Zwischenablage kann Text, Dateien, Bilder und jede Art von benutzerdefinierten Daten sein. Das Konzept der kv-Paare scheint nichts mit der Idee der Zwischenablage zu tun zu haben?
Kieren Johnstone
@KierenJohnstone Was ich versuche zu machen, ist etwas, das ein Benutzer dort in der Zwischenablage speichern kann. Auf diese Dinge würde über einen Schlüssel zugegriffen. Es ähnelt dem lokalen HTML5-Speicher. Oder ist so etwas aufgrund der Art der Zwischenablage nicht möglich?
Abdul
Wenn bei ASP.NET eine Fehlermeldung angezeigt wird, versuchen Sie, einen neuen Thread zu verwenden: var thread = new Thread (param => {Clipboard.SetText (txtName.Text);}); thread.SetApartmentState (ApartmentState.STA); thread.Start ();
user3790692
1
Die Antwort von skia.heliou hat mir geholfen: Nachdem ich das Attribut [STAThreadAttribute] hinzugefügt habe, funktioniert meine Clipboard.SetText-Methode
viteo
44

Bei Konsolenprojekten müssen Sie Schritt für Schritt die System.Windows.FormsReferenz hinzufügen . Die folgenden Schritte funktionieren in Visual Studio Community 2013 mit .NET 4.5:

  1. Im Projektmappe - Explorer , erweitern Sie Ihr Konsolenprojekt.
  2. Klicken Sie mit der rechten Maustaste auf Referenzen , und klicken Sie dann auf Referenz hinzufügen ...
  3. In der Baugruppen - Gruppe, unter Rahmen wählen System.Windows.Forms.
  4. Klicken Sie auf OK .

Fügen Sie dann die folgende usingAnweisung zusammen mit den anderen oben in Ihrem Code hinzu:

using System.Windows.Forms;

Fügen Sie dann eine der folgenden Optionen hinzu Clipboard. SetTextAnweisungen zu Ihrem Code:

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

Und schließlich fügen Sie STAThreadAttributeIhrer MainMethode Folgendes hinzu, um Folgendes zu vermeiden System.Threading.ThreadStateException:

[STAThreadAttribute]
static void Main(string[] args)
{
  // ...
}
skia.heliou
quelle
1
Die Klasse steht StackOverflowExceptionunmittelbar vor STAThreadAttributeder .NET Framework System Class Library =)
skia.heliou
42

Meine Erfahrung mit diesem Problem bei der Verwendung von WPF C # in der Zwischenablage und System.Threading.ThreadStateExceptionhier mit meinem Code, der mit allen Browsern korrekt funktioniert hat:

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

Credits zu diesem Beitrag hier

Dies funktioniert jedoch nur auf localhost. Versuchen Sie dies also nicht auf einem Server, da dies nicht funktionieren wird.

Auf der Serverseite habe ich es mit gemacht zeroclipboard. Der einzige Weg nach viel Recherche.

BMaximus
quelle
Ich habe es im automatisierten Selenium-Test (Webdriver) verwendet und es funktioniert großartig!
andrew.fox
@ andrew.fox hast du es auf deinem Server versucht - Client Modell? denn wenn es 2 separate Maschinen sind, denke ich, sollte es nicht funktionieren.
BMaximus
Lol nein, Selenium öffnet das Browserfenster auf dem Agentencomputer.
andrew.fox
41
Clipboard.SetText("hello");

Sie müssen dafür die Namespaces System.Windows.Formsoder verwenden System.Windows.

Bradley Smith
quelle
1

Clip.exe ist eine ausführbare Datei in Windows zum Festlegen der Zwischenablage. Beachten Sie, dass dies nicht für andere Betriebssysteme als Windows funktioniert , was immer noch nicht funktioniert .

        /// <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
quelle