Como copiar dados para a área de transferência em c #
439
Como posso copiar uma string (por exemplo, "olá") para a área de transferência do sistema em C #, para que da próxima vez que pressionar CTRL+V, receberei "olá"?
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:
A área de transferência é o conceito da interface do usuário da área de trabalho, tentar defini-la no código do servidor, como o ASP.Net, somente definirá valor no servidor e não terá impacto no que o usuário pode ver no navegador. Embora a resposta vinculada permita executar o código de acesso da área de transferência do lado do servidor SetApartmentState, é improvável o que você deseja obter.
@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:
No Gerenciador de Soluções , expanda seu projeto de console.
Clique com o botão direito do mouse em Referências e clique em Adicionar Referência ...
No grupo Assemblies , em Framework , selecione System.Windows.Forms.
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:
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 =newThread(()=>Clipboard.SetText("String to be copied to clipboard"));
thread.SetApartmentState(ApartmentState.STA);//Set the thread to STA
thread.Start();
thread.Join();
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>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;}
Respostas:
Existem duas classes que vivem em diferentes assemblies e diferentes namespaces.
WinForms: use a seguinte declaração de namespace, verifique se
Main
está marcada com o[STAThread]
atributo:WPF: use a seguinte declaração de namespace
console: adicione referência a
System.Windows.Forms
, use a seguinte declaração de namespace, verifique seMain
está marcado com o[STAThread]
atributo Guia passo a passo em outra respostaPara copiar uma sequência exata (literal neste caso):
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:
Veja aqui um exemplo . Ou ... Documentação oficial do MSDN ou Aqui para WPF .
Observações:
A área de transferência é o conceito da interface do usuário da área de trabalho, tentar defini-la no código do servidor, como o ASP.Net, somente definirá valor no servidor e não terá impacto no que o usuário pode ver no navegador. Embora a resposta vinculada permita executar o código de acesso da área de transferência do lado do servidor
SetApartmentState
, é improvável o que você deseja obter.Se depois de seguir as informações neste código de pergunta ainda houver uma exceção, consulte o erro "O thread atual deve ser definido como apartamento de thread único (STA)" na cópia da sequência de caracteres para a área de transferência
Esta pergunta / resposta abrange o .NET regular, para o .NET Core, consulte - .Net Core - copiar para a área de transferência?
fonte
Para projetos de console passo a passo, você deverá adicionar a
System.Windows.Forms
referência primeiro . As etapas a seguir funcionam no Visual Studio Community 2013 com .NET 4.5:System.Windows.Forms
.Em seguida, adicione a seguinte
using
instrução com as outras na parte superior do seu código:Em seguida, adicione um dos seguintes
Clipboard
.SetText
instruções para o seu código:E, por último, adicione
STAThreadAttribute
ao seuMain
método da seguinte maneira, para evitar aSystem.Threading.ThreadStateException
:fonte
StackOverflowException
precede imediatamenteSTAThreadAttribute
na biblioteca de classes .NET Framework Sistema =)Minha experiência com esse problema usando o WPF C # coping para a área de transferência e
System.Threading.ThreadStateException
está aqui com meu código que funcionou corretamente com todos os navegadores: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.fonte
Você precisará usar os
System.Windows.Forms
ouSystem.Windows
namespaces para isso.fonte
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.
fonte