0

こんにちはみんな私はコンソールアプリを書きます:

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

クリップボードにConsole.WriteLine("[+] Upload File Complete");コピーした後はどうですか?args[0]

4

3 に答える 3

13

まず、アプリケーションにSystem.Windows.Formsへの参照を追加する必要があります。

[プロジェクト] -> [参照の追加] に移動し、開いたウィンドウの [.NET] タブから System.Windows.Forms を選択します。

Main() 関数に STAThread 属性を適用して、ThreadStateException を回避する必要があります。その後、問題なくクリップボード機能を使用できます。

using System;
using System.Windows.Forms;

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

System.Windows.Formsへの参照を使用したくない場合は、P/Invokeを介して行うことができます

プラットフォーム クリップボード API を呼び出すことが解決策の 1 つです。例:

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

これはほんの一例です。P/Invoke 関数の戻り値をチェックするなど、コードの周りに小さなエラー処理を追加することは良い追加です。

SetClipboardData興味深いことに、クリップボードも開いたり閉じたりする必要があります。

最初の13引数として渡されるのは、データ形式です。13は Unicode 文字列を意味します

于 2012-12-29T15:10:10.467 に答える
6

Marshal.StringToHGlobalUni 関数は、実際には SetClipboardData に不適切な方法でメモリを割り当てます (LMEM_FIXED で LocalAlloc を使用)。これにより、クラッシュが発生する可能性があります。(メソッド名が与えられているとは思わないでしょうが、たとえば ReSharper を使用してコードにステップインすると、これが明らかになります。) SetClipboardData には、ドキュメントに従って GMEM_MOVABLE を含む GlobalAlloc が必要です: MSDN の SetClipboardData

以下は、MIT ライセンスの System.Windows.Forms の代替で、テスト済みでエラー処理が完了しています: Clippy

(コード自体をプッシュするクリップボードは、Clippy.csにあります。

于 2014-07-11T13:22:10.360 に答える
0

ClipBoard.SetTextメソッドを使用する必要があります

 Clipboard.SetText(args[0], TextDataFormat.Text);
于 2012-12-29T15:09:38.343 に答える