2

Windows XP/Vista/7 の「Open with...」コンテキストメニューの一覧を Java から取得したいと考えています。

Windows レジストリから、アプリケーションを起動するコマンドを取得する方法を見つけることができました。しかし、Explorer Open with list コンテキスト メニューに示されているように、これらのアプリケーション名とアイコンを取得する方法がわかりませんでした。

また、これらの情報の管理方法は、OS のバージョンごとに異なるようです。

このためにJavaで使用できるライブラリはありますか?

ありがとう。

4

2 に答える 2

2

これにはレジストリは必要ありません。OpenAs_RunDLLAShell32.dll でGetProcAddress を使用する必要があります。それに関するドキュメントは見つかりませんが、それを次のように定義する Delphi コードがあります。

SHOpenWithProc = procedure(HWND: THandle; HInstance; THandle; 
                           CmdLine: PChar; CmdShow: Integer);

HWND、HInstance、および CmdShow は、かなりよく知られているはずです。Delphi の PChar は(ANSI バージョン - 以下を参照)NULL で終了する(C スタイル)文字列へのポインタに対応し、Unicode バージョンでは NULL で終了する WSTR に対応します。procedureDelphi では C に対応しvoid someproc();ます。はCmdLine完全修飾ファイル名を指す必要があるため、Windows は [開く] ダイアログで何を提供するかを認識します。

Java でGetProcAddress(および前の呼び出しを)どのように使用するかはわかりませんが、これで始められるかもしれません。LoadLibrary

ロードされる関数は ANSI バージョンであることに注意してください。WideChar (Unicode) の場合は、OpenAs_RunDLLW代わりにバージョンをロードし、それに応じて CmdLine パラメータを調整する必要があります (ワイド バージョンでコードを試したことはないと思います)。

注: これも役立つ場合があります。これは、API の ShellExecute 関数を介してOpenAs_RunDLLを使用することに関する MSDN の記事です。

于 2011-03-04T19:17:53.987 に答える
1

上記のコメントで示唆されているように、Windows で [プログラムから開く] ダイアログを呼び出す Java コードは次のようになります (例外処理は省略されています)。

CommandLine cmd = new CommandLine("rundll32.exe");
cmd.addArgument("shell32.dll,OpenAs_RunDLL");
cmd.addArgument(fullPathToMyFile.toString());
Process process = CommandLauncherFactory.createVMLauncher().exec(cmd, null);
これは Apache Commons Exec ライブラリを使用します。Java からプロセスを呼び出す方法は他にもあります。

于 2014-01-24T11:59:52.093 に答える