284 votes

Comment faire pour copier le contenu d’une chaîne dans le presse-papiers en c# ?

Si j’ai un texte dans une chaîne, comment puis-je copier que dans le presse-papiers afin que l’utilisateur peut coller dans une autre fenêtre (par exemple de ma demande au bloc-notes) ?

372voto

ravuya Points 4234
Vous pouvez utiliser

155voto

Jeff Moser Points 11452

``(Winforms) ou `` (WPF)

66voto

Paul Alexander Points 17611

Je souhaite appeler SetText été facile, mais il ya quelques pièges que vous avez à traiter avec. Vous devez assurez-vous que le fil que vous êtes en l'appelant sur est en cours d'exécution dans le STA. Il peut parfois échouer avec une erreur d'accès refusé ensuite de travailler secondes plus tard sans problème - chose à voir avec la COM les problèmes de synchronisation dans le presse-papiers. Et si votre application est accessible via le Bureau à Distance dans le presse-papiers est louche. Nous utilisons une méthode centralisée pour gérer tous ces scénarios au lieu de l'appeler SetText directement.

@Stecy: Voici notre centralisée code:

Le StaHelper classe exécute simplement un code arbitraire sur un fil dans le Thread Unique Appartement (STA) - exigée 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 de la mise en texte sur le presse-papiers. La création d'un DataObject manuelle est nécessaire dans certains cas limites sur certaines versions de Windows/.NET. Je ne me souviens pas exactement des scénarios de maintenant et il peut ne pas être nécessaire dans .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 );
    }
}

L'utilisation ressemble à ceci:

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

23voto

bsneeze Points 2382

WPF : `` (PresentationCore.dll)

WinForms :``

Les deux ont une méthode SetText statique.

18voto

benli1212 Points 61

Cela fonctionne pour moi :

Vous voulez faire : System.Windows.Forms.Clipboard.SetText ("chaîne à être copié dans le presse-papiers") ;

Mais elle provoque une erreur disant qu'il doit être dans un seul thread d’ApartmentState.STA.

Permet donc de faire fonctionner dans un tel fil, le code correspondant :

Après avoir appelé copy_to_clipboard(), la chaîne est copié dans le presse-papiers afin que vous pouvez coller ou Ctrl-V et récupérer la chaîne comme « Chaîne à être copié dans le presse-papiers ».

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X