我怎么能复制一个字符串(例如“hello”)到系统剪贴板在c#,所以下次我按CTRL+V我会得到“hello”?
当前回答
在ASP.net web表单中使用@page AspCompat="true",将system.windows.forms添加到你的项目中。 在你的网上。配置添加:
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="false" />
</appSettings>
然后你可以使用:
Clipboard.SetText(CreateDescription());
其他回答
如果你不想或者不能使用System.Windows.Forms,你可以使用Windows本地api: user32和剪贴板函数GetClipboardData和SetClipboardDat (pinvoke)
.NET 6包装器库可以在这里找到https://github.com/MrM40/WitWinClipboard/tree/main
如果您不想将线程设置为STAThread,请使用Clipboard。SetDataObject sthhere(对象):
Clipboard.SetDataObject("Yay! No more STA thread!");
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;
}
这在。net core上工作,不需要引用System.Windows.Forms
using Windows.ApplicationModel.DataTransfer;
DataPackage package = new DataPackage();
package.SetText("text to copy");
Clipboard.SetContent(package);
它是跨平台的。在windows上,您可以按windows + V查看剪贴板历史记录
有两个类位于不同的程序集和不同的名称空间中。
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?