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 Mainjest 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 Mainjest 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.Formsodniesienie. Następujące kroki działają w Visual Studio Community 2013 z .NET 4.5:
System.Windows.Forms .Następnie dodaj następującą usinginstrukcję wraz z innymi na górze kodu:
using System.Windows.Forms;
Następnie dodaj jedno z poniższych Clipboard. SetTextinstrukcje do twojego kodu:
Clipboard.SetText("hello");
// OR
Clipboard.SetText(helloString);
Na koniec dodaj STAThreadAttributedo swojej Mainmetody w następujący sposób, aby uniknąć System.Threading.ThreadStateException:
[STAThreadAttribute]
static void Main(string[] args)
{
// ...
}
StackOverflowExceptionnatychmiast poprzedza STAThreadAttributebibliotekę klas systemu .NET Framework =)
Moje doświadczenia z tym problemem związanym z kopiowaniem WPF C # do schowka i System.Threading.ThreadStateExceptionmó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.Formslub 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;
}