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:
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 Main
está 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:
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?
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:
using System.Windows.Forms;
Em seguida, adicione um dos seguintes Clipboard
. SetText
instruções para o seu código:
Clipboard.SetText("hello");
// OR
Clipboard.SetText(helloString);
E, por último, adicione STAThreadAttribute
ao seu Main
método da seguinte maneira, para evitar a System.Threading.ThreadStateException
:
[STAThreadAttribute]
static void Main(string[] args)
{
// ...
}
StackOverflowException
precede imediatamente STAThreadAttribute
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:
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.
Clipboard.SetText("hello");
Você precisará usar os System.Windows.Forms
ou System.Windows
namespaces para isso.
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;
}