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

发布于 2024-10-20 12:18:04 字数 237 浏览 1 评论 0 原文

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

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

此外,管理这些信息的方式似乎从一个版本的操作系统到另一个版本也发生了变化。

是否有任何库可以与 Java 一起使用来实现此目的?

谢谢。

I would like to get the list of "Open with..." contextual menu in Windows XP/Vista/7 from Java.

From the Windows Registry, I've managed to find a way to get the command to launch applications. But I did not find out how to get these applications names and icons as shown in the Explorer Open with list contextual menu.

Also, the way to manage these informations seems to change from one version of the OS to another.

Is there any library I could use with Java for this ?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

勿挽旧人 2024-10-27 12:18:04

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

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

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

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

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

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

You don't need the registry for this. You need to use GetProcAddress on OpenAs_RunDLLA in Shell32.dll. I can't find any documentation for it, but I have Delphi code that defines it as

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

The HWND, HInstance, and CmdShow should be fairly familiar. PChar in Delphi corresponds (ANSI version - see below) to a pointer to a null terminated (C-style) string, and in the Unicode version to a null terminated WSTR. procedure in Delphi corresponds to C's void someproc();. The CmdLine should point to a fully-qualified filename, so Windows knows what to offer in the "Open With" dialog.

I'm not sure how you would use GetProcAddress (and the preceeding LoadLibrary call) in Java, but this may get you started.

Note that the function being loaded is the ANSI version; for WideChar (Unicode), you'd want to load the OpenAs_RunDLLW version instead, and adjust the CmdLine parameter accordingly (I think - I haven't tried the code on the wide version).

NOTE: This may help too. It's a MSDN article on using OpenAs_RunDLL via the API's ShellExecute function.

强辩 2024-10-27 12:18:04

正如上面评论中提到的,在 Windows 中调用“打开方式”对话框的 Java 代码将是(省略异常处理):

CommandLine cmd = new CommandLine("rundll32.exe");
cmd.addArgument("shell32.dll,OpenAs_RunDLL");
cmd.addArgument(fullPathToMyFile.toString());
Process process = CommandLauncherFactory.createVMLauncher().exec(cmd, null);

This uses the Apache Commons Exec library; there are other ways of invoking a process from Java too.

As alluded to in the comment above, Java code to invoke the Open With dialog in Windows would be (exception handling omitted):

CommandLine cmd = new CommandLine("rundll32.exe");
cmd.addArgument("shell32.dll,OpenAs_RunDLL");
cmd.addArgument(fullPathToMyFile.toString());
Process process = CommandLauncherFactory.createVMLauncher().exec(cmd, null);


This uses the Apache Commons Exec library; there are other ways of invoking a process from Java too.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文