当我从 Windows 窗体应用程序打开帮助文件时,我正在使用此代码。
public static void ShowHelp(string constant)
{
Help.ShowHelp(dummyFormForHelp.Value, CHMFile, HelpNavigator.Topic, constant);
}
除非我单击帮助文件中的“GO”>“URL...”或“打印”按钮,否则它工作正常。 [
我没有收到任何消息,应用程序和 chm 文件根本没有响应。我需要转到任务管理器并终止该进程。我不知道那是什么。
我尝试使用来自简单 Windows 窗体应用程序的相同代码打开相同的文件,只有一个窗体,一切都很完美。所以我认为我的申请有问题。
什么会导致这样的问题? 这是一个拥有很多屏幕的大型企业应用程序。
打开CHM的代码片段似乎不太干净(???
dummyFormForHelp.Value
,constant
)。 Help.ShowHelp()
就像旧式 HTMLHelp API 调用的包装器(另请参阅:HTMLHelp API - VBA、VB6 和 VB2003)。参数有点固执。
第二个想法 - 请阅读 HTMLHelp API - HH_CLOSE ALL Note 并交叉检查您的代码。由于 HH API 中存在错误,请确保在主表单的 Query_Unload 事件中调用此函数,而不是 OnClose。
请使用正确的参数调用
Help.ShowHelp()
函数,如下所示。
Help.ShowHelp(this, CHMFile, HelpNavigator.Topic, "foobar.htm");
从我上面的示例应用程序屏幕截图来看,以下所有代码都适用于我。请根据您的需求尝试一下。打开 URL 在这里很特殊,而不是屏幕截图中显示的 URL(URL ...)。
#region mnuHelp ---------------------------------------------
private void mnuHelpContents_Click(object sender, EventArgs e)
{
//--- Show contents of help file.
Help.ShowHelp(this, helpProviderMain.HelpNamespace);
}
private void mnuHelpIndex_Click(object sender, EventArgs e)
{
//--- Show index of help file.
Help.ShowHelpIndex(this, helpProviderMain.HelpNamespace);
}
private void mnuHelpSearch_Click(object sender, EventArgs e)
{
//--- Show search tab of help file.
Help.ShowHelp(this, helpProviderMain.HelpNamespace, HelpNavigator.Find);
}
private void mnuHelpTest_Click(object sender, EventArgs e)
{
//--- Show a web site with help content.
Help.ShowHelp(this, "http://www.stackoverflow.com");
}
private void mnuHelpOpenTopicByName_Click(object sender, EventArgs e)
{
//--- Open topic by name.
Help.ShowHelp(this, helpProviderMain.HelpNamespace, HelpNavigator.Topic, "Garden/tree.htm");
}
private void mnuHelpOpenTopicById_Click(object sender, EventArgs e)
{
//--- Open topic by ID.
Help.ShowHelp(this, helpProviderMain.HelpNamespace, HelpNavigator.TopicId, "20010");
}
#endregion -----------------------------------------------
编辑:
下载并运行我们的MJ's Diagnostics工具。
MJ 的诊断是一个小型实用程序,可报告所有 HTML 帮助运行时和 Workshop(编译器)DLL 是否已安装并注册到正确的位置。如果您的编译器崩溃,并且在打开 CHM 或从 CHM 搜索选项卡进行搜索时崩溃,那么此实用程序将帮助解决 rouge DLL 问题。
首先问题描述得不太清楚:
dummyFormForHelp.Value
这里什么也没说,它只是表单的延迟初始化实例,以防止帮助窗口位于最顶层并允许在应用程序和帮助之间切换dummyFormForHelp.Value
的意思是:
private static readonly Lazy<Form> dummyFormForHelp = new Lazy<Form>(() =>
{
var form = new Form();
form.CreateControl();
return form;
});
返回 WinForms<>CHM 帮助的原始问题:
研究表明您的应用程序冻结和打开 chm 的问题并不是唯一的:
解决方案
解决问题的方法:
以不同的流程启动帮助:
hh 添加到 windows 路径中,这样就可以轻松执行此类命令:
hh "help.chm::/topic.html"
hh "help.chm::/topic.html#subtopic"
hh -mapid 12345 help.chm
解决方法的缺点:每次从应用程序调用帮助都会打开新的帮助实例。
编辑:2017年8月28日
对于未来的读者:
hh
的调用现在帮助按预期工作。
这是 Windows 10 的一个错误,已在 Windows 10 v1607/build 14393 中修复。
它至少存在于 Windows 10、v1507/build 10240 和 v1511/build 10586 中。 (我为此主题创建了一个连接问题,但不幸的是,该网站无法再访问。)