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 Mainesté 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 Mainesté 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:
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.
@KierenJohnstone ¿Es posible acceder al contenido del portapapeles utilizando pares clave-valor?
Abdul
@ Abdul - No estoy seguro de lo que quieres decir. El contenido del portapapeles puede ser texto, archivos, imágenes, cualquier tipo de datos personalizados. ¿El concepto de pares kv no parece tener nada que ver con la idea del portapapeles?
Kieren Johnstone
@KierenJohnstone lo que intento hacer es algo allí donde un usuario puede almacenar varias cosas en el portapapeles. A esas cosas se accedería con una llave. Es similar al almacenamiento local HTML5. ¿O algo así no es posible debido a la naturaleza del portapapeles?
Abdul
Si obtiene un error con ASP.NET, intente usarlo en un nuevo hilo: var thread = new Thread (param => {Clipboard.SetText (txtName.Text);}); thread.SetApartmentState (ApartmentState.STA); thread.Start ();
user3790692
1
La respuesta de skia.heliou me ayudó: después de agregar el atributo [STAThreadAttribute], mi método Clipboard.SetText comenzó a funcionar
viteo
44
Para proyectos de consola paso a paso, primero deberá agregar la System.Windows.Formsreferencia. Los siguientes pasos funcionan en Visual Studio Community 2013 con .NET 4.5:
En el Explorador de soluciones , expanda su proyecto de consola.
Haga clic con el botón derecho en Referencias , luego haga clic en Agregar referencia ...
En el grupo Ensamblajes , en Marco , seleccione System.Windows.Forms.
Haz clic en Aceptar .
Luego, agregue la siguiente usingdeclaración con las otras en la parte superior de su código:
using System.Windows.Forms;
Luego, agregue cualquiera de los siguientes Clipboard. SetTextdeclaraciones a su código:
La clase StackOverflowExceptionprecede inmediatamente STAThreadAttributeen .NET Framework System Class Library =)
skia.heliou
42
Mi experiencia con este problema al usar la adaptación de WPF C # al portapapeles y System.Threading.ThreadStateExceptionestá aquí con mi código que funcionó correctamente con todos los navegadores:
Thread thread =newThread(()=>Clipboard.SetText("String to be copied to clipboard"));
thread.SetApartmentState(ApartmentState.STA);//Set the thread to STA
thread.Start();
thread.Join();
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>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;}
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:WPF: use la siguiente declaración de espacio de nombres
consola: agregue referencia a
System.Windows.Forms
, use la siguiente declaración de espacio de nombres, asegúrese de queMain
esté marcado con el[STAThread]
atributo. Guía paso a paso en otra respuestaPara copiar una cadena exacta (literal en este caso):
Para copiar el contenido de un cuadro de texto, use TextBox.Copy () u obtenga el texto primero y luego configure el valor del portapapeles:
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?
fuente
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:Luego, agregue cualquiera de los siguientes
Clipboard
.SetText
declaraciones a su código:Y, por último, agregue
STAThreadAttribute
a suMain
método de la siguiente manera, para evitarSystem.Threading.ThreadStateException
:fuente
StackOverflowException
precede inmediatamenteSTAThreadAttribute
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: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.fuente
Tendrá que usar los espacios de nombres
System.Windows.Forms
oSystem.Windows
para eso.fuente
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.
fuente