2009-05-22 15 views

risposta

283

È possibile utilizzare System.Windows.Forms.Clipboard.SetText(...).

+10

Questo è per WinForms; per WPF, vedere la risposta di Jeff Moser (attualmente 2 in basso). –

+2

@DannyBeckett Ora solo _1_ in basso. –

+4

Per le applicazioni della console, è necessario decorare l'attributo Principale con [STAThread] –

18

WPF: System.Windows.Clipboard (PresentationCore.dll)

Winforms: System.Windows.Forms.Clipboard

Entrambi hanno un metodo statico SetText.

+0

Grazie per l'inclusione del riferimento PresentationCore.dll. Non incluso per impostazione predefinita nell'applicazione console – xtreampb

1

Clipboard.SetText è quello che volete.

+0

Tutti i altre risposte stanno usando lo stesso. Prova a rispondere in modo diverso. – ashveli

58

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(); 
+3

+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

+1

@Paul, saresti così gentile da spiegare il tuo metodo centralizzato? –

+2

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

4

in Windows Form, se la stringa è in una casella di testo, si può facilmente utilizzare questo:

textBoxcsharp.SelectAll(); 
textBoxcsharp.Copy(); 
textBoxcsharp.DeselectAll(); 
+1

non è necessario inserire tutte le junk selezionate e deslect. Semplicemente inserisci questo: 'textBox1.Copy();' – Dozer789

+1

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. –

+2

è 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. –

8

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) 
15

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.

+0

Proprio sul denaro. Grazie! – CodeBreaker

0

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.

Problemi correlati