政彦2009/04/16「TIPS:エクスプローラからファイルをドラッグ&ドロップできるようにするには?」では、WindowsエクスプローラからWindowsアプリケーション上にフォルダやファイルがドラッグ&ドロップされたときに、ドロップされたフォルダやファイルの(Windowsシステム上の)パスをアプリケーション側で取得する方法を紹介している。このようなドラッグ&ドロップで受け取れるデータは、ファイル/フォルダ・パスだけではない。Webブラウザのアドレスバー上に表示されたアイコン(もしくはテキスト)がアプリケーションにドラッグ&ドロップされたときに、そのURI(=アドレス)を受け取ることも可能だ。次の画面は実際にこれを行っている例である。Explorer)のアドレスバー上に表示されたアイコンを、アプリケーション(この例では筆者が愛用しているEmEditorというテキスト・エディタ)上にドラッグ&ドロップすると、そのURIのテキスト(この例では「http://www.atmarkit.co.jp/fdotnet/」)が挿入される。本稿では上の画面のように、Webブラウザのアドレスをドラッグ&ドロップで取得する方法を紹介する。WebブラウザのURIをドラッグ&ドロップで取得する方法アプリケーションがドラッグ&ドロップに対応する基本的な方法は、前掲のTIPSを参考にしてほしいが、具体的には以下を実装する必要がある。前掲のTIPSではDragEnter/DragDropイベント・ハンドラ内で、e.Data.GetDataPresentメソッド*1を使って、ドラッグ中のデータ形式が「フォルダやファイル」(DataFormats.FileDrop)かどうかを判定しているが、これを「URI」かどうかの判定に書き換えれば対応完了である。e.DataはIDataObjectインターフェイス(System.Windows.Forms名前空間)のオブジェクト。これは、DragEnter/DragDropイベント・ハンドラの第2パラメータ「e」(=System.Windows.Forms名前空間のDragEventArgsクラスのオブジェクト)のDataプロパティから取得できる。フォルダやファイルのドラッグ&ドロップでは、DataFormatsクラス(System.Windows名前空間)の静的フィールドの1つ「DataFormats.FileDrop」(=文字列型*2)を使えばよかったのに対し、URIに対応するフィールド値は用意されていないのでこれが使えない。そのため、代わりにURI形式を示す文字列を指定する必要がある。DataFormatsクラスのフィールド値は文字列型であり、実際、DataFormats.FileDropは“FileDrop”という文字列である。用意されているフィールドとそれに対応する文字列は、「MSDN:DataFormatsクラス」を参照してほしい。データ形式としてURIを示す文字列は、次の2つがある(このようなデータ形式を示す文字列を調べる方法は、本TIPSの最後に紹介する)。“UniformResourceLocator”“UniformResourceLocatorW”従って、これらを「DataFormats.FileDrop」の代わりに用いればよい。次のコードは、実際にDragEnter/DragDropイベント・ハンドラで、これらを用いてURIを判定し、ドラッグ&ドロップに対応する例だ。SubURIのドラッグ&ドロップに対応するコードの例(上:C#、下:VB)コードの内容については、前掲のTIPSと説明が重複するので割愛する。このコードで注意してほしい点は、e.Data.GetDataメソッドの引数が「DataFormats.Text」となっているところだ(※前掲のTIPSでは、ここが「DataFormats.FileDrop」となっている)。これはドロップしたときに、テキスト・データを取得するためのもので、つまりこのメソッドはURIを文字列として取得している。次の画面は実際に上記のコードを実行した例だ。Windowsフォーム上にテキストボックスを配置して、マルチライン(=Multilineプロパティに「True」を設定)、親コンテナいっぱいのサイズ(=Dockプロパティに「Fill」を設定)にしている。ドラッグドロップWebブラウザのURIをドラッグ&ドロップするWindowsアプリケーションの実行例さまざまなブラウザで検証した結果、上記のコードを使ったサンプル・アプリケーションは、IE、Firefox、Safari、Chromeで問題なく動作した。OSのドラッグ&ドロップ方式を採用していないらしく、本TIPSの方法ではURIのドラッグ&ドロップを受け取ることができなかった。今回はURIをドラッグ&ドロップする方法を示したが、もちろんURI以外の任意のデータでドラッグ&ドロップに対応できる。今回の「UniformResourceLocator」のように、標準で用意されていないデータ形式の名前を取得するにはどうすればよいのだろうか。これには、e.Data.GetFormatsメソッド(=戻り値は文字列配列)が使える。具体的には例えば、次のようなコードを、DragEnterイベント・ハンドラ内に書けばよい(このコード例では、テキストボックスに文字列配列のデータを設定している)。e.Data.GetFormats();次の画面は、先ほどのアプリケーションにこのコードを書き足し、実行している例だ。ドラッグ&ドロップ可能なデータ形式を示す文字列を調べている例この画面を見ると、1つのドラッグ&ドロップにはさまざまなデータ形式が含まれていることが分かる。より自動抽出したものです。7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。TranslatorはPowerPoint用のアドイン。