2

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

从 Windows 注册表中,我设法找到了一种方法来获取启动应用程序的命令。但是我没有找到如何获取这些应用程序名称和图标,如 Explorer Open with list 上下文菜单中所示。

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

有没有我可以与 Java 一起使用的库?

谢谢。

4

2 回答 2

2

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

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

HWND、HInstance 和 CmdShow 应该相当熟悉。Delphi 中的 PChar(ANSI 版本 - 见下文)对应于指向空终止(C 样式)字符串的指针,而在 Unicode 版本中对应于空终止 WSTR。procedure在 Delphi 中对应于 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 中调用 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 调用进程。

于 2014-01-24T11:59:52.093 回答