Java 在现有实例中打开文档

Java 在现有实例中打开文档,java,windows,exec,Java,Windows,Exec,如何在非默认应用程序中以编程方式打开文档,而不启动该应用程序的新实例(如果已经运行了实例) 上下文:我想使用Paint Shop Pro(或类似工具)以编程方式启动图像,但默认应用程序是“Windows照片查看器”,我不会更改它。当我启动多个这样的映像时,它们应该都在同一个实例中打开 徒劳的尝试,为每个图像打开新的PSP实例: Runtime.getRuntime().exec(new String[]{"<path_to_psp.exe>", pathToImage.toStrin

如何在非默认应用程序中以编程方式打开文档,而不启动该应用程序的新实例(如果已经运行了实例)

上下文:我想使用Paint Shop Pro(或类似工具)以编程方式启动图像,但默认应用程序是“Windows照片查看器”,我不会更改它。当我启动多个这样的映像时,它们应该都在同一个实例中打开

徒劳的尝试,为每个图像打开新的PSP实例:

Runtime.getRuntime().exec(new String[]{"<path_to_psp.exe>", pathToImage.toString()});
Runtime.getRuntime().exec(新字符串[]{',pathToImage.toString()});
  • Windows 10不需要便携
  • 这个程序对我来说只是实验性的,不需要考虑其他的计算机或设置。
  • 我精通
    JNA
    ,只是不懂MSDN的东西

应用程序可以通过多种方式指定如何打开在注册表中注册的文件类型:

  • 命令行上的路径
  • DDE(动态数据交换,一种使用消息在应用程序之间进行通信的老方法)
  • 授权执行
Paint Shop Pro(至少旧版本)使用DDE,这需要大量的工作来实现。最好的解决方案是让Windows为您调用处理程序

一个选项是查看应用程序是否显示在中,如果显示,则调用其
IAssocHandler::Invoke


如果您对应用程序稍有了解(就像在本例中所做的那样),您可以使用旧方法强制执行ProgId,方法是调用
ShellExecuteEx
,将
fMask
设置为
SEE_MASK\u CLASSNAME;SEE_MASK\u FLAG\u DDEWAIT
和“PSP7.Image”(或您关心的任何版本)。只要指定的ProgId键在其shell子键中有一个工作谓词,此操作就可以工作。

您是否尝试将多个图像路径作为参数传递给psp?这对我以后想在同一时刻打开另一个图像没有帮助据我所知,唯一可以控制此操作的实体是psp本身,并且只能控制(如果有的话),在psp设置中。那么,如果我将其设置为默认程序,您如何解释Windows能够在同一个psp实例中打开图像?当我在Windows中设置为默认程序时,连续打开多个文件,并使用Process Explorer检查命令行,这一切都只是
psp.exe/dde
而已!我怀疑这类似于在html中发布消息,比如,有数据通过另一个渠道发送。这意味着什么?我如何在Java中实现“dde”?