如何在C#中将数据复制到剪贴板


Answers:


798

有两个类,它们生活在不同的程序集和不同的命名空间中。

  • 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此处


备注:


@KierenJohnstone是否可以使用键值对访问剪贴板内容?
阿卜杜勒

@Abdul-我不确定你的意思。剪贴板的内容可以是文本,文件,图像或任何类型的自定义数据。kv-pairs的概念似乎与剪贴板的想法无关吗?
基琳·约翰斯通

@KierenJohnstone我正在尝试制作的东西可以让用户在剪贴板中存储多个东西。那些东西将通过钥匙来访问。它类似于HTML5本地存储。还是由于剪贴板的性质而无法实现类似目的?
阿卜杜勒

如果您在使用ASP.NET时遇到错误,请尝试在新线程中使用:var thread = new Thread(param => {Clipboard.SetText(txtName.Text);}); thread.SetApartmentState(ApartmentState.STA); thread.Start();
user3790692 '16

1
skia.heliou的回答对我有所帮助:添加属性[STAThreadAttribute]之后,我的Clipboard.SetText方法开始工作
viteo

44

对于逐步的控制台项目,您必须首先添加System.Windows.Forms参考。以下步骤在带有.NET 4.5的Visual Studio社区2013中工作:

  1. 解决方案资源管理器中,展开您的控制台项目。
  2. 右键单击“ 引用”,然后单击“ 添加引用...”。
  3. 大会组,下框架,选择System.Windows.Forms
  4. 单击确定

然后,using在代码顶部添加以下语句以及其他语句:

using System.Windows.Forms;

然后,添加以下任一ClipboardSetText对代码的声明:

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

最后,按如下所示添加STAThreadAttribute到您的Main方法中,以避免出现System.Threading.ThreadStateException

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

1
该类StackOverflowException紧邻STAThreadAttribute.NET Framework系统类库=)
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。经过大量研究,唯一的方法。


我在自动硒测试(网络驱动程序)中使用了它,效果很好!
andrew.fox

您在服务器-客户端模型上尝试了@ andrew.fox?因为如果是2台单独的机器,我想它应该不起作用。
BMaximus

大声笑,Selenium将打开代理计算机上的浏览器窗口。
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;
        }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.