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

问题描述 投票:0回答:10

如何在 C# 中将字符串(例如“hello”)复制到系统剪贴板,以便下次按 CTRL+V 时我会得到“hello”?

c# clipboard
10个回答
976
投票

有两个类位于不同的程序集和不同的命名空间中。

  • WinForms:使用以下命名空间声明,确保

    Main
    标记有
    [STAThread]
    属性:

    using System.Windows.Forms;
    
  • WPF:使用以下命名空间声明

    using System.Windows;
    
  • 控制台:添加对

    System.Windows.Forms
    的引用,使用以下命名空间声明,确保
    Main
    标记有
    [STAThread]
    属性。另一个answer

    中的分步指南
    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 - 复制到剪贴板?


61
投票

对于分步方式的 console 项目,您必须首先添加

System.Windows.Forms
引用。以下步骤适用于使用 .NET 4.5 的 Visual Studio Community 2013:

  1. 解决方案资源管理器中,展开您的控制台项目。
  2. 右键单击参考,然后单击添加参考...
  3. Assemblies 组中的 Framework 下,选择
    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)
{
  // ...
}

52
投票

我使用 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();

归功于这篇文章这里

但这仅适用于本地主机,因此不要在服务器上尝试此操作,因为它不起作用。

在服务器端,我使用

zeroclipboard
做到了。经过大量研究后,唯一的方法。


44
投票
Clipboard.SetText("hello");

您需要使用

System.Windows.Forms
System.Windows
命名空间。


11
投票

Clip.exe 是 Windows 中用于设置剪贴板的可执行文件。 注意,这不适用于除 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;
        }

4
投票

这适用于.net core,无需引用

System.Windows.Forms

using Windows.ApplicationModel.DataTransfer;

DataPackage package = new DataPackage();
package.SetText("text to copy");
Clipboard.SetContent(package);

它可以跨平台工作。在 Windows 上,您可以按 windows + V 查看剪贴板历史记录


3
投票

如果不想将线程设置为 STAThread,请使用

Clipboard.SetDataObject(object sthhere)
:

Clipboard.SetDataObject("Yay! No more STA thread!");

3
投票

对于现代跨平台.NET,您需要使用 MAUI 版本。简短的答案是

await Clipboard.Default.SetTextAsync("This text was highlighted in the UI.");
并且应该引用
Microsoft.Maui.Essentials.dll
。长答案包含在本文中。


1
投票

在 @page AspCompat="true" 中使用 ASP.net Web 表单,将 system.windows.forms 添加到您的项目中。 在您的 web.config 添加:

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="false" />
  </appSettings>

然后你可以使用:

Clipboard.SetText(CreateDescription());

1
投票

如果您不想或无法使用 System.Windows.Forms,您可以使用 Windows 本机 api:user32 和剪贴板功能

GetClipboardData
SetClipboardDat
(pinvoke)

可以在此处找到 .NET 6 包装器库 https://github.com/MrM40/WitWinClipboard/tree/main

© www.soinside.com 2019 - 2024. All rights reserved.