エクスプローラーなどからのファイルのドラッグ&ドロップを受け取る

エクスプローラーなどからのドラッグ&ドロップを受け取るコードの例です。
ここではListBoxにファイルをドロップすると
その一覧を表示するようにしてみます。

例ではListBoxですが方法は同じなので
Formや他のコントロールにも応用できます。

まず準備として
ListBoxのAllowDropプロパティーをTrueに設定し、ドロップを受付可能にします。

次に、ListBoxのDragEnterとDragDropイベントハンドラを追加します。
(イベント一覧のそれぞれの項目をダブルクリックすれば雛形が自動的に追加されます)

DragEnterイベントは
ファイルをドラッグ中のマウスポインタが
コントロールのクライアント領域上に移動された時に発生します。

DragDropイベントは
ドロップ操作が完了した時に発生します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void listBox1_DragEnter(object sender, DragEventArgs e)
        {
            // ドラッグ中のデータ形式がファイルであれば受け付ける
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                // ドラッグ中のデータ一覧を取得
                string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
                foreach (string file in files)
                {
                    if (!System.IO.File.Exists(file))
                    {
                        // ファイルが存在しない、またはファイル以外(フォルダなど)
                        return;
                    }
                }

                // コピー可能を設定
                e.Effect = DragDropEffects.Copy;
            }
        }

        private void listBox1_DragDrop(object sender, DragEventArgs e)
        {
            // ドラッグ&ドロップされたファイル
            string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);

            // ListBoxにファイル一覧を追加
            listBox1.Items.AddRange(files);
        }
    }
}

Vista環境での注意点

Vista環境では注意が必要です。
例えば、管理者権限でVisualStudioを起動し
デバッグモードで実行されたアプリは同じく管理者権限となりますが
ここへ非管理者権限のエクスプローラーなどからドラッグ&ドロップしようとしても
そもそもDragEnterイベントが発生しません。
どうやら低い権限から高い権限への操作は許されないようです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)