ฉันจะคัดลอกสตริง (เช่น "hello") ไปยังคลิปบอร์ดของระบบใน C # ดังนั้นในครั้งต่อไปที่ฉันกดCTRL+Vฉันจะได้รับ "hello"
ฉันจะคัดลอกสตริง (เช่น "hello") ไปยังคลิปบอร์ดของระบบใน C # ดังนั้นในครั้งต่อไปที่ฉันกดCTRL+Vฉันจะได้รับ "hello"
คำตอบ:
มีสองคลาสที่อาศัยอยู่ในแอสเซมบลีที่แตกต่างกันและ 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
หมายเหตุ:
คลิปบอร์ดเป็นแนวคิด UI ของเดสก์ท็อปพยายามตั้งค่าในโค้ดด้านเซิร์ฟเวอร์เช่น ASP.Net จะตั้งค่าบนเซิร์ฟเวอร์เท่านั้นและไม่มีผลกระทบกับสิ่งที่ผู้ใช้สามารถเห็นในเบราว์เซอร์ ในขณะที่คำตอบที่เชื่อมโยงจะช่วยให้หนึ่งเรียกใช้ฝั่งเซิร์ฟเวอร์รหัสการเข้าถึงคลิปบอร์ดกับSetApartmentState
มันไม่น่าเป็นสิ่งที่คุณต้องการที่จะบรรลุ
หากหลังจากทำตามข้อมูลในรหัสคำถามนี้ยังคงได้รับข้อผิดพลาดโปรดดูข้อผิดพลาด "เธรดปัจจุบันต้องตั้งค่าเป็นพาร์ทเมนต์เธรดเดี่ยว (STA)" ในสตริงการคัดลอกไปยังคลิปบอร์ด
คำถาม / คำตอบนี้ครอบคลุม. NET แบบปกติสำหรับ. NET Core โปรดดู - .Net Core - คัดลอกไปยังคลิปบอร์ดหรือไม่
สำหรับโครงการคอนโซลแบบทีละขั้นตอนคุณจะต้องเพิ่มการSystem.Windows.Forms
อ้างอิงก่อน ขั้นตอนต่อไปนี้ทำงานใน Visual Studio Community 2013 ด้วย. NET 4.5:
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 System Class Library =)
ประสบการณ์ของฉันเกี่ยวกับปัญหานี้โดยใช้ 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
บนฝั่งเซิร์ฟเวอร์ฉันไม่ได้โดยใช้ วิธีเดียวหลังจากการวิจัยจำนวนมาก
Clipboard.SetText("hello");
คุณจะต้องใช้System.Windows.Forms
หรือSystem.Windows
namespaces เพื่อที่
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;
}