我怎么能复制一个字符串(例如“hello”)到系统剪贴板在c#,所以下次我按CTRL+V我会得到“hello”?


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

WinForms:使用以下命名空间声明,确保Main带有[STAThread]属性: 使用System.Windows.Forms; WPF:使用以下命名空间声明 使用System.Windows; 添加对System.Windows的引用。表单,使用以下命名空间声明,确保Main标记有[STAThread]属性。一步一步的指导在另一个答案 使用System.Windows.Forms;

复制一个精确的字符串(在本例中是字面量):

Clipboard.SetText("Hello, clipboard");

要复制文本框的内容,可以使用textbox . copy()或先获取文本,然后设置剪贴板值:

Clipboard.SetText(txtClipboard.Text);

请看这里的例子。 还是……官方MSDN文档或WPF的这里。


备注:

Clipboard is desktop UI concept, trying to set it in server side code like ASP.Net will only set value on the server and has no impact on what user can see in they browser. While linked answer lets one to run Clipboard access code server side with SetApartmentState it is unlikely what you want to achieve. If after following information in this question code still gets an exception see "Current thread must be set to single thread apartment (STA)" error in copy string to clipboard This question/answer covers regular .NET, for .NET Core see - .Net Core - copy to clipboard?


Clipboard.SetText("hello");

您需要使用System. windows . forms或System。Windows命名空间。


我在这个问题上使用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。唯一的办法,经过大量研究。


对于控制台项目,您必须首先添加System.Windows.Forms引用。以下步骤在Visual Studio Community 2013和。net 4.5中工作:

在“解决方案资源管理器”中展开控制台项目。 右键单击引用,然后单击添加引用… 在“程序集”组中,在“框架”下,选择System.Windows.Forms。 单击OK。

然后,将下面的using语句添加到代码顶部的其他语句中:

using System.Windows.Forms;

然后,添加下列剪贴板之一。SetText语句到你的代码:

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

最后,将STAThreadAttribute添加到Main方法中,以避免System.Threading.ThreadStateException:

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

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;
        }

在ASP.net web表单中使用@page AspCompat="true",将system.windows.forms添加到你的项目中。 在你的网上。配置添加:

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

然后你可以使用:

Clipboard.SetText(CreateDescription());

如果您不想将线程设置为STAThread,请使用Clipboard。SetDataObject sthhere(对象):

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

这在。net core上工作,不需要引用System.Windows.Forms

using Windows.ApplicationModel.DataTransfer;

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

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


如果你不想或者不能使用System.Windows.Forms,你可以使用Windows本地api: user32和剪贴板函数GetClipboardData和SetClipboardDat (pinvoke)

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