Risposte:
Esistono due classi che vivono in assemblee diverse e spazi dei nomi diversi.
WinForms: utilizzare la seguente dichiarazione dello spazio dei nomi, assicurarsi che Mainsia contrassegnato con l' [STAThread]attributo:
using System.Windows.Forms;WPF: utilizzare la seguente dichiarazione dello spazio dei nomi
using System.Windows;console: aggiungere riferimento a System.Windows.Forms, utilizzare la seguente dichiarazione dello spazio dei nomi, assicurarsi che Mainsia contrassegnato con l' [STAThread]attributo. Guida dettagliata in un'altra risposta
using System.Windows.Forms;Per copiare una stringa esatta (letterale in questo caso):
Clipboard.SetText("Hello, clipboard");
Per copiare il contenuto di una casella di testo, utilizzare TextBox.Copy () o ottenere prima il testo, quindi impostare il valore degli Appunti:
Clipboard.SetText(txtClipboard.Text);
Vedi qui per un esempio . Oppure ... Documentazione ufficiale MSDN o qui per WPF .
Osservazioni:
Appunti è il concetto dell'interfaccia utente desktop, il tentativo di impostarlo nel codice lato server come ASP.Net imposterà solo il valore sul server e non ha alcun impatto su ciò che l'utente può vedere nel proprio browser. Mentre la risposta collegata consente di eseguire il lato server del codice di accesso agli Appunti SetApartmentState, è improbabile che tu voglia ottenere.
Se dopo le seguenti informazioni in questo codice di domanda viene comunque visualizzata un'eccezione, vedere "Errore del thread corrente sull'appartamento a thread singolo (STA)" nella stringa di copia negli Appunti
Questa domanda / risposta copre .NET normale, per .NET Core vedi - .Net Core - copia negli appunti?
Per i progetti console in modo graduale, devi prima aggiungere il System.Windows.Formsriferimento. Le seguenti operazioni funzionano in Visual Studio Community 2013 con .NET 4.5:
System.Windows.Forms.Quindi, aggiungi la seguente usingdichiarazione con le altre nella parte superiore del codice:
using System.Windows.Forms;
Quindi, aggiungi una delle seguenti opzioni Clipboard. SetTextdichiarazioni al tuo codice:
Clipboard.SetText("hello");
// OR
Clipboard.SetText(helloString);
E infine, aggiungi STAThreadAttributeal tuo Mainmetodo come segue, per evitare un System.Threading.ThreadStateException:
[STAThreadAttribute]
static void Main(string[] args)
{
// ...
}
StackOverflowExceptionprecede immediatamente STAThreadAttributenella libreria di classi di sistema .NET Framework =)
La mia esperienza con questo problema con l'uso di WPF C # coping negli appunti ed System.Threading.ThreadStateExceptionè qui con il mio codice che ha funzionato correttamente con tutti i browser:
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();
crediti per questo post qui
Ma questo funziona solo su localhost, quindi non provarlo su un server, poiché non funzionerà.
Sul lato server, l'ho fatto usando zeroclipboard. L'unico modo, dopo molte ricerche.
Clipboard.SetText("hello");
Per questo dovrai usare gli spazi dei nomi System.Windows.Formso System.Windows.
Clip.exe è un eseguibile in Windows per impostare gli appunti. Si noti che questo non funziona per altri sistemi operativi diversi da Windows, che fa ancora schifo.
/// <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;
}