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

冷暖自知 提交于 2021-01-28 06:46:54

问题


I want to set up only one instance of the CHM file when clicking on "Help" in the menubar and stopping it from opening twice when clicked again - therefore how do I code it?

I've tried to use it with process.isAlive(), but after I close it I want a counter set to zero, which only opens another CHM file when the counter is 0.

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

So MouseEvent is fired once.

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

I expected the counter to be 0, but then came to the conclusion that MouseEvent already fired once and the code got already executed, therefore it never goes to the second if-statement and sets my counter to 0.

EDIT

There is no correct answer how to open a CHM file once, but there is a workaround that makes it possible, we just need to look if the file is renamable or not.

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 () {
        }
    }


回答1:


I'm not a Java programmer but the short story - not possible (AFAIK).

You know, hh.exe is the HTMLHelp executable and associated with *.CHM files. It's just a shell that uses the HTML Help API and is really just hosting a browser window.

HH.EXE is not single instance, if you open a CHM or another file three times using HH.EXE, then three help windows will appear. Try it using PowerShell:

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

Several client-side command line switches are available to help authors that are part of the HTML Help executable program (hh.exe) and therefore work when HTML Help Workshop is not set up.

KeyHH.exe was running years ago with special parameters.

If you call the HH API directly from your application, and not via a second helper program like HH.EXE or KEYHH.EXE, then you MUST close any open help windows before shutting down the application or you will probably crash Windows.

For some information related to the problem you maybe interested in Open CHM File Once.

Some quoted info from the link above:

When you do that you are just calling the help viewer again and again from the command line, you're not using the HTML Help API which is what you need to access the CHM once it is open. You need to check whether your flavors of Java and Smalltalk support calls to the HTML Help API. This API is documented in detail in the help file of Microsoft HTML Help Workshop, which is the compiler package you installed to be able to generate CHMs.



来源:https://stackoverflow.com/questions/57254614/how-to-have-only-one-instance-of-the-chm-file-opened

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!