2012-02-21 9 views
1

私はWindowsソフトウェアを作成しました。私はこのプログラムにファイル拡張子を関連付けました。データファイルをダブルクリックすると、プログラムが起動し、ファイルが開きます。これまでのところ動作します。しかし、複数のファイルを選択し、コンテキストメニューで[開く]をクリックすると、プログラムのインスタンスが複数起動されます。私は、Windowsが自分のプログラムの1つのインスタンスですべてのファイルを開くようにします。私のプログラムにone-instance-handlerを実装しなければ、これは可能ですか?複数の関連ファイルをプログラムに渡すにはどうすればよいですか?

現在レジストリ内MyFileType/shell/open/commandは次のようになります。

"C:\Program Files\MyApp\MyApp.exe" "%1" 

は、たぶん私はそれが動作を取得するために「%1」の代わりに使用する必要がありますいくつかの特別なトークン/変数はありますか? Linuxでは、1つのファイルには%f、ファイルのリストには%Fを使用する必要があります。 Windowsに似たものがありますか?

答えて

3

最も簡単な方法は、ファイルタイプのデフォルトのシェル動詞(たとえば「開く」または「再生」)にアプリケーションを関連付け、SHCreateShellItemArrayFromDataObjectを使用して選択したファイルを取得するドロップターゲットを実装することです。推奨読書:How the Shell Invokes Verbs

デフォルトの動詞を引き継いでいない場合は、ファイルアソシエーションのopen with listに動詞を追加することができます。

もう1つの方法は、アプリケーションをシングルトンにして、DDEやRPCなどのプロセス間通信の方法で最初のインスタンスにドキュメントのパスを送信することです。これには、メインウィンドウを応答し続ける必要があります(たとえば、ダイアログを表示している場合は機能しません)。

+0

(これらのコメントには十分なスペースがないため、3つに分割しています):最初の段落:それを手に入れません。申し訳ありませんが、私はWindowsの開発者ではありません。私のアプリケーションはプラットフォームに依存せず、Javaで書かれています。コマンドライン引数として指定されたすべてのファイルを開くEXEファイルです。 SHCreateShellItemArrayFromDataObjetが何であるか、そしてJavaでどのようにこれを行うことができるか分かりません。そして、私が知る限り、すでにデフォルトのシェル動詞(この場合は "open")を使用しています。 – kayahr

+0

2番目の段落:このOpenWithListを試しましたが、動作しません。ドキュメントには、同じファイルタイプの複数のアプリケーションを登録するための説明が書かれています。それは私が必要とするものではありません。私は既にファイルタイプにアプリケーションを関連づけています。私は、一度にファイルのリストを開くと、Windowsが自分のアプリケーションを複数回開くことを望んでいません。 – kayahr

+0

第3段落:私はこの問題を避けたいと書きましたが、Windowsが本当にファイルリストをプログラムに渡すことができない場合は、このようにしなければなりません。 – kayahr

0

%*あなたが探しているものかもしれません。

+0

これを試してみてください。動作しません。それは空です。そして、 "%*"(引用符付き)を使うと、プログラムは空のファイル名でファイルを開こうとします。 – kayahr

関連する問題