Odpowiedzi:
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 Main
jest 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 Main
jest 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:
Schowek to koncepcja interfejsu użytkownika na pulpicie, próbująca ustawić go w kodzie serwera, np. ASP.Net ustawi wartość tylko na serwerze i nie ma wpływu na to, co użytkownik widzi w przeglądarce. Chociaż połączona odpowiedź pozwala na uruchomienie schowka po stronie serwera z kodem dostępu SetApartmentState
, jest mało prawdopodobne, co chcesz osiągnąć.
Jeśli po podaniu informacji w tym pytaniu kod nadal występuje wyjątek, zobacz „Bieżący wątek musi być ustawiony na mieszkanie z jednym wątkiem (STA)” błąd kopiowania ciągu do schowka
To pytanie / odpowiedź dotyczy zwykłego .NET, dla .NET Core patrz - .Net Core - skopiować do schowka?
W przypadku projektów konsolowych krok po kroku musisz najpierw dodać System.Windows.Forms
odniesienie. Następujące kroki działają w Visual Studio Community 2013 z .NET 4.5:
System.Windows.Forms
.Następnie dodaj następującą using
instrukcję wraz z innymi na górze kodu:
using System.Windows.Forms;
Następnie dodaj jedno z poniższych Clipboard
. SetText
instrukcje do twojego kodu:
Clipboard.SetText("hello");
// OR
Clipboard.SetText(helloString);
Na koniec dodaj STAThreadAttribute
do swojej Main
metody w następujący sposób, aby uniknąć System.Threading.ThreadStateException
:
[STAThreadAttribute]
static void Main(string[] args)
{
// ...
}
StackOverflowException
natychmiast poprzedza STAThreadAttribute
bibliotekę klas systemu .NET Framework =)
Moje doświadczenia z tym problemem związanym z kopiowaniem WPF C # do schowka i System.Threading.ThreadStateException
mó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.
Clipboard.SetText("hello");
W tym celu musisz użyć przestrzeni nazw System.Windows.Forms
lub System.Windows
.
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;
}