Comment copier des données dans le presse-papiers en C #
440
Comment puis-je copier une chaîne (par exemple "bonjour") dans le Presse-papiers du système en C #, donc la prochaine fois que CTRL+Vj'appuierai, j'obtiendrai "bonjour"?
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:
Le presse-papiers est un concept d'interface utilisateur de bureau, essayer de le définir dans le code côté serveur comme ASP.Net ne définira que la valeur sur le serveur et n'a aucun impact sur ce que l'utilisateur peut voir dans son navigateur. Bien que la réponse liée permette d'exécuter le côté serveur du code d'accès du Presse-papiers, SetApartmentStateil est peu probable que vous souhaitiez atteindre.
@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:
Dans l' Explorateur de solutions , développez votre projet de console.
Cliquez avec le bouton droit sur Références , puis cliquez sur Ajouter une référence ...
Dans le groupe Assemblys , sous Framework , sélectionnez System.Windows.Forms.
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:
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 =newThread(()=>Clipboard.SetText("String to be copied to clipboard"));
thread.SetApartmentState(ApartmentState.STA);//Set the thread to STA
thread.Start();
thread.Join();
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.
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>publicstaticvoidSetClipboard(stringvalue){if(value==null)thrownewArgumentNullException("Attempt to set clipboard with null");Process clipboardExecutable =newProcess();
clipboardExecutable.StartInfo=newProcessStartInfo// 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;}
Réponses:
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
Main
est marquée avec l'[STAThread]
attribut:WPF: utilisez la déclaration d'espace de noms suivante
console: ajoutez une référence à
System.Windows.Forms
, utilisez la déclaration d'espace de noms suivante, assurez-vous qu'elleMain
est marquée avec un[STAThread]
attribut. Guide étape par étape dans une autre réponsePour copier une chaîne exacte (littérale dans ce cas):
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:
Voir ici pour un exemple . Ou ... Documentation MSDN officielle ou ici pour WPF .
Remarques:
Le presse-papiers est un concept d'interface utilisateur de bureau, essayer de le définir dans le code côté serveur comme ASP.Net ne définira que la valeur sur le serveur et n'a aucun impact sur ce que l'utilisateur peut voir dans son navigateur. Bien que la réponse liée permette d'exécuter le côté serveur du code d'accès du Presse-papiers,
SetApartmentState
il est peu probable que vous souhaitiez atteindre.Si, après avoir suivi les informations de cette question, le code obtient toujours une exception, voir l' erreur "Le thread actuel doit être défini sur un seul thread (STA)" dans la chaîne de copie dans le presse-papiers
Cette question / réponse couvre .NET standard, pour .NET Core voir - .Net Core - copier dans le presse-papiers?
la source
Pour les projets de console étape par étape, vous devrez d'abord ajouter la
System.Windows.Forms
référence. Les étapes suivantes fonctionnent dans Visual Studio Community 2013 avec .NET 4.5:System.Windows.Forms
.Ensuite, ajoutez l'
using
instruction suivante avec les autres en haut de votre code:Ajoutez ensuite l'un des éléments suivants
Clipboard
.SetText
instructions à votre code:Et enfin, ajoutez
STAThreadAttribute
à votreMain
méthode comme suit, pour éviter unSystem.Threading.ThreadStateException
:la source
StackOverflowException
précède immédiatementSTAThreadAttribute
dans la bibliothèque de classes du système .NET Framework =)Mon expérience avec ce problème en utilisant WPF C # coping au presse-papiers et
System.Threading.ThreadStateException
est ici avec mon code qui fonctionnait correctement avec tous les navigateurs: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.la source
Vous devrez utiliser les espaces de noms
System.Windows.Forms
ouSystem.Windows
pour cela.la source
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.
la source