.NET TIPS

Webブラウザ上のアドレスをドラッグ&ドロップで取得するには?[2.0、3.0、3.5、C#、VB]

デジタルアドバンテージ 一色 政彦
2009/04/16

 「TIPS:エクスプローラからファイルをドラッグ&ドロップできるようにするには?」では、WindowsエクスプローラからWindowsアプリケーション上にフォルダやファイルがドラッグ&ドロップされたときに、ドロップされたフォルダやファイルの(Windowsシステム上の)パスをアプリケーション側で取得する方法を紹介している。

 しかし当然、このようなドラッグ&ドロップで受け取れるデータは、ファイル/フォルダ・パスだけではない。例えば、Webブラウザのアドレスバー上に表示されたアイコン(もしくはテキスト)がアプリケーションにドラッグ&ドロップされたときに、そのURI(=アドレス)を受け取ることも可能だ。次の画面は実際にこれを行っている例である。

URIのドラッグ&ドロップを行っている例
IE(Internet Explorer)のアドレスバー上に表示されたアイコンを、アプリケーション(この例では筆者が愛用しているEmEditorというテキスト・エディタ)上にドラッグ&ドロップすると、そのURIのテキスト(この例では「http://www.atmarkit.co.jp/fdotnet/」)が挿入される。

 本稿では上の画面のように、Webブラウザのアドレスをドラッグ&ドロップで取得する方法を紹介する。

WebブラウザのURIをドラッグ&ドロップで取得する方法

 アプリケーションがドラッグ&ドロップに対応する基本的な方法は、前掲のTIPSを参考にしてほしいが、具体的には以下を実装する必要がある。

(1)ドロップを受け入れたいフォーム(もしくはコントロール)のAllowDropプロパティをTrueに設定
(2)同フォーム(もしくはコントロール)のDragEnterイベント・ハンドラとDragDropイベント・ハンドラを記述

 前掲のTIPSではDragEnter/DragDropイベント・ハンドラ内で、e.Data.GetDataPresentメソッド*1を使って、ドラッグ中のデータ形式が「フォルダやファイル」(DataFormats.FileDrop)かどうかを判定しているが、これを「URI」かどうかの判定に書き換えれば対応完了である。

*1 e.DataはIDataObjectインターフェイス(System.Windows.Forms名前空間)のオブジェクト。これは、DragEnter/DragDropイベント・ハンドラの第2パラメータ「e」(=System.Windows.Forms名前空間のDragEventArgsクラスのオブジェクト)のDataプロパティから取得できる。

 しかしフォルダやファイルのドラッグ&ドロップでは、DataFormatsクラス(System.Windows名前空間)の静的フィールドの1つ「DataFormats.FileDrop」(=文字列型*2)を使えばよかったのに対し、URIに対応するフィールド値は用意されていないのでこれが使えない。そのため、代わりにURI形式を示す文字列を指定する必要がある。

*2 DataFormatsクラスのフィールド値は文字列型であり、実際、DataFormats.FileDropは“FileDrop”という文字列である。用意されているフィールドとそれに対応する文字列は、「MSDN:DataFormatsクラス」を参照してほしい。

 データ形式としてURIを示す文字列は、次の2つがある(このようなデータ形式を示す文字列を調べる方法は、本TIPSの最後に紹介する)。

“UniformResourceLocator”
“UniformResourceLocatorW”

 従って、これらを「DataFormats.FileDrop」の代わりに用いればよい。次のコードは、実際にDragEnter/DragDropイベント・ハンドラで、これらを用いてURIを判定し、ドラッグ&ドロップに対応する例だ。

private void Form1_DragEnter(object sender, DragEventArgs e)
{
  if (e.Data.GetDataPresent("UniformResourceLocator") ||
      e.Data.GetDataPresent("UniformResourceLocatorW"))
  {
    e.Effect = DragDropEffects.Copy;
  }
}

private void Form1_DragDrop(object sender, DragEventArgs e)
{
  string uri = e.Data.GetData(DataFormats.Text).ToString();
  this.textBox1.Text = uri;
}
Private Sub Form1_DragEnter(ByVal sender As Object, ByVal e As DragEventArgs) Handles MyBase.DragEnter
  If e.Data.GetDataPresent("UniformResourceLocator") Or _
     e.Data.GetDataPresent("UniformResourceLocatorW") Then
    e.Effect = DragDropEffects.Copy
  End If
End Sub

Private Sub Form1_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs) Handles MyBase.DragDrop
  Dim uri As String = e.Data.GetData(DataFormats.Text).ToString()
  Me.textBox1.Text = uri
End Sub
URIのドラッグ&ドロップに対応するコードの例(上:C#、下:VB)

 コードの内容については、前掲のTIPSと説明が重複するので割愛する。このコードで注意してほしい点は、e.Data.GetDataメソッドの引数が「DataFormats.Text」となっているところだ(前掲のTIPSでは、ここが「DataFormats.FileDrop」となっている)。これはドロップしたときに、テキスト・データを取得するためのもので、つまりこのメソッドはURIを文字列として取得している。

 次の画面は実際に上記のコードを実行した例だ。Windowsフォーム上にテキストボックスを配置して、マルチライン(=Multilineプロパティに「True」を設定)、親コンテナいっぱいのサイズ(=Dockプロパティに「Fill」を設定)にしている。

ドラッグ
ドロップ
WebブラウザのURIをドラッグ&ドロップするWindowsアプリケーションの実行例

 さまざまなブラウザで検証した結果、上記のコードを使ったサンプル・アプリケーションは、IE、Firefox、Safari、Chromeで問題なく動作した。しかしOperaは、Windows OSのドラッグ&ドロップ方式を採用していないらしく、本TIPSの方法ではURIのドラッグ&ドロップを受け取ることができなかった。

ドラッグ&ドロップ可能なデータ形式を示す文字列を調べる方法

 今回はURIをドラッグ&ドロップする方法を示したが、もちろんURI以外の任意のデータでドラッグ&ドロップに対応できる。では、今回の「UniformResourceLocator」のように、標準で用意されていないデータ形式の名前を取得するにはどうすればよいのだろうか。

 これには、e.Data.GetFormatsメソッド(=戻り値は文字列配列)が使える。具体的には例えば、次のようなコードを、DragEnterイベント・ハンドラ内に書けばよい(このコード例では、テキストボックスに文字列配列のデータを設定している)。

this.textBox1.Lines = e.Data.GetFormats();

 次の画面は、先ほどのアプリケーションにこのコードを書き足し、実行している例だ。

ドラッグ&ドロップ可能なデータ形式を示す文字列を調べている例

 この画面を見ると、1つのドラッグ&ドロップにはさまざまなデータ形式が含まれていることが分かる。End of Article

利用可能バージョン:.NET Framework 2.0以降
カテゴリ:Windowsフォーム 処理対象:フォーム
使用ライブラリ:DragEventArgsクラス(System.Windows.Forms名前空間)
使用ライブラリ:DragDropEffects列挙体(System.Windows.Forms名前空間)
使用ライブラリ:DataFormats クラス(System.Windows名前空間)
使用ライブラリ:IDataObjectインターフェイス(System.Windows.Forms名前空間)
関連TIPS:エクスプローラからファイルをドラッグ&ドロップできるようにするには?

この記事と関連性の高い別の.NET TIPS
ファイルやディレクトリをエクスプローラへドラッグ&ドロップするには?
エクスプローラからファイルをドラッグ&ドロップできるようにするには?
[Silverlight 2]アプリケーションが配置されているURLを取得するには?
クリップボードからデータを受け取るには?
Visual Studioのメニューやツールバーをカスタマイズするには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間