【问题标题】:Open document in existing instance在现有实例中打开文档
【发布时间】:2017-07-02 16:46:10
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您是否尝试过将多个图像路径作为参数传递给 psp?
  • 当我以后想在同一个实例中打开另一个图像时,这无济于事
  • 据我所知,唯一可以控制这个的实体是 psp 本身,并且只能在 psp 设置中进行控制(如果有的话)。
  • 那你怎么解释Windows可以在同一个PSP实例中打开图片,如果我把它设置为默认程序呢?
  • 当我在windows中将其设为默认值时,连续打开多个文件,并使用进程资源管理器检查命令行,都只是psp.exe /dde,仅此而已!我怀疑这类似于 html 中的 POST 消息,例如,有数据通过另一个渠道发送。这是什么意思,我怎样才能在 Java 中做 'dde'?

标签: java windows exec


【解决方案1】:

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

  • 命令行上的路径
  • DDE(动态数据交换,一种使用消息在应用程序之间进行通信的旧方式)
  • DropTarget
  • 委托执行

Paint Shop Pro(至少是旧版本)使用 DDE,而要实现自己的工作量很大。最好的解决方案是让 Windows 为您调用处理程序。

一种选择是查看应用程序是否显示在SHAssocEnumHandlers 中,如果出现,则调用其IAssocHandler::Invoke

如果您对应用程序有一点了解(就像您在本例中所做的那样),您可以通过调用 ShellExecuteEx 并将 fMask 设置为 SEE_MASK_CLASSNAME|SEE_MASK_FLAG_DDEWAITlpClass set to 来使用强制 ProgId 的旧方法。图像”(或您关心的任何版本)。只要指定的 ProgId 键在其 shell 子键中有一个工作动词,它就可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 2020-08-10
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    相关资源
    最近更新 更多