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:
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ąć.
@KierenJohnstone Czy można uzyskać dostęp do zawartości schowka za pomocą par klucz-wartość?
Abdul
@Abdul - Nie jestem pewien, co masz na myśli. Treść schowka może być tekstem, plikami, obrazami, dowolnymi niestandardowymi danymi. Koncepcja par kv wydaje się nie mieć nic wspólnego z pomysłem schowka?
Kieren Johnstone
@KierenJohnstone to, co próbuję zrobić, to coś, w którym użytkownik może przechowywać wiele rzeczy w schowku. Do tych rzeczy można uzyskać dostęp za pomocą klucza. Jest podobny do lokalnego magazynu HTML5. A może coś takiego nie jest możliwe ze względu na charakter schowka?
Abdul
Jeśli otrzymujesz błąd związany z ASP.NET, spróbuj użyć nowego wątku: var thread = new Thread (param => {Clipboard.SetText (txtName.Text);}); thread.SetApartmentState (ApartmentState.STA); thread.Start ();
user3790692
1
Odpowiedź skia.heliou pomogła mi: po dodaniu atrybutu [STAThreadAttribute] moja metoda Clipboard.SetText zaczyna działać
viteo 14.09.17
44
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:
W Eksploratorze rozwiązań rozwiń projekt konsoli.
Kliknij prawym przyciskiem myszy Referencje , a następnie kliknij polecenie Dodaj referencję ...
W grupie Złożenia w ramach Framework wybierzSystem.Windows.Forms .
Kliknij OK .
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:
Klasa StackOverflowExceptionnatychmiast poprzedza STAThreadAttributebibliotekę klas systemu .NET Framework =)
skia.heliou
42
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 =newThread(()=>Clipboard.SetText("String to be copied to clipboard"));
thread.SetApartmentState(ApartmentState.STA);//Set the thread to STA
thread.Start();
thread.Join();
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>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;}
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:WPF: użyj następującej deklaracji przestrzeni nazw
konsola: dodaj odniesienie do
System.Windows.Forms
, użyj następującej deklaracji przestrzeni nazw, upewnij się, żeMain
jest oznaczony[STAThread]
atrybutem. Przewodnik krok po kroku w innej odpowiedziAby skopiować dokładny ciąg znaków (w tym przypadku dosłowny):
Aby skopiować zawartość pola tekstowego, użyj TextBox.Copy () lub pobierz najpierw tekst, a następnie ustaw wartość schowka:
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?
źródło
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:Następnie dodaj jedno z poniższych
Clipboard
.SetText
instrukcje do twojego kodu:Na koniec dodaj
STAThreadAttribute
do swojejMain
metody w następujący sposób, aby uniknąćSystem.Threading.ThreadStateException
:źródło
StackOverflowException
natychmiast poprzedzaSTAThreadAttribute
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: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.źródło
W tym celu musisz użyć przestrzeni nazw
System.Windows.Forms
lubSystem.Windows
.źródło
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.
źródło