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 Main
sia 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 Main
sia 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.Forms
riferimento. Le seguenti operazioni funzionano in Visual Studio Community 2013 con .NET 4.5:
System.Windows.Forms
.Quindi, aggiungi la seguente using
dichiarazione con le altre nella parte superiore del codice:
using System.Windows.Forms;
Quindi, aggiungi una delle seguenti opzioni Clipboard
. SetText
dichiarazioni al tuo codice:
Clipboard.SetText("hello");
// OR
Clipboard.SetText(helloString);
E infine, aggiungi STAThreadAttribute
al tuo Main
metodo come segue, per evitare un System.Threading.ThreadStateException
:
[STAThreadAttribute]
static void Main(string[] args)
{
// ...
}
StackOverflowException
precede immediatamente STAThreadAttribute
nella 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.Forms
o 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;
}