C#コマンドライン引数とドラックアンドドロップ

C# コンピュータ
C#
アプリケーションを作る場合、ファイル名などのパラメタをアプリケーションに伝えたい場面があります。
方法はいろいろありますが、今回はコマンドライン引数とドラックアンドドロップを試してみたいと思います。

Consoleを使っていますのでコンパイル時のターゲットはwinexeではなくexeにしてください。

ソース

ファイル名:args_dd.cs

using System;
using System.Windows.Forms;
using System.Drawing;

// コマンドライン引数とドラッグ&ドロップ


class Program
{
    // プログラムのエントリポイント
    [STAThread]
    public static void Main(string[] args)
    {
        for (var i=0; i < args.Length; i++)
        {
            Console.WriteLine("コマンドライン引数_{0}番目:{1}", i, args[i]);
        }
        Application.Run(new Form1());
    }
}
class Form1 : Form
{
    // コンストラクタ
    public Form1()
    {
        // ドラック&ドロップを受け入れる
        this.AllowDrop = true;
        // ドラック&ドロップの効果
        this.DragEnter += (sender, e) => {
            e.Effect = DragDropEffects.All;
        };
        // ドラック&ドロップイベント
        this.DragDrop += (sender, e) => {

            // ドロップされたデータを文字配列に取得
            string[] fileName =
                (string[]) e.Data.GetData(DataFormats.FileDrop, false);
            
            for(var i=0; i < fileName.Length; i++)
            {
                Console.WriteLine("ドラックアンドドロップ_{0}番目:{1}",
                    i, fileName[i]);
            }

        };

    }
}

コンパイル

PS>csc args_dd.cs

実行

コマンドライン引数
基本的にはPowerShellやCMDなど実行ファイル名を入力して実行する際に引数を記述し実行。
それ以外としてはファイルの関連付けやエクスプローラーの「送る」などでも使われています。

PS>.\args_dd a b c
コマンドライン引数_0番目:a
コマンドライン引数_1番目:b
コマンドライン引数_2番目:c

ドラックアンドドロップ

エクスプローラーでファイルを3つ(Ctrlを押しながら1つおきにクリック)選択しフォームへドラックアンドドロップ

ドラックアンドドロップ_0番目:H:\Pictures\201802081629-320x180.png
ドラックアンドドロップ_1番目:H:\Pictures\201902141503-120x68.png
ドラックアンドドロップ_2番目:H:\Pictures\201908230857.jpg

説明

コマンドライン引数は多くのプログラミング言語と同様に、C#でもアプリケーションの開始位置であるMainの引数で受け取ることができます。
引数の文字配列の0番目がコマンドライン引数の最初の値になります。

ドラックアンドドロップを有効化するおまじないがありますが、データの受け渡しはDragDropイベントで行います。
連続しない複数のファイルを選択しドラックアンドドロップしたところ、選択したファイルのみの配列が引き渡されました。

コマンドライン引数は他のプログラミング言語の経験があればすんなり理解できるのですが、ドラックアンドドロップは作って試してみないと理解しにくいです。
ちなみに今回はサンプルとしてformオブジェクトのDragDropイベントを受け取りました。
しかし、DragDropイベントはコントロールごとに持ちますので現実的にはフォーム上の一番手前のコントロールイベントで受け取ることになります。

コメント