Java обращается к списку Windows "Открыть с помощью ..." - PullRequest
2 голосов
/ 04 марта 2011

Я хотел бы получить список контекстного меню «Открыть с помощью ...» в Windows XP / Vista / 7 из Java.

Из реестра Windows мне удалось найти способ получить команду для запуска приложений. Но я не узнал, как получить имена и значки этих приложений, как показано в контекстном меню «Открыть в проводнике со списком».

Кроме того, способ управления этой информацией, похоже, меняется с одной версии ОС на другую.

Есть ли какая-нибудь библиотека, которую я мог бы использовать с Java для этого?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 04 марта 2011

Вам не нужен реестр для этого. Вам нужно использовать GetProcAddress на OpenAs_RunDLLA в Shell32.dll. Я не могу найти какую-либо документацию для этого, но у меня есть код Delphi, который определяет его как

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

HWND, HInstance и CmdShow должны быть достаточно знакомы. PChar в Delphi соответствует (версия ANSI - см. Ниже) указателю на строку с нулевым символом в конце (в стиле C), а в версии Unicode - на WSTR с нулевым символом в конце. procedure в Delphi соответствует C's void someproc();. CmdLine должен указывать на полное имя файла, поэтому Windows знает, что предложить в диалоговом окне «Открыть с помощью».

Я не уверен, как бы вы использовали GetProcAddress (и предыдущий LoadLibrary вызов) в Java, но это может помочь вам начать.

Обратите внимание, что загружаемая функция является версией ANSI; для WideChar (Unicode) вместо этого вы захотите загрузить версию OpenAs_RunDLLW и соответствующим образом настроить параметр CmdLine (я думаю - я не пробовал код в широкой версии).

ПРИМЕЧАНИЕ: это тоже может помочь. Это статья MSDN об использовании OpenAs_RunDLL через функцию API ShellExecute.

1 голос
/ 24 января 2014

Как упоминалось в приведенном выше комментарии, Java-код для вызова диалога «Открыть с помощью» в Windows будет (обработка исключений пропущена):

<code>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.
...