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:
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 Main
est 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:
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?
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:
using System.Windows.Forms;
Ajoutez ensuite l'un des éléments suivants Clipboard
. SetText
instructions à votre code:
Clipboard.SetText("hello");
// OR
Clipboard.SetText(helloString);
Et enfin, ajoutez STAThreadAttribute
à votre Main
méthode comme suit, pour éviter un System.Threading.ThreadStateException
:
[STAThreadAttribute]
static void Main(string[] args)
{
// ...
}
StackOverflowException
précède immédiatement STAThreadAttribute
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:
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.
Clipboard.SetText("hello");
Vous devrez utiliser les espaces de noms System.Windows.Forms
ou System.Windows
pour 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>
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;
}