ファイルをD&Dしてそのパスを知るには?

フリーウェアなWindowsプログラミングツール『HSP』(公式サイト「HSPTV!」)。ドラッグ&ドロップ(D&D)したファイルのパスを取得する方法です。
 これには大きく2つの状態が想定されます。

実行ファイル(のアイコン)にファイルをD&D

HSP製実行ファイルのアイコンにファイルをドラッグ&ドロップ。このドロップされたファイルのフルパスを取得。 エクスプローラなどのファイラー上で、HSPで作成した実行ファイルのアイコンに、何かしらファイルをドラッグ&ドロップ(D&D)したとします。すると、実行ファイルが起動しますが、ここでドラッグ&ドロップされたファイルパス文字列を取得します。

これは単純で、各種フォルダパスを取得するHSPのdirinfo関数(タイプ4)or システム変数「dir_cmdline」を利用します。これは「コマンドライン」(コマンドライン引数)の文字列です。

//	実行ファイル自動作成をしてください

	mes dirinfo(4)

ちなみに、HSPスクリプトエディタ上では仮想のコマンドライン文字列を指定できるようになってます。[HSP]メニューの[起動オプション]です。これを利用すればエディタ上での動作テストが可能です。(利用しない場合は空欄にしておくことをオススメします。)

*注意点
 Windows NT系以降(Windows 2000、XP、Vista、7)の環境で、ドラッグ&ドロップされたファイルパス文字列内に スペースが含まれてた場合、パスの前後が「"」で括られる仕様があります。(たとえば「C:\Program Files\〜」)
 「"」付きのままのファイルパスだと、exist命令で存在しないと判定されます。また、ファイル読み 込み関連命令(noteload命令、bload命令、picload命令など)に指定すると、確実にHSPエラー12になります。それに 備えて、「"」を取り除く処理を必ず用意してください。

//	変数filepathにパス文字列が代入されてると仮定して・・・

	if peek(filepath, ) = '"' : getstr filepath, filepath, 1, '"'

上のHSP3コードはpeek関数で先頭バイトを取得し「"」ならば、getstr命令で前の「"」分(1バイト)をスキップさせて後ろの「"」までを切り出す、という処理になってます。

screen命令で用意したウィンドウ上にファイルをD&D

HSPのscreen命令やbgscr命令で用意したウィンドウ上にファイルがドラッグ&ドロップ(D&D)された場合に、このファイルパス文字列を取得します。
 これは標準命令だけでは無理で、Win32 API関数を利用する必要があります。HSP本体の「sample\new\dragdrop.hsp」にサンプルスクリプトが用意されてます。(HSP 3.2〜では「sample\misc\dragdrop.hsp」)

簡単に流れを書くと、DragAcceptFiles関数で自ウィンドウにドロップを許可します。ファイルがドロップされると、ウィンドウメッセージ「WM_DROPFILES」がWindowsから通知されるので、これを捕らえるためあらかじめHSPのoncmd命令を用意しておいて、この通知があった時のラベルジャンプ先を指定しておきます。

ジャンプ先では、wParamにドロップされたファイルの情報が含まれてる構造体のハンドルが返るので、これをDragQueryFile関数に指定して、ドロップされたファイルパスを取得します。ドロップされたウィンドウ内の位置を知りたければ、標準のシステム変数「mousex」「mousey」を見ます。
 最後にDragFinish関数でハンドルを開放します。

ちなみに、HSP2時代はomcnd命令に相当する標準命令が存在しなかったので、llmod.asモジュールの「dragdrop.as」 では機械語(マシン語)を埋め込んで処理を実現してました。HSP3ではオール標準命令+Win32 API関数だけで済むので 大分楽です。(HSP 3.2では「llmod3.hsp」が再び同封され、「dragdrop.hsp」モジュールのdd_accept命令とdd_reject命令 が使えるようになってはいますが、利用価値がないので使わないでください。)

キーワード de HSP

HSPミニ講座

★ Yahoo!経由用ページ : ファイル | フォルダ | メニュー | マウス | ウィンドウ | オブジェクト | 文字列 | システム | 関数 | sendmsg命令 | その他 | サイトマップ | リンク