วิธีคัดลอกข้อมูลไปยังคลิปบอร์ดใน C #


440

ฉันจะคัดลอกสตริง (เช่น "hello") ไปยังคลิปบอร์ดของระบบใน C # ดังนั้นในครั้งต่อไปที่ฉันกดCTRL+Vฉันจะได้รับ "hello"


คำตอบ:


799

มีสองคลาสที่อาศัยอยู่ในแอสเซมบลีที่แตกต่างกันและ namespaces ที่แตกต่างกัน

  • WinForms: ใช้การประกาศ namespace ต่อไปนี้ตรวจสอบให้แน่ใจว่าMainมีการทำเครื่องหมายด้วย[STAThread]แอตทริบิวต์:

    using System.Windows.Forms;
  • WPF: ใช้การประกาศเนมสเปซต่อไปนี้

    using System.Windows;
  • console: เพิ่มการอ้างอิงถึงSystem.Windows.Formsใช้การประกาศ namespace ต่อไปนี้ตรวจสอบให้แน่ใจว่าMainมีการทำเครื่องหมายด้วย[STAThread]คุณลักษณะ คำแนะนำทีละขั้นตอนในคำตอบอื่น

    using System.Windows.Forms;

ในการคัดลอกสตริงที่แน่นอน (ตัวอักษรในกรณีนี้):

Clipboard.SetText("Hello, clipboard");

หากต้องการคัดลอกเนื้อหาของกล่องข้อความให้ใช้TextBox.Copy ()หรือรับข้อความก่อนจากนั้นตั้งค่าคลิปบอร์ด:

Clipboard.SetText(txtClipboard.Text);

ดูตัวอย่างที่นี่ หรือ ... เอกสารอย่างเป็นทางการของ MSDNหรือนี่สำหรับ WPF


หมายเหตุ:


@KierenJohnstone เป็นไปได้หรือไม่ที่จะเข้าถึงเนื้อหาของคลิปบอร์ดโดยใช้คู่คีย์ - ค่า
Abdul

@Abdul - ฉันไม่แน่ใจว่าคุณหมายถึงอะไร เนื้อหาของคลิปบอร์ดสามารถเป็นข้อความไฟล์รูปภาพข้อมูลแบบกำหนดเองใด ๆ ก็ได้ แนวคิดของคู่ kv ดูเหมือนจะไม่เกี่ยวข้องกับแนวคิดคลิปบอร์ดหรือไม่?
Kieren Johnstone

@ KierenJohnstone สิ่งที่ฉันพยายามทำคือสิ่งที่ผู้ใช้สามารถเก็บหลายสิ่งไว้ในคลิปบอร์ด สิ่งสำคัญเหล่านั้นจะเข้าถึงได้โดยกุญแจ คล้ายกับที่จัดเก็บในตัว HTML5 หรือเป็นสิ่งที่ไม่สามารถทำได้เนื่องจากลักษณะของคลิปบอร์ด
Abdul

หากคุณได้รับข้อผิดพลาดกับ ASP.NET ลองใช้กับเธรดใหม่: var thread = new Thread (param => {Clipboard.SetText (txtName.Text);}); thread.SetApartmentState (ApartmentState.STA); thread.start ();
3790692

1
คำตอบของ skia.heliou ช่วยฉัน: หลังจากเพิ่มแอตทริบิวต์ [STAThreadAttribute] แล้วคลิปบอร์ดของฉันวิธี
SetText

44

สำหรับโครงการคอนโซลแบบทีละขั้นตอนคุณจะต้องเพิ่มการSystem.Windows.Formsอ้างอิงก่อน ขั้นตอนต่อไปนี้ทำงานใน Visual Studio Community 2013 ด้วย. NET 4.5:

  1. ในโซลูชัน Explorerขยายโครงการคอนโซลของคุณ
  2. คลิกขวาที่อ้างอิงจากนั้นคลิกเพิ่มการอ้างอิง ...
  3. ในกลุ่มชุดประกอบภายใต้กรอบงานให้เลือกSystem.Windows.Formsเลือก
  4. คลิกตกลง

จากนั้นเพิ่ม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)
{
  // ...
}

1
ชั้นStackOverflowExceptionนำหน้าทันทีSTAThreadAttributeใน. NET Framework System Class Library =)
skia.heliou

42

ประสบการณ์ของฉันเกี่ยวกับปัญหานี้โดยใช้ 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บนฝั่งเซิร์ฟเวอร์ฉันไม่ได้โดยใช้ วิธีเดียวหลังจากการวิจัยจำนวนมาก


ฉันใช้มันในการทดสอบซีลีเนียมอัตโนมัติ (webdriver) และใช้งานได้ดี!
andrew.fox

@ andrew.fox คุณลองในเซิร์ฟเวอร์ของคุณ - รูปแบบไคลเอนต์หรือไม่ เพราะถ้าเป็น 2 เครื่องฉันคิดว่ามันไม่น่าจะใช้ได้
BMaximus

ไม่เลยซีลีเนียมเปิดหน้าต่างเบราว์เซอร์บนเครื่องตัวแทน
andrew.fox


1

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;
        }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.