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 :
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 Main
mit [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:
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?
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:
using System.Windows.Forms;
Fügen Sie dann eine der folgenden Optionen hinzu Clipboard
. SetText
Anweisungen zu Ihrem Code:
Clipboard.SetText("hello");
// OR
Clipboard.SetText(helloString);
Und schließlich fügen Sie STAThreadAttribute
Ihrer Main
Methode Folgendes hinzu, um Folgendes zu vermeiden System.Threading.ThreadStateException
:
[STAThreadAttribute]
static void Main(string[] args)
{
// ...
}
StackOverflowException
unmittelbar vor STAThreadAttribute
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:
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.
Clipboard.SetText("hello");
Sie müssen dafür die Namespaces System.Windows.Forms
oder verwenden System.Windows
.
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;
}