单击“Url”或“打印”按钮时,Chm文件冻结应用程序

时间:2017-08-10 12:45:53

标签: c# winforms chm

当我从Windows窗体应用程序打开帮助文件时,我使用此代码。

    public static void ShowHelp(string constant)
    {
        Help.ShowHelp(dummyFormForHelp.Value, CHMFile, HelpNavigator.Topic, constant);
    }

除非我点击帮助文件中的GO> URL ...或打印按钮,否则它工作正常。 [1]

我没有收到任何消息,app和chm文件根本没有响应。我需要去任务管理器并终止这个过程。我不知道它是什么。

我尝试使用简单的Windows窗体应用程序中的相同代码打开同一个文件,只有一个窗体,一切都很完美。所以我觉得我的申请有些不对劲。

导致此类问题的原因是什么? 它是一个拥有大量屏幕的大型企业应用程序。

3 个答案:

答案 0 :(得分:2)

打开CHM的代码段似乎不干净(??? dummyFormForHelp.Valueconstant)。 Help.ShowHelp()就像是旧的HTMLHelp API调用的包装器(另请参阅:HTMLHelp API - VBA, VB6 und VB2003)。参数有点顽固。

第二个想法 - 请阅读HTMLHelp API - HH_CLOSE ALL Note并交叉检查您的代码。由于HH API中存在错误,请确保在主窗体的Query_Unload事件中调用此函数而不是OnClose。

请使用正确的参数调用Help.ShowHelp()函数,如下所示。

Help.ShowHelp(this, CHMFile, HelpNavigator.Topic, "foobar.htm");

enter image description here

从上面的示例应用截图中,以下所有代码都适用于我。请尝试满足您的需求。打开的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搜索选项卡搜索时崩溃,则此实用程序将帮助解决胭脂DLL问题。

答案 1 :(得分:2)

首先提出的问题并不十分清楚:

  • 应该提到chm文件是由NuHelp生成的(这是临时解决方案,但我们都知道临时总是永久性的,是吗?))
  • dummyFormForHelp.Value在这里什么都没说,它只是懒惰的初始化形式实例,以防止帮助窗口的最高位置并允许在应用程序和帮助之间切换

dummyFormForHelp.Value表示:

private static readonly Lazy<Form> dummyFormForHelp = new Lazy<Form>(() =>
{
    var form = new Form();
    form.CreateControl();
    return form;
});

使用WinForms&lt;&gt; CHM帮助返回原始问题:

    只有在应用程序打开帮助时才会出现
  • 问题,如果直接打开帮助 - 完全没有问题
  • 导航到URL,打印或在“搜索”选项卡中键入任何世界
  • 时,无限循环被捕获100%

研究表明,冻结应用程序和打开的chm的问题不是唯一的:

<强>解决方案

解决问题的方法:

  • 试用NuHelp
  • 的最新版本
  • 尝试不同的转换器并检查它是否可以提供帮助
  • 请勿使用任何转换器并自行生成帮助文件
  • 以不同的流程启动帮助

以不同的流程启动帮助

hh被添加到Windows路径中,因此可以轻松执行这些命令:

hh "help.chm::/topic.html"

hh "help.chm::/topic.html#subtopic"

hh -mapid 12345 help.chm

变通方法的缺点:每次应用程序的帮助调用都会打开新的帮助实例。

编辑:28/08/2017

对于未来的读者:

  • 通过不同的常用转换器重新编译没有帮助
  • 使用“帮助与手册”
  • 重新创建了帮助
  • 返回了索引并且关键字配置正确,已返回搜索
  • 使用了hh,正在使用

现在帮助按预期工作。

答案 2 :(得分:0)

这是Windows 10的一个错误,已在Windows 10,v1607 / build 14393中得到修复。

至少在Windows 10,v1507 / build 10240和v1511 / build 10586中存在。 (我为此主题创建了Connect issue,但不幸的是,该网站不再可访问。)