我想从 Java 获取 Windows XP/Vista/7 中的“打开方式...”上下文菜单列表。
从 Windows 注册表中,我设法找到了一种方法来获取启动应用程序的命令。但是我没有找到如何获取这些应用程序名称和图标,如 Explorer Open with list 上下文菜单中所示。
此外,管理这些信息的方式似乎从一个版本的操作系统更改为另一个版本。
有没有我可以与 Java 一起使用的库?
谢谢。
您不需要注册表。您需要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 文章。
正如上面评论中提到的,在 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 调用进程。