AIRのドラッグ&ドロップ起動について調べてみた
任意のファイルをAIRアプリのアイコン上にドラッグ&ドロップして起動した時に、そのドロップされたファイル情報を取得する方法について調べてみました。
AIRアプリの起動情報に関しては flash.system.Shell クラスが把握していますが、プロパティとして直接参照はできません。
その代わりに flash.events.InvokeEvent から参照することができます。
どのタイミングでもいいようですが、起動時に必要になることが多いため applicationComplete に設定したメソッド内に以下のように記述しておくことにします。
Shell.shell.addEventListener( InvokeEvent.INVOKE, onInvoke );
そしてイベントハンドラを以下のように記述します。
private function onInvoke( e:InvokeEvent ):void {
for ( var i:uint = 0; i < e.arguments.length; ++i ){
var file:File = new File( e.arguments[ i ] );
}
var currentDir:File = e.currentDirectory;
}
InvokeEvent の arguments プロパティは、起動時に渡されたファイルのフルパスを格納した配列引数の配列です。
コマンドラインからの実行により任意の引数を渡すことができますが、デフォルトでは何も指定されていないためファイルをドロップした場合はファイルのフルパスのみが格納されます。
たとえばショートカットの設定に /a というコマンドを自前でつけてしまうと、arguments の先頭要素が /a という文字列になり、その後にドラッグ&ドロップ起動時のドロップしたファイルのフルパスが続くことになります。
このフルパスはあくまで文字列なので、実際にファイルを読むためには File インスタンスをパス情報から自前で生成する必要がありますが、コマンドラインから実行された時のことを考慮して有効なパスかどうか念のため確認した方がよさそうです。
ディレクトリをドロップした場合はディレクトリのフルパスのみが渡され、ディレクトリ内の全ファイルが配列に格納されるわけではありません。
currentDirectory プロパティは、起動パス情報を持つ File インスタンスです。
設定ファイルなど AIR アプリの格納ディレクトリ下に置く場合には、ここから参照すればよさそうですが、たまに正確な情報を返さないことがあるようなのでもう少し探ってみます。
ドロップ起動に対応するアプリが作れるなら、やれることが大幅に増えますね。
----追記----
arguments プロパティの説明について若干誤りがあったので書き直しました。
ドラッグ&ドロップ起動だけでなく、隠しコマンド起動をつけられるということですね。


