Wie kann ich eine Zeichenfolge (z. B. "Hallo") in die System-Zwischenablage in C# kopieren, so dass das nächste Mal, wenn ich drücke CTRL+V Ich werde "Hallo" sagen?
Antworten
Zu viele Anzeigen?Es gibt zwei Klassen, die in verschiedenen Assemblies und verschiedenen Namespaces leben.
-
WinForms: Verwenden Sie folgende Namespace-Deklaration, stellen Sie sicher
Main
ist gekennzeichnet mit[STAThread]
Attribut:using System.Windows.Forms;
-
WPF: Verwenden Sie folgende Namespace-Deklaration
using System.Windows;
-
Konsole: Verweis hinzufügen auf
System.Windows.Forms
verwenden Sie die folgende Namespace-Deklaration und stellen Sie sicher, dassMain
ist gekennzeichnet mit[STAThread]
Attribut. Schritt-für-Schritt-Anleitung in einem anderen Antwortusing System.Windows.Forms;
Zum Kopieren einer exakten Zeichenkette (in diesem Fall ein Literal):
Clipboard.SetText("Hello, clipboard");
Um den Inhalt eines Textfeldes zu kopieren, verwenden Sie entweder TextBox.Copy() oder zuerst den Text abrufen und dann den Wert für die Zwischenablage festlegen:
Clipboard.SetText(txtClipboard.Text);
Siehe hier für ein Beispiel . Oder... Offizielle MSDN-Dokumentation o Hier für WPF .
Bemerkung:
-
Zwischenablage ist Desktop-UI-Konzept, versuchen, es in Server-Side-Code wie ASP.Net wird nur Wert auf dem Server und hat keinen Einfluss auf das, was der Benutzer in sie sehen können Browser gesetzt. Während die verlinkte Antwort erlaubt, den Code für den Zugriff auf die Zwischenablage serverseitig auszuführen mit
SetApartmentState
ist es unwahrscheinlich, dass Sie das erreichen wollen. -
Wenn nach dem Befolgen der Informationen in dieser Frage Code immer noch eine Ausnahme erhält, siehe "Aktueller Thread muss auf Single-Thread-Apartment (STA) eingestellt sein" Fehler beim Kopieren der Zeichenfolge in die Zwischenablage
-
Diese Frage/Antwort bezieht sich auf normales .NET, für .NET Core siehe - .Net Core - in die Zwischenablage kopieren?
Para Konsole Projekte schrittweise zu erstellen, müssen Sie zunächst die System.Windows.Forms
Hinweis. Die folgenden Schritte funktionieren in Visual Studio Community 2013 mit .NET 4.5:
- En Lösung 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 Rahmenwerk auswählen
System.Windows.Forms
. - Klicken Sie auf OK .
Dann fügen Sie Folgendes hinzu using
Anweisung zusammen mit den anderen Anweisungen am Anfang Ihres Codes:
using System.Windows.Forms;
Fügen Sie dann einen der folgenden Punkte hinzu Clipboard
. SetText
Anweisungen zu Ihrem Code hinzufügen:
Clipboard.SetText("hello");
// OR
Clipboard.SetText(helloString);
Und zum Schluss fügen Sie STAThreadAttribute
zu Ihrem Main
Methode wie folgt, um eine System.Threading.ThreadStateException
:
[STAThreadAttribute]
static void Main(string[] args)
{
// ...
}
Meine Erfahrung mit diesem Problem mit WPF C# Kopieren in die Zwischenablage und System.Threading.ThreadStateException
ist hier mit meinem Code, der mit allen Browsern korrekt funktioniert:
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 ici
Dies funktioniert jedoch nur auf localhost, also versuchen Sie es nicht auf einem Server, da es nicht funktionieren wird.
Auf der Serverseite habe ich das mit Hilfe von zeroclipboard
. Der einzige Weg, nach einer Menge von Forschung.
Clip.exe ist eine ausführbare Datei in Windows zum Einrichten der Zwischenablage. Note dass dies nicht funktioniert für andere Betriebssysteme außer Windows, das immer noch scheiße ist.
/// <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;
}
- See previous answers
- Weitere Antworten anzeigen