如何只打开 CHM 文件的一个实例?

How to have only one instance of the CHM file opened?

我只想在单击菜单栏中的 "Help" 时设置一个 CHM 文件实例,并在再次单击时阻止它打开两次 - 那么我该如何编码呢?​​

我曾尝试将它与 process.isAlive() 一起使用,但在我关闭它之后我希望将计数器设置为零,这只会在计数器为 0 时打开另一个 CHM 文件。

helpMenu.addMouseListener(new MouseAdapter() {
// do this after clicked
openCHM();
});

所以 MouseEvent 被触发了一次。

openCHM() {
Process p;
if(cnt == 0) {
   p = Runtime.getRuntime().exec("hh.exe Help.chm");
   cnt++;
   if(!p.isAlive()) {
      cnt = 0;
   }
}

我预计计数器为 0,但后来得出的结论是 MouseEvent 已经触发一次并且代码已经执行,因此它永远不会进入第二个 if 语句并将我的计数器设置为 0。

编辑

对于如何一次打开 CHM 文件没有正确的答案,但有一个解决方法可以实现,我们只需要查看文件是否可重命名。

protected void openCHM() {
        try {
            File file = new File("YOURNAME.chm");
            boolean renamable = file.renameTo(file); // can't rename if file is already open, returns true if renaming is possible
            if(renamable) {
                Runtime.getRuntime().exec("hh.exe YOURNAME.chm");
            } else if(!file.exists() ){
                // message: file doesn't exist (in path)
            } else {
                // file is already open
            }
        } catch () {
        }
    }

我不是 Java 程序员,但短篇小说 - 不可能 (AFAIK)。

您知道,hh.exe 是 HTMLHelp 可执行文件并与 *.CHM 文件关联。它只是一个使用 HTML 帮助 API 的 shell,实际上只是托管一个浏览器 window。

HH.EXE不是单例,如果用HH.EXE打开一个CHM或其他文件3次,会出现3个帮助windows。使用 PowerShell 试试:

PS D:\_working> hh.exe C:\Windows\Help\htmlhelp.chm

几个客户端命令行开关可用于帮助作者,它们是 HTML 帮助可执行程序 (hh.exe) 的一部分,因此在 HTML Help Workshop 不是时工作设置。

KeyHH.exe 是 运行 年前的特殊参数。

如果您直接从您的应用程序调用 HH API,而不是通过 HH.EXE 或 KEYHH.EXE 等辅助程序,那么您必须关闭任何打开的帮助 windows 在关闭应用程序之前,否则你可能会崩溃 Windows.

有关您可能感兴趣的问题的一些信息 Open CHM File Once.

上面 link 中的一些 引用信息

当您这样做时,您只是从命令行一次又一次地调用帮助查看器,而不是使用 HTML 帮助 API打开后需要访问 CHM。您需要检查您的 Java 风格和 Smalltalk 是否支持调用 HTML 帮助 API。这个API在微软HTMLHelp Workshop的帮助文件中有详细的记载,就是你安装的能够生成CHM的编译包。