我正在通过shell命令执行hh.exe从Lua中打开.chm帮助文件;用户单击Lua应用程序中的多个“帮助”按钮之一,并转到“帮助”文件中的某个主题,具体取决于所使用的“帮助”按钮的上下文。
local HelpFile = strDir.."\\"..strName.." "..strVersion..".chm"
--strDir ,strName, strVersion all identify the help file to be used
local topicpath = "options" --an example; will differ according to application context
local helpexecutable = "C:\\windows\\hh.exe"
local helpparms = "::/"..string.lower(string.gsub(topicpath..".htm", "")
local bOK, intErrorCode, strErrortext =
fhShellExecute(helpexecutable, HelpFile..helpparms)
-- open the help file at a specified location
此代码可以很好地打开我想要的主题的帮助文件。
注意fhShellExecute是程序主机特定的API,等效于os.execute
参数:
strFileName:字符串:文件的完整路径。记住斜线Lua中的文件必须加倍(例如“ C:\ MyDocuments \ My Program.exe”)。
strParams:字符串:参数。如果strFileName是可执行文件,strParams保存要传递给它的参数。应该为空,或者如果strFileName是文档文件,则不提供。
strDirectory:字符串:指定操作的默认(工作)目录。如果不提供,将使用当前工作目录。
strOperation:字符串:指定要执行的操作。可用动作集取决于特定的文件或文件夹。一般来说,动作从对象的快捷菜单中可用的是可用操作。
iShowCmd:整数:指定在打开应用程序时如何显示。如果未提供,则该值默认为1。定义以下值:
0隐藏窗口并激活另一个窗口
1激活并显示一个窗口。如果窗口最小化或Windows将其最大化,将其还原到原始大小和位置。一个应用程序在显示窗口时应指定此标志第一次。
2激活窗口并将其显示为最小化窗口。
3激活窗口并将其显示为最大化窗口。
4显示窗口的最新大小和位置。主动窗口保持活动状态。
5激活窗口并以其当前大小和位置显示它。
6最小化指定的窗口并激活下一个顶层Z顺序的窗口。
7将窗口显示为最小化窗口。活动窗口保留活性。
8以当前状态显示窗口。活动窗口保留活性。
9激活并显示窗口。如果窗口最小化或Windows将其最大化,将其还原到原始大小和位置。一个恢复最小化窗口时,应用程序应指定此标志。
因为我正在使用hh.exe,所以每当用户单击“帮助”按钮时,都会出现一个新的“帮助”实例,这不是我(或用户)想要的。无法打开“帮助”窗口来阻止应用程序的操作。
适应此处显示的方法How to have only one instance of the CHM file opened?(测试帮助文件是否可重命名-如果不能重命名,则说明它正在使用中)我可以防止打开第二个“帮助”窗口。但是,我看不到任何指示打开的“帮助”窗口导航到新上下文主题的方法。
我只能访问非常有限的Lua库集,因此我需要一个可以通过shell命令执行的解决方案。我的想法是:
但是我不知道该怎么做。
目前,我尚未在装有Windows10 1903版的计算机上安装LUA开发环境。因此,我将以PowerShell示例为例来描述答案,并提供一些LUA提示。转换应该没有问题。
正如我之前所提到的,KeyHH.exe是增强HTML帮助的程序。它可以作为HH.EXE的补充或完全替代。 KeyHH提供了HH.EXE的所有功能,提供了HTML帮助中一些已知错误的解决方案,并且还提供了其他功能。
但是,请注意,这确实是很久以前(大约12年),也许您需要在这里警告您今天的Windows操作系统。但是我很惊讶它能在我的机器上工作。
旧网站keyworks.net不再可用。作为退休的Microsoft帮助MVP,我们几年前已将内容复制到http://keyworks.helpmvp.com。
因此,请尝试一下。我建议先执行以下步骤,然后再将其适应您在LUA中的需求。如我所见,没有经验
D:/_working
C:/Windows
中(具有管理员权限)D:/_working
。要打开此CHM文件,请右键单击保存的文件,单击“属性”,然后单击“取消阻止”。这仅用于测试用例(请参见下文)。使用PowerShell执行以下hh.exe命令:
hh.exe D:/_working/CHM-example.chm
hh.exe D:/_working/CHM-example.chm::/Garden/flowers.htm
hh.exe D:/_working/CHM-example.chm::/Garden/tree.htm
hh.exe -mapid 10010 D:/_working/CHM-example.chm
您知道这会产生四个帮助窗口:
您可以使用KeyHH创建独立的HTML帮助窗口。该窗口保持打开状态,直到用户关闭它。创建此窗口后,就可以像在WinHelp中一样在不创建新窗口的情况下在窗口中打开新主题。您可以从HTML帮助窗口,程序或WinHelp文件使用此功能。
您通过指定破折号(-),后跟标识名和CHM文件的名称来创建唯一的KeyHH窗口。然后,KeyHH将检查是否已打开使用此标识名的HTML帮助窗口。如果是这样,HTML帮助窗口将仅使用新的CHM文件或主题进行更新。如果尚未打开,KeyHH将创建一个新的HTML帮助窗口。
您可以使用所需的任何标识符,只要第一个字符不以井号(#)字符开头。
从上面的示例中,要在flowers.htm
文件中打开名为CHM-example.chm
的主题,您可以使用以下命令:
KeyHH.exe -MyID D:/_working/CHM-example.chm::/Garden/flowers.htm
假设您然后想打开另一个名为tree.htm
的主题,然后使用此命令:
KeyHH.exe -MyID D:/_working/CHM-example.chm::/Garden/tree.htm
或mapid的另一个主题
KeyHH.exe -MyID -#mapid 10010 D:/_working/CHM-example.chm
所有这些命令仅导致一个帮助窗口:
[请注意,有警告使用KeyHH时,请勿在文件名中使用连字符(例如,new-topic.htm)。。您可能需要重命名文件。
我认为您只需要调整几行代码:
local KeyHHParam = " -MyID "
local HelpFile = strDir.."\\"..strName.." "..strVersion..".chm"
local topicpath = "options"
local helpexecutable = "C:\\windows\\KeyHH.exe"
local helpparms = "::/"..string.lower(string.gsub(topicpath..".htm", "")
local bOK, intErrorCode, strErrortext =
fhShellExecute(helpexecutable, KeyHHParam..HelpFile..helpparms)