Câu trả lời:
Có hai lớp sống trong các hội đồng khác nhau và các không gian tên khác nhau.
WinForms: sử dụng khai báo không gian tên sau đây, đảm bảo Main
được đánh dấu bằng [STAThread]
thuộc tính:
using System.Windows.Forms;
WPF: sử dụng khai báo không gian tên sau
using System.Windows;
console: thêm tham chiếu đến System.Windows.Forms
, sử dụng khai báo không gian tên sau, đảm bảo Main
được đánh dấu bằng [STAThread]
thuộc tính. Hướng dẫn từng bước trong câu trả lời khác
using System.Windows.Forms;
Để sao chép một chuỗi chính xác (bằng chữ trong trường hợp này):
Clipboard.SetText("Hello, clipboard");
Để sao chép nội dung của hộp văn bản, hãy sử dụng TextBox.Copy () hoặc nhận văn bản trước rồi đặt giá trị clipboard:
Clipboard.SetText(txtClipboard.Text);
Xem ở đây cho một ví dụ . Hoặc ... Tài liệu MSDN chính thức hoặc Tại đây cho WPF .
Nhận xét:
Clipboard là khái niệm UI trên máy tính để bàn, cố gắng đặt nó trong mã phía máy chủ như ASP.Net sẽ chỉ đặt giá trị trên máy chủ và không ảnh hưởng đến những gì người dùng có thể thấy trong trình duyệt của họ. Trong khi câu trả lời được liên kết cho phép một người chạy phía máy chủ mã truy cập Clipboard với SetApartmentState
nó không chắc là điều bạn muốn đạt được.
Nếu sau khi theo dõi thông tin trong mã câu hỏi này vẫn có ngoại lệ, hãy xem lỗi "Chủ đề hiện tại phải được đặt thành căn hộ chủ đề đơn (STA)" trong chuỗi sao chép vào bảng tạm
Câu hỏi / câu trả lời này bao gồm .NET thông thường, cho .NET Core xem - .Net Core - sao chép vào clipboard?
Đối với các dự án bảng điều khiển theo từng bước, trước tiên bạn sẽ phải thêm System.Windows.Forms
tài liệu tham khảo. Các bước sau hoạt động trong Visual Studio Community 2013 với .NET 4.5:
System.Windows.Forms
.Sau đó, thêm using
câu lệnh sau với các câu lệnh khác ở đầu mã của bạn:
using System.Windows.Forms;
Sau đó, thêm một trong những điều sau đây Clipboard
. SetText
báo cáo mã của bạn:
Clipboard.SetText("hello");
// OR
Clipboard.SetText(helloString);
Và cuối cùng, thêm STAThreadAttribute
vào Main
phương thức của bạn như sau, để tránh System.Threading.ThreadStateException
:
[STAThreadAttribute]
static void Main(string[] args)
{
// ...
}
StackOverflowException
ngay trước STAThreadAttribute
Thư viện lớp hệ thống .NET =)
Kinh nghiệm của tôi về vấn đề này khi sử dụng WPF C # đối phó với clipboard và System.Threading.ThreadStateException
ở đây với mã của tôi hoạt động chính xác với tất cả các trình duyệt:
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();
tín dụng cho bài viết này ở đây
Nhưng điều này chỉ hoạt động trên localhost, vì vậy đừng thử điều này trên máy chủ, vì nó sẽ không hoạt động.
Về phía máy chủ, tôi đã làm điều đó bằng cách sử dụng zeroclipboard
. Cách duy nhất, sau rất nhiều nghiên cứu.
Clipboard.SetText("hello");
Bạn sẽ cần phải sử dụng System.Windows.Forms
hoặc System.Windows
không gian tên cho điều đó.
Clip.exe là một tệp thực thi trong Windows để đặt bảng tạm. Lưu ý rằng điều này không hoạt động đối với các hệ điều hành khác ngoài Windows, vẫn còn tệ.
/// <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;
}