574 votes

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

Comment puis-je copier une chaîne de caractères (par exemple "hello") dans le presse-papiers du système en C#, de sorte que la prochaine fois que j'appuie sur la touche CTRL+V Je vais avoir droit à un "bonjour" ?

979voto

Kieren Johnstone Points 19499

Il y a deux classes qui vivent dans des assemblées différentes et des espaces de noms différents.

  • WinForms : utiliser la déclaration d'espace de nom suivante, s'assurer que Main est marqué par [STAThread] attribut :

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

    using System.Windows;
  • console : ajouter une référence à System.Windows.Forms pour utiliser la déclaration d'espace de nom suivante, assurez-vous que Main est marqué par [STAThread] attribut. Guide étape par étape dans un autre responder

    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 soit TextBox.Copy() ou récupérer d'abord le texte et ensuite définir la valeur du presse-papiers :

Clipboard.SetText(txtClipboard.Text);

Voir ici pour un exemple . Ou... Documentation officielle MSDN o Ici pour WPF .


Remarques :

0 votes

@KierenJohnstone Est-il possible d'accéder au contenu du presse-papiers en utilisant des paires clé-valeur ?

0 votes

@Abdul - Je ne suis pas sûr de ce que vous voulez 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 avoir de rapport avec l'idée de presse-papiers ?

0 votes

@KierenJohnstone ce que j'essaie de faire est quelque chose où un utilisateur peut stocker plusieurs choses dans le presse-papiers. Ces choses seraient accessibles par une clé. C'est similaire au stockage local HTML5. Ou quelque chose comme cela n'est pas possible en raison de la nature du presse-papiers ?

52voto

BMaximus Points 37

Mon expérience avec ce problème en utilisant WPF C# copier vers le presse-papiers et System.Threading.ThreadStateException est ici avec mon code qui a fonctionné 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 à cet article aquí

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

Du côté du serveur, je l'ai fait en utilisant zeroclipboard . Le seul moyen, après beaucoup de recherches.

0 votes

Je l'ai utilisé dans un test Selenium automatisé (webdriver) et cela fonctionne très bien !

0 votes

@andrew.fox vous l'avez essayé sur votre modèle serveur - client ? parce que si c'est 2 machines séparées je suppose que ça ne devrait pas fonctionner.

0 votes

Lol non, Selenium ouvre la fenêtre du navigateur sur la machine de l'agent.

44voto

Bradley Smith Points 6285
Clipboard.SetText("hello");

Vous devrez utiliser le System.Windows.Forms o System.Windows des espaces de noms pour cela.

13voto

Deva Points 135

Le thread actuel doit être configuré en mode Single Thread Apartment (STA) avant de pouvoir effectuer des appels OLE. Assurez-vous que votre fonction Main est marquée STAThreadAttribute. L'erreur arrive

0voto

Clipboard.SetText("hello");

Donc quand vous appuyez sur Ctrl + V vous collerez hello

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