Java访问窗口';s";“以…开头”;列表

Java访问窗口';s";“以…开头”;列表,java,windows,registry,explorer,open-with,Java,Windows,Registry,Explorer,Open With,我想从Java中获取Windows XP/Vista/7中“打开时使用…”上下文菜单的列表 从Windows注册表中,我设法找到了一种方法来获取启动应用程序的命令。但我没有找到如何获得这些应用程序的名称和图标,如“资源管理器打开列表”上下文菜单中所示 此外,管理这些信息的方式似乎在从一个版本的操作系统改变到另一个版本 是否有任何库可以与Java一起用于此目的 谢谢。您不需要注册。您需要在Shell32.dll中的OpenAs\u rundla上使用GetProcAddress。我找不到任何关于它

我想从Java中获取Windows XP/Vista/7中“打开时使用…”上下文菜单的列表

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

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

是否有任何库可以与Java一起用于此目的


谢谢。

您不需要注册。您需要在Shell32.dll中的
OpenAs\u rundla
上使用GetProcAddress。我找不到任何关于它的文档,但我有Delphi代码将它定义为

SHOpenWithProc = procedure(HWND: THandle; HInstance; THandle; 
                           CmdLine: PChar; CmdShow: Integer);
HWND、HInstance和CmdShow应该相当熟悉。Delphi中的PChar(ANSI版本-见下文)对应于指向以null结尾的(C样式)字符串的指针,Unicode版本对应于以null结尾的WSTRprocedure对应于C的
void someproc()
CmdLine
应指向完全限定的文件名,以便Windows知道在“打开方式”对话框中提供什么

我不确定您将如何在Java中使用
GetProcAddress
(以及前面的
LoadLibrary
调用),但这可能会让您开始学习

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


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

正如上面的评论中所提到的,在Windows中调用OpenWith对话框的Java代码是(省略异常处理):
CommandLine cmd=new命令行(“rundll32.exe”);
cmd.addArgument(“shell32.dll,OpenAs_RunDLL”);
cmd.addArgument(fullPathToMyFile.toString());
Process Process=CommandLauncherFactory.createVMLauncher().exec(cmd,null);

这使用ApacheCommonsExec库;还有其他从Java调用进程的方法。

谢谢您的建议。我已经通过使用命令行
rundll32.exe shell32.dll,OpenAs\u RunDLL C:\path\to\file.ext
实现了这一点。不知何故,我宁愿导出应用程序的图标、名称和路径/命令列表,以便将它们集成到我的应用程序界面中。已经有一个解决此问题的线程,请查看:
CommandLine cmd = new CommandLine("rundll32.exe");
cmd.addArgument("shell32.dll,OpenAs_RunDLL");
cmd.addArgument(fullPathToMyFile.toString());
Process process = CommandLauncherFactory.createVMLauncher().exec(cmd, null);