将结果复制到剪贴板

0 c#

大家好我写一个控制台应用程序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        public static void Main(String[] args)
        {
            if (args.Length == 0)
            {
                Console.WriteLine("No file to upload...");
                Environment.Exit(0);
            }
            else
                Console.WriteLine("[~] Trying to upload: " + args[0]);
            string name = Regex.Match(args[0], @"[^\\]*$").Value;
            ftp ftpClient = new ftp(@"ftp://site.ru/", "dfgd", "QWERTY_123");
            ftpClient.upload("www/site.ru/upload/" + name, args[0]);
            Console.WriteLine("[+] Upload File Complete");
            Console.ReadKey();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

怎么Console.WriteLine("[+] Upload File Complete");复制args[0]到剪贴板后?

PaR*_*RaJ 10

首先,您必须在应用程序中添加对System.Windows.Forms的引用.

转到项目 - >添加引用,从刚打开的窗口中的.NET选项卡中选择System.Windows.Forms.

您必须通过将STAThread属性应用于Main()函数来避免ThreadStateException.然后您可以毫无问题地使用剪贴板功能.

using System;
using System.Windows.Forms;

class Program 
{
    [STAThread]
    static void Main(string[] args) 
    {
         Clipboard.SetText("this is in clipboard now");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你不想使用对System.Windows.Forms的引用,你可以通过P/Invoke来实现

平台调用Clipboard API是一种可能的解决方案.例:

using System.Runtime.InteropServices;
class Program
{
    [DllImport("user32.dll")]
    internal static extern bool OpenClipboard(IntPtr hWndNewOwner);

    [DllImport("user32.dll")]
    internal static extern bool CloseClipboard();

    [DllImport("user32.dll")]
    internal static extern bool SetClipboardData(uint uFormat, IntPtr data);

    [STAThread]
    static void Main(string[] args)
    {
        OpenClipboard(IntPtr.Zero);
        var yourString = "Hello World!";
        var ptr = Marshal.StringToHGlobalUni(yourString);
        SetClipboardData(13, ptr);
        CloseClipboard();
        Marshal.FreeHGlobal(ptr);
    }
}
Run Code Online (Sandbox Code Playgroud)

这只是一个例子.在代码周围添加一些错误处理,比如检查P/Invoke函数的返回值将是一个很好的补充.

SetClipboardData 是有趣的一点,你也想确保你打开和关闭剪贴板.

13通过在作为第一个参数是数据格式.13 表示unicode字符串.


Dav*_*vid 6

Marshal.StringToHGlobalUni函数实际上以不适合SetClipboardData的方式分配内存(使用带有LMEM_FIXED的LocalAlloc),这可能导致崩溃.(你不会指望它给出方法名称,但是进入代码,例如使用ReSharper就会发现这一点.)SetClipboardData要求GlobalAlloc和GMEM_MOVABLE根据文档:MSDN上的SetClipboardData.

这是MIT许可的System.Windows.Forms替代方案,经过测试并完成了错误处理:Clippy

(剪贴板推送代码本身可以在这里找到:Clippy.cs