Comment copier le contenu d’une chaîne dans le presse-papier en C #?

Si j’ai du texte dans une chaîne, comment puis-je le copier dans le Presse-papiers pour que l’utilisateur puisse le coller dans une autre fenêtre (par exemple, de mon application au Bloc-notes)?

Vous pouvez utiliser System.Windows.Forms.Clipboard.SetText(...) .

System.Windows.Forms.Clipboard.SetText (Winforms) ou System.Windows.Clipboard.SetText (WPF)

Je souhaite que l’appel de SetText soit aussi simple que cela, mais il y a pas mal de problèmes à régler. Vous devez vous assurer que le thread que vous appelez est en cours d’exécution dans le STA. Il peut parfois échouer avec une erreur d’access refusé, puis travailler quelques secondes plus tard sans problème – quelque chose à voir avec les problèmes de synchronisation de COM dans le Presse-papiers. Et si votre application est accessible via Remote Desktop, l’access au Presse-papiers est incomplet. Nous utilisons une méthode centralisée pour gérer tous ces scénarios au lieu d’appeler directement SetText .

@Stecy: Voici notre code centralisé:

La classe StaHelper exécute simplement du code arbitraire sur un thread dans le Single Thread Apartment (STA) – requirejs par le Presse-papiers.

 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(); } 

Ensuite, nous avons une classe spécifique pour définir du texte dans le presse-papiers. La DataObject manuelle d’un DataObject est requirejse dans certains cas DataObject sur certaines versions de Windows / .NET. Je ne me souviens plus des scénarios exacts et il ne sera peut-être pas nécessaire dans .NET 3.5.

 class SetClipboardHelper : StaHelper { readonly ssortingng _format; readonly object _data; public SetClipboardHelper( ssortingng format, object data ) { _format = format; _data = data; } protected override void Work() { var obj = new System.Windows.Forms.DataObject( _format, _data ); Clipboard.SetDataObject( obj, true ); } } 

L’utilisation ressemble à ceci:

 new SetClipboardHelper( DataFormats.Text, "See, I'm on the clipboard" ).Go(); 

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

Winforms: System.Windows.Forms.Clipboard

Tous deux ont une méthode statique SetText .

Cela fonctionne pour moi:

Vous voulez faire:

 System.Windows.Forms.Clipboard.SetText("Ssortingng to be copied to Clipboard"); 

Mais cela provoque une erreur en disant qu’il doit être dans un seul thread de ApartmentState.STA.

Donc, faisons-le fonctionner dans un tel thread. Le code pour cela:

 public void somethingToRunInThread() { System.Windows.Forms.Clipboard.SetText("Ssortingng to be copied to Clipboard"); } protected void copy_to_clipboard() { Thread clipboardThread = new Thread(somethingToRunInThread); clipboardThread.SetApartmentState(ApartmentState.STA); clipboardThread.IsBackground = false; clipboardThread.Start(); } 

Après avoir appelé copy_to_clipboard() , la chaîne est copiée dans le presse-papier, vous pouvez donc coller ou Ctrl + V et récupérer la chaîne en tant que chaîne à copier dans le presse-papiers .

À l’aide de la solution présentée dans cette question, System.Windows.Forms.Clipboard.SetText(...) génère une exception:

Le thread actuel doit être défini sur le mode STA (single thread apartment) avant que les appels OLE puissent être effectués.

Pour éviter cela, vous pouvez append l’atsortingbut:

 [STAThread] 

à

 static void Main(ssortingng[] args) 

Dans Windows Forms, si votre chaîne est dans une zone de texte, vous pouvez facilement utiliser ceci:

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

Clipboard.SetText est ce que vous voulez.

Utilisez trycatch , même si une erreur est toujours présente.

 Try Clipboard.SetText("copy me to clipboard") Catch ex As Exception End Try 

Si vous utilisez une boîte de message pour capturer l’exception, il affiche une erreur, mais la valeur est toujours copiée dans le Presse-papiers.