Java访问Window的“打开方式...”列表

时间:2011-03-04 18:38:52

标签: java windows registry explorer open-with

我想从Java获取Windows XP / Vista / 7中的“Open with ...”上下文菜单列表。

从Windows注册表中,我设法找到了启动应用程序命令的方法。但我没有找到如何获取这些应用程序名称和图标,如资源管理器打开列表上下文菜单中所示。

此外,管理这些信息的方式似乎从一个版本的操作系统变为另一个版本。

是否有可以使用Java的库?

感谢。

2 个答案:

答案 0 :(得分:2)

您不需要注册表。您需要在Shell32.dll中的OpenAs_RunDLLA上使用GetProcAddress。我找不到任何文档,但我有Delphi代码将其定义为

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

HWND,HInstance和CmdShow应该相当熟悉。 Delphi中的PChar对应于(ANSI版本 - 见下文)指向空终止(C样式)字符串的指针,并且在Unicode版本中对应于空终止的WSTR。 Delphi中的procedure对应于C void someproc();CmdLine应指向完全限定的文件名,因此Windows知道在“打开方式”对话框中提供的内容。

我不确定如何在Java中使用GetProcAddress(以及之前的LoadLibrary调用),但这可能会让您入门。

请注意,正在加载的函数是ANSI版本;对于WideChar(Unicode),您需要加载OpenAs_RunDLLW版本,并相应地调整CmdLine参数(我想 - 我还没有尝试过宽版本的代码)。

注意:这也可能有所帮助。这是一篇关于通过API的ShellExecute函数使用OpenAs_RunDLL的MSDN文章。

答案 1 :(得分:1)

如上面的评论中所提到的,在Windows中调用Open With对话框的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调用进程。