我想从Java获取Windows XP / Vista / 7中的“Open with ...”上下文菜单列表。
从Windows注册表中,我设法找到了启动应用程序命令的方法。但我没有找到如何获取这些应用程序名称和图标,如资源管理器打开列表上下文菜单中所示。
此外,管理这些信息的方式似乎从一个版本的操作系统变为另一个版本。
是否有可以使用Java的库?
感谢。
答案 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调用进程。