Se ho del testo in una stringa, come posso copiarlo negli Appunti in modo che l'utente possa incollarlo in un'altra finestra (ad esempio, dalla mia applicazione al Blocco note)?Come si copia il contenuto di una stringa negli appunti in C#?
risposta
È possibile utilizzare System.Windows.Forms.Clipboard.SetText(...)
.
Questo è per WinForms; per WPF, vedere la risposta di Jeff Moser (attualmente 2 in basso). –
@DannyBeckett Ora solo _1_ in basso. –
Per le applicazioni della console, è necessario decorare l'attributo Principale con [STAThread] –
WPF: System.Windows.Clipboard
(PresentationCore.dll)
Winforms: System.Windows.Forms.Clipboard
Entrambi hanno un metodo statico SetText
.
Grazie per l'inclusione del riferimento PresentationCore.dll. Non incluso per impostazione predefinita nell'applicazione console – xtreampb
System.Windows.Forms.Clipboard.SetText
(WinForms) o System.Windows.Clipboard.SetText
(WPF)
Clipboard.SetText
è quello che volete.
Tutti i altre risposte stanno usando lo stesso. Prova a rispondere in modo diverso. – ashveli
Mi piacerebbe chiamare SetText
che fosse facile ma ci sono un sacco di trucchi che devi affrontare. Devi assicurarti che il thread su cui stai chiamando sia in esecuzione nello STA. A volte può fallire con un errore di accesso negato e poi lavorare secondi dopo senza problemi - qualcosa a che fare con i problemi di temporizzazione COM negli appunti. E se l'accesso alla tua applicazione tramite Desktop remoto, l'accesso agli Appunti è limitato. Utilizziamo un metodo centralizzato per gestire tutti questi scenari anziché chiamare direttamente lo SetText
.
@Stecy: Ecco il nostro codice centralizzata:
La classe StaHelper esegue semplicemente un po 'di codice arbitrario su un thread in un appartamento singolo filo (STA) - richiesto dalla clipboard.
abstract class StaHelper
{
readonly ManualResetEvent _complete = new ManualResetEvent(false);
public void Go()
{
var thread = new Thread(new ThreadStart(DoWork))
{
IsBackground = true,
}
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
// Thread entry method
private void DoWork()
{
try
{
_complete.Reset();
Work();
}
catch(Exception ex)
{
if(DontRetryWorkOnFailed)
throw;
else
{
try
{
Thread.Sleep(1000);
Work();
}
catch
{
// ex from first exception
LogAndShowMessage(ex);
}
}
}
finally
{
_complete.Set();
}
}
public bool DontRetryWorkOnFailed{ get; set; }
// Implemented in base class to do actual work.
protected abstract void Work();
}
Quindi abbiamo una classe specifica per l'impostazione del testo negli Appunti. La creazione manuale di DataObject
è richiesta in alcuni casi limite su alcune versioni di Windows/.NET. Non ricordo gli scenari esatti ora e potrebbe non essere richiesto in .NET 3.5.
class SetClipboardHelper : StaHelper
{
readonly string _format;
readonly object _data;
public SetClipboardHelper(string format, object data)
{
_format = format;
_data = data;
}
protected override void Work()
{
var obj = new System.Windows.Forms.DataObject(
_format,
_data
);
Clipboard.SetDataObject(obj, true);
}
}
Uso assomiglia a questo:
new SetClipboardHelper(DataFormats.Text, "See, I'm on the clipboard").Go();
+1, ho provato almeno alcuni di questi trucchi. Ha funzionato correttamente per me se ho bloccato l'accesso agli appunti in try {...} catch (System.Runtime.InteropServices.ExternalException) {}. – Joe
@Paul, saresti così gentile da spiegare il tuo metodo centralizzato? –
Questa risposta merita molto più uptotes di quello che ha. Inoltre, dovresti fare una domanda con risposta automatica, qualcosa del tipo "Come eseguire il codice STA in un contesto non STA" – Sidney
in Windows Form, se la stringa è in una casella di testo, si può facilmente utilizzare questo:
textBoxcsharp.SelectAll();
textBoxcsharp.Copy();
textBoxcsharp.DeselectAll();
non è necessario inserire tutte le junk selezionate e deslect. Semplicemente inserisci questo: 'textBox1.Copy();' – Dozer789
In realtà, hai bisogno della posta indesiderata SelectAll() e DeselectAll(). In base a https://msdn.microsoft.com/en-us/library/system.windows.forms.textboxbase.copy(v=vs.120).aspx, ciò che viene copiato negli Appunti è il ** attualmente selezionato ** testo. –
è necessario inserire SelectAll(), altrimenti non funziona, ho appena [provato in questa app inutile] (https://github.com/Magneticdud/Paginatore/commit/5b58a89bf947c1be345861e2adbadf3270ad88f7). Non c'è bisogno di usare DeselectAll() nelle app WPF. –
Utilizzando la soluzione ha dimostrato in questo domanda, System.Windows.Forms.Clipboard.SetText(...)
, risultati nell'eccezione:
thread corrente deve essere impostato in modalità singolo appartamento filo (STA) prima le chiamate OLE possono essere effettuate
Per evitare questo, è possibile aggiungere l'attributo:
[STAThread]
a
static void Main(string[] args)
Questo funziona per me:
si vuole fare:
System.Windows.Forms.Clipboard.SetText("String to be copied to Clipboard");
Ma causa un errore che dice che deve essere in una singola discussione di ApartmentState.STA.
Quindi facciamolo scorrere in questo thread. Il codice per esso:
public void somethingToRunInThread()
{
System.Windows.Forms.Clipboard.SetText("String to be copied to Clipboard");
}
protected void copy_to_clipboard()
{
Thread clipboardThread = new Thread(somethingToRunInThread);
clipboardThread.SetApartmentState(ApartmentState.STA);
clipboardThread.IsBackground = false;
clipboardThread.Start();
}
Dopo aver chiamato copy_to_clipboard()
, la stringa viene copiato negli appunti, in modo è possibile incollare o Ctrl + V e tornare la stringa come stringa da copiare negli appunti.
Proprio sul denaro. Grazie! – CodeBreaker
Utilizzare try
- catch
, anche se ha un errore verrà comunque copiato.
Try
Clipboard.SetText("copy me to clipboard")
Catch ex As Exception
End Try
Se si utilizza una finestra di messaggio per catturare l'eccezione, che vi mostrerà errore, ma il valore è ancora copiato negli appunti.
senza winform o wpf: http://stackoverflow.com/a/13571530/359135 – gordatron