Cách sao chép dữ liệu vào clipboard trong C #


Câu trả lời:


798

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:


@KierenJohnstone Có thể truy cập nội dung clipboard bằng các cặp khóa-giá trị không?
Abdul

@Abdul - Tôi không chắc ý của bạn là gì. Nội dung của bảng tạm có thể là văn bản, tệp, hình ảnh, bất kỳ loại dữ liệu tùy chỉnh nào. Khái niệm cặp kv dường như không liên quan gì đến ý tưởng clipboard?
Kieren Johnstone

@KierenJohnstone những gì tôi đang cố gắng thực hiện là thứ mà người dùng có thể lưu trữ nhiều thứ trong bảng tạm. Những thứ đó sẽ được truy cập bằng một phím. Nó tương tự như bộ nhớ cục bộ HTML5. Hoặc là một cái gì đó như thế là không thể do bản chất của clipboard?
Abdul

Nếu bạn gặp lỗi với ASP.NET, hãy thử sử dụng một luồng mới: var thread = new Thread (param => {Clipboard.SetText (txtName.Text);}); thread.SetApemonyState (ApartmentState.STA); chủ đề.Start ();
dùng3790692

1
Câu trả lời của skia.heliou đã giúp tôi: sau khi thêm thuộc tính [STAThreadAttribution], phương thức Clipboard.SetText của tôi bắt đầu hoạt động
viteo

44

Đố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.Formstài liệu tham khảo. Các bước sau hoạt động trong Visual Studio Community 2013 với .NET 4.5:

  1. Trong Solution Explorer , mở rộng dự án giao diện điều khiển của bạn.
  2. Bấm chuột phải vào Tài liệu tham khảo , sau đó bấm Thêm tham chiếu ...
  3. Trong nhóm Lắp ráp , bên dưới Khung , chọn System.Windows.Forms.
  4. Nhấn OK .

Sau đó, thêm usingcâ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. SetTextbáo cáo mã của bạn:

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

Và cuối cùng, thêm STAThreadAttributevào Mainphương thức của bạn như sau, để tránh System.Threading.ThreadStateException:

[STAThreadAttribute]
static void Main(string[] args)
{
  // ...
}

1
Lớp StackOverflowExceptionngay trước STAThreadAttributeThư viện lớp hệ thống .NET =)
skia.heliou

42

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.


Tôi đã sử dụng nó trong thử nghiệm Selenium tự động (webdo) và nó hoạt động rất tốt!
andrew.fox

@ andrew.fox bạn đã thử nó trên máy chủ của mình - mô hình máy khách? bởi vì nếu là 2 máy riêng biệt thì tôi đoán nó không hoạt động.
BMaximus

Không, Selenium mở cửa sổ trình duyệt trên máy đại lý.
andrew.fox

41
Clipboard.SetText("hello");

Bạn sẽ cần phải sử dụng System.Windows.Formshoặc System.Windowskhông gian tên cho điều đó.


1

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;
        }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.