Comment copier des données dans le presse-papiers en C #

Réponses:

799

Il existe deux classes qui vivent dans des assemblys différents et des espaces de noms différents.

  • WinForms: utilisez la déclaration d'espace de noms suivante, assurez-vous qu'elle Mainest marquée avec l' [STAThread]attribut:

    using System.Windows.Forms;
  • WPF: utilisez la déclaration d'espace de noms suivante

    using System.Windows;
  • console: ajoutez une référence à System.Windows.Forms, utilisez la déclaration d'espace de noms suivante, assurez-vous qu'elle Mainest marquée avec un [STAThread]attribut. Guide étape par étape dans une autre réponse

    using System.Windows.Forms;

Pour copier une chaîne exacte (littérale dans ce cas):

Clipboard.SetText("Hello, clipboard");

Pour copier le contenu d'une zone de texte, utilisez TextBox.Copy () ou obtenez d'abord du texte, puis définissez la valeur du presse-papiers:

Clipboard.SetText(txtClipboard.Text);

Voir ici pour un exemple . Ou ... Documentation MSDN officielle ou ici pour WPF .


Remarques:

Kieren Johnstone
la source
@KierenJohnstone Est-il possible d'accéder au contenu du presse-papiers à l'aide de paires clé-valeur?
Abdul
@Abdul - Je ne sais pas ce que tu veux dire. Le contenu du presse-papiers peut être du texte, des fichiers, des images, toute sorte de données personnalisées. Le concept de paires kv ne semble pas être lié à l'idée du presse-papiers?
Kieren Johnstone
@KierenJohnstone ce que j'essaye de faire est quelque chose qu'un utilisateur peut stocker plusieurs choses dans le presse-papiers. Ces choses seraient accessibles par une clé. Il est similaire au stockage local HTML5. Ou est-ce que quelque chose comme ça n'est pas possible en raison de la nature du presse-papiers?
Abdul
Si vous obtenez une erreur avec ASP.NET, essayez d'utiliser dans un nouveau thread: var thread = new Thread (param => {Clipboard.SetText (txtName.Text);}); thread.SetApartmentState (ApartmentState.STA); thread.Start ();
user3790692
1
La réponse de skia.heliou m'a aidé: après avoir ajouté l'attribut [STAThreadAttribute], ma méthode Clipboard.SetText a commencé à fonctionner
viteo
44

Pour les projets de console étape par étape, vous devrez d'abord ajouter la System.Windows.Formsréférence. Les étapes suivantes fonctionnent dans Visual Studio Community 2013 avec .NET 4.5:

  1. Dans l' Explorateur de solutions , développez votre projet de console.
  2. Cliquez avec le bouton droit sur Références , puis cliquez sur Ajouter une référence ...
  3. Dans le groupe Assemblys , sous Framework , sélectionnez System.Windows.Forms.
  4. Cliquez OK .

Ensuite, ajoutez l' usinginstruction suivante avec les autres en haut de votre code:

using System.Windows.Forms;

Ajoutez ensuite l'un des éléments suivants Clipboard. SetTextinstructions à votre code:

Clipboard.SetText("hello");
// OR
Clipboard.SetText(helloString);

Et enfin, ajoutez STAThreadAttributeà votre Mainméthode comme suit, pour éviter un System.Threading.ThreadStateException:

[STAThreadAttribute]
static void Main(string[] args)
{
  // ...
}
skia.heliou
la source
1
La classe StackOverflowExceptionprécède immédiatement STAThreadAttributedans la bibliothèque de classes du système .NET Framework =)
skia.heliou
42

Mon expérience avec ce problème en utilisant WPF C # coping au presse-papiers et System.Threading.ThreadStateExceptionest ici avec mon code qui fonctionnait correctement avec tous les navigateurs:

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

crédits à ce poste ici

Mais cela ne fonctionne que sur localhost, alors n'essayez pas cela sur un serveur, car cela ne fonctionnera pas.

Côté serveur, je l'ai fait en utilisant zeroclipboard. La seule façon, après beaucoup de recherches.

BMaximus
la source
Je l'ai utilisé dans le test automatisé de sélénium (pilote Web) et cela fonctionne très bien!
andrew.fox
@ andrew.fox vous l'avez essayé sur votre serveur - modèle client? parce que s'il s'agit de 2 machines distinctes, je suppose que cela ne devrait pas fonctionner.
BMaximus
Lol non, Selenium ouvre la fenêtre du navigateur sur la machine agent.
andrew.fox
41
Clipboard.SetText("hello");

Vous devrez utiliser les espaces de noms System.Windows.Formsou System.Windowspour cela.

Bradley Smith
la source
1

Clip.exe est un exécutable sous Windows pour définir le presse-papiers. Notez que cela ne fonctionne pas pour les autres systèmes d'exploitation autres que Windows, qui craint toujours.

        /// <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;
        }
Kernel Korn
la source