Cómo copiar datos al portapapeles en C #

Respuestas:

799

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:

Clipboard.SetText(txtClipboard.Text);

Ver aquí para un ejemplo . O ... Documentación oficial de MSDN o Aquí para WPF .


Observaciones:

Kieren Johnstone
fuente
@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:

  1. En el Explorador de soluciones , expanda su proyecto de consola.
  2. Haga clic con el botón derecho en Referencias , luego haga clic en Agregar referencia ...
  3. En el grupo Ensamblajes , en Marco , seleccione System.Windows.Forms.
  4. 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:

Clipboard.SetText("hello");
// OR
Clipboard.SetText(helloString);

Y, por último, agregue STAThreadAttributea su Mainmétodo de la siguiente manera, para evitar System.Threading.ThreadStateException:

[STAThreadAttribute]
static void Main(string[] args)
{
  // ...
}
skia.heliou
fuente
1
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 = 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.

BMaximus
fuente
Lo utilicé en la prueba automática de selenio (webdriver) y funciona muy bien.
andrew.fox
@ andrew.fox lo probaste en tu servidor - ¿modelo de cliente? porque si se trata de 2 máquinas separadas, supongo que no debería funcionar.
BMaximus
Lol no, Selenium abre la ventana del navegador en la máquina agente.
andrew.fox
41
Clipboard.SetText("hello");

Tendrá que usar los espacios de nombres System.Windows.Formso System.Windowspara eso.

Bradley Smith
fuente
1

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;
        }
Kernel Korn
fuente