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:
Zwischenablage ist ein Desktop-UI-Konzept. Wenn Sie versuchen, es in serverseitigem Code wie ASP.Net festzulegen, wird nur der Wert auf dem Server festgelegt und es hat keinen Einfluss darauf, was der Benutzer in seinem Browser sehen kann. Während die verknüpfte Antwort es einem ermöglicht, den Server-Zugriffscode für die Zwischenablage damit auszuführen SetApartmentState, ist es unwahrscheinlich, was Sie erreichen möchten.
@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:
Im Projektmappe - Explorer , erweitern Sie Ihr Konsolenprojekt.
Klicken Sie mit der rechten Maustaste auf Referenzen , und klicken Sie dann auf Referenz hinzufügen ...
In der Baugruppen - Gruppe, unter Rahmen wählen System.Windows.Forms.
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:
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 =newThread(()=>Clipboard.SetText("String to be copied to clipboard"));
thread.SetApartmentState(ApartmentState.STA);//Set the thread to STA
thread.Start();
thread.Join();
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>publicstaticvoidSetClipboard(stringvalue){if(value==null)thrownewArgumentNullException("Attempt to set clipboard with null");Process clipboardExecutable =newProcess();
clipboardExecutable.StartInfo=newProcessStartInfo// 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;}
Antworten:
Es gibt zwei Klassen, die in unterschiedlichen Assemblys und unterschiedlichen Namespaces leben.
WinForms: Verwenden Sie die folgende Namespace-Deklaration und stellen Sie sicher, dass
Main
sie mit dem[STAThread]
Attribut markiert ist :WPF: Verwenden Sie die folgende Namespace-Deklaration
Konsole: Verweis auf hinzufügen
System.Windows.Forms
, folgende Namespace-Deklaration verwenden, sicherstellen, dassMain
mit[STAThread]
Attribut markiert ist . Schritt-für-Schritt-Anleitung in einer anderen AntwortSo kopieren Sie eine genaue Zeichenfolge (in diesem Fall Literal):
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:
Ein Beispiel finden Sie hier . Oder ... Offizielle MSDN-Dokumentation oder Hier für WPF .
Bemerkungen:
Zwischenablage ist ein Desktop-UI-Konzept. Wenn Sie versuchen, es in serverseitigem Code wie ASP.Net festzulegen, wird nur der Wert auf dem Server festgelegt und es hat keinen Einfluss darauf, was der Benutzer in seinem Browser sehen kann. Während die verknüpfte Antwort es einem ermöglicht, den Server-Zugriffscode für die Zwischenablage damit auszuführen
SetApartmentState
, ist es unwahrscheinlich, was Sie erreichen möchten.Wenn nach dem Befolgen der Informationen in diesem Fragencode immer noch eine Ausnahme auftritt, lesen Sie den Fehler "Aktueller Thread muss auf Single Thread Apartment (STA) gesetzt sein" beim Kopieren der Zeichenfolge in die Zwischenablage
Diese Frage / Antwort bezieht sich auf reguläres .NET. Für .NET Core siehe - .Net Core - In Zwischenablage kopieren?
quelle
Bei Konsolenprojekten müssen Sie Schritt für Schritt die
System.Windows.Forms
Referenz hinzufügen . Die folgenden Schritte funktionieren in Visual Studio Community 2013 mit .NET 4.5:System.Windows.Forms
.Fügen Sie dann die folgende
using
Anweisung zusammen mit den anderen oben in Ihrem Code hinzu:Fügen Sie dann eine der folgenden Optionen hinzu
Clipboard
.SetText
Anweisungen zu Ihrem Code:Und schließlich fügen Sie
STAThreadAttribute
IhrerMain
Methode Folgendes hinzu, um Folgendes zu vermeidenSystem.Threading.ThreadStateException
:quelle
StackOverflowException
unmittelbar vorSTAThreadAttribute
der .NET Framework System Class Library =)Meine Erfahrung mit diesem Problem bei der Verwendung von WPF C # in der Zwischenablage und
System.Threading.ThreadStateException
hier mit meinem Code, der mit allen Browsern korrekt funktioniert hat: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.quelle
Sie müssen dafür die Namespaces
System.Windows.Forms
oder verwendenSystem.Windows
.quelle
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 .
quelle