开发者

Java accessing Window's "Open with..." list

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 ?

Th开发者_高级运维anks.


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.


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜