Como copiar dados para a área de transferência em c #

Respostas:

798

Existem duas classes que vivem em diferentes assemblies e diferentes namespaces.

  • WinForms: use a seguinte declaração de namespace, verifique se Mainestá marcada com o [STAThread]atributo:

    using System.Windows.Forms;
  • WPF: use a seguinte declaração de namespace

    using System.Windows;
  • console: adicione referência a System.Windows.Forms, use a seguinte declaração de namespace, verifique se Mainestá marcado com o [STAThread]atributo Guia passo a passo em outra resposta

    using System.Windows.Forms;

Para copiar uma sequência exata (literal neste caso):

Clipboard.SetText("Hello, clipboard");

Para copiar o conteúdo de uma caixa de texto, use TextBox.Copy () ou obtenha o texto primeiro e defina o valor da área de transferência:

Clipboard.SetText(txtClipboard.Text);

Veja aqui um exemplo . Ou ... Documentação oficial do MSDN ou Aqui para WPF .


Observações:

Kieren Johnstone
fonte
@KierenJohnstone É possível acessar o conteúdo da área de transferência usando pares de valores-chave?
Abdul
@ Abdul - Não sei ao certo o que você quer dizer. O conteúdo da área de transferência pode ser texto, arquivos, imagens, qualquer tipo de dado personalizado. O conceito de pares kv não parece ter nada a ver com a idéia da área de transferência?
Kieren Johnstone
@KierenJohnstone o que estou tentando fazer é algo em que um usuário pode armazenar várias coisas na área de transferência. Essas coisas seriam acessadas por uma chave. É semelhante ao armazenamento local em HTML5. Ou algo assim não é possível devido à natureza da área de transferência?
Abdul
Se você está recebendo erro no ASP.NET, tente usar um novo thread: var thread = new Thread (param => {Clipboard.SetText (txtName.Text);}); thread.SetApartmentState (ApartmentState.STA); thread.Start ();
user3790692
1
A resposta de skia.heliou me ajudou: depois de adicionar atributo [STAThreadAttribute], o meu método Clipboard.SetText começar a trabalhar
Viteo
44

Para projetos de console passo a passo, você deverá adicionar a System.Windows.Formsreferência primeiro . As etapas a seguir funcionam no Visual Studio Community 2013 com .NET 4.5:

  1. No Gerenciador de Soluções , expanda seu projeto de console.
  2. Clique com o botão direito do mouse em Referências e clique em Adicionar Referência ...
  3. No grupo Assemblies , em Framework , selecione System.Windows.Forms.
  4. Clique em OK .

Em seguida, adicione a seguinte usinginstrução com as outras na parte superior do seu código:

using System.Windows.Forms;

Em seguida, adicione um dos seguintes Clipboard. SetTextinstruções para o seu código:

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

E, por último, adicione STAThreadAttributeao seu Mainmétodo da seguinte maneira, para evitar a System.Threading.ThreadStateException:

[STAThreadAttribute]
static void Main(string[] args)
{
  // ...
}
skia.heliou
fonte
1
A classe StackOverflowExceptionprecede imediatamente STAThreadAttributena biblioteca de classes .NET Framework Sistema =)
skia.heliou
42

Minha experiência com esse problema usando o WPF C # coping para a área de transferência e System.Threading.ThreadStateExceptionestá aqui com meu código que funcionou corretamente com todos os 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 para este post aqui

Mas isso funciona apenas no host local, portanto, não tente isso em um servidor, pois não funcionará.

No lado do servidor, eu fiz isso usando zeroclipboard. A única maneira, depois de muita pesquisa.

BMaximus
fonte
Usei-o no teste automatizado de selênio (webdriver) e funciona muito bem!
precisa saber é o seguinte
@ andrew.fox você tentou no seu servidor - modelo de cliente? porque se são 2 máquinas separadas, acho que não deve funcionar.
precisa saber é o seguinte
Não, o Selenium abre a janela do navegador na máquina do agente.
andrew.fox
41
Clipboard.SetText("hello");

Você precisará usar os System.Windows.Formsou System.Windowsnamespaces para isso.

Bradley Smith
fonte
1

Clip.exe é um executável no Windows para definir a área de transferência. Observe que isso não funciona para outros sistemas operacionais que não sejam o Windows, o que ainda é péssimo.

        /// <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
fonte