Answers:
有两个类,它们生活在不同的程序集和不同的命名空间中。
WinForms:使用以下命名空间声明,确保Main
已标记[STAThread]
属性:
using System.Windows.Forms;
WPF:使用以下名称空间声明
using System.Windows;
控制台:添加对的引用System.Windows.Forms
,使用以下名称空间声明,确保Main
已标记了[STAThread]
属性。另一个答案的分步指南
using System.Windows.Forms;
要复制确切的字符串(在这种情况下为文字):
Clipboard.SetText("Hello, clipboard");
要复制文本框的内容,请使用TextBox.Copy()或先获取文本,然后设置剪贴板值:
Clipboard.SetText(txtClipboard.Text);
请参阅此处的示例。或者... MSDN官方文档或WPF此处。
备注:
剪贴板是桌面用户界面的概念,试图在服务器端代码(如ASP.Net)中进行设置,只会在服务器上设置值,而不会影响用户在浏览器中看到的内容。尽管链接的答案使您无法用SetApartmentState
它来运行剪贴板访问代码服务器端。
如果此问题代码中的以下信息之后仍然出现异常,请参见将字符串复制到剪贴板中的“当前线程必须设置为单线程单元(STA)”错误
该问题/答案涵盖常规.NET,有关.NET Core,请参见-.Net Core-复制到剪贴板吗?
对于逐步的控制台项目,您必须首先添加System.Windows.Forms
参考。以下步骤在带有.NET 4.5的Visual Studio社区2013中工作:
System.Windows.Forms
。然后,using
在代码顶部添加以下语句以及其他语句:
using System.Windows.Forms;
然后,添加以下任一Clipboard
。SetText
对代码的声明:
Clipboard.SetText("hello");
// OR
Clipboard.SetText(helloString);
最后,按如下所示添加STAThreadAttribute
到您的Main
方法中,以避免出现System.Threading.ThreadStateException
:
[STAThreadAttribute]
static void Main(string[] args)
{
// ...
}
StackOverflowException
紧邻STAThreadAttribute
.NET Framework系统类库=)
我使用WPF C#应对剪贴板的问题的经验,System.Threading.ThreadStateException
这里是与所有浏览器均正常工作的代码:
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();
学分这篇文章在这里
但这仅在localhost上有效,因此请勿在服务器上尝试此操作,因为它将无法正常工作。
在服务器端,我通过使用做到了zeroclipboard
。经过大量研究,唯一的方法。
Clip.exe是Windows中的可执行文件,用于设置剪贴板。请注意,这不适用于Windows以外的其他操作系统,后者仍然很糟糕。
/// <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;
}