Respuestas:
Hay dos clases que viven en diferentes ensamblados y diferentes espacios de nombres.
WinForms: use la siguiente declaración de espacio de nombres, asegúrese de que Main
esté marcado con el [STAThread]
atributo:
using System.Windows.Forms;
WPF: use la siguiente declaración de espacio de nombres
using System.Windows;
consola: agregue referencia a System.Windows.Forms
, use la siguiente declaración de espacio de nombres, asegúrese de que Main
esté marcado con el [STAThread]
atributo. Guía paso a paso en otra respuesta
using System.Windows.Forms;
Para copiar una cadena exacta (literal en este caso):
Clipboard.SetText("Hello, clipboard");
Para copiar el contenido de un cuadro de texto, use TextBox.Copy () u obtenga el texto primero y luego configure el valor del portapapeles:
Clipboard.SetText(txtClipboard.Text);
Ver aquí para un ejemplo . O ... Documentación oficial de MSDN o Aquí para WPF .
Observaciones:
El Portapapeles es un concepto de interfaz de usuario de escritorio, que intenta establecerlo en el código del lado del servidor como ASP.Net solo establecerá el valor en el servidor y no tiene ningún impacto en lo que el usuario puede ver en su navegador. Si bien la respuesta vinculada le permite a uno ejecutar el servidor del código de acceso del Portapapeles con SetApartmentState
él, es poco probable lo que desea lograr.
Si después de seguir la información en este código de pregunta sigue obteniendo una excepción, vea el error "El subproceso actual debe establecerse en el apartamento de un solo subproceso (STA)" en la cadena de copia al portapapeles
Esta pregunta / respuesta cubre .NET regular, para .NET Core ver - .Net Core - ¿copiar al portapapeles?
Para proyectos de consola paso a paso, primero deberá agregar la System.Windows.Forms
referencia. Los siguientes pasos funcionan en Visual Studio Community 2013 con .NET 4.5:
System.Windows.Forms
.Luego, agregue la siguiente using
declaración con las otras en la parte superior de su código:
using System.Windows.Forms;
Luego, agregue cualquiera de los siguientes Clipboard
. SetText
declaraciones a su código:
Clipboard.SetText("hello");
// OR
Clipboard.SetText(helloString);
Y, por último, agregue STAThreadAttribute
a su Main
método de la siguiente manera, para evitar System.Threading.ThreadStateException
:
[STAThreadAttribute]
static void Main(string[] args)
{
// ...
}
StackOverflowException
precede inmediatamente STAThreadAttribute
en .NET Framework System Class Library =)
Mi experiencia con este problema al usar la adaptación de WPF C # al portapapeles y System.Threading.ThreadStateException
está aquí con mi código que funcionó correctamente con todos los navegadores:
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éditos a esta publicación aquí
Pero esto solo funciona en localhost, así que no intente esto en un servidor, ya que no va a funcionar.
En el lado del servidor, lo hice usando zeroclipboard
. La única forma, después de mucha investigación.
Clipboard.SetText("hello");
Tendrá que usar los espacios de nombres System.Windows.Forms
o System.Windows
para eso.
Clip.exe es un ejecutable en Windows para configurar el portapapeles. Tenga en cuenta que esto no funciona para otros sistemas operativos que no sean Windows, que todavía apesta.
/// <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;
}