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

问题描述 投票:0回答:3

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

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

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

我没有收到任何消息,应用程序和 chm 文件根本没有响应。我需要转到任务管理器并终止该进程。我不知道那是什么。

我尝试使用来自简单 Windows 窗体应用程序的相同代码打开相同的文件,只有一个窗体,一切都很完美。所以我认为我的申请有问题。

什么会导致这样的问题? 这是一个拥有很多屏幕的大型企业应用程序。

c# winforms chm
3个回答
3
投票

打开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 问题。


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<>CHM 帮助的原始问题:

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

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

解决方案

解决问题的方法:

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

以不同的流程启动帮助

hh 添加到 windows 路径中,这样就可以轻松执行此类命令:

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

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

hh -mapid 12345 help.chm

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

编辑:2017年8月28日

对于未来的读者:

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

现在帮助按预期工作。


1
投票

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

它至少存在于 Windows 10、v1507/build 10240 和 v1511/build 10586 中。 (我为此主题创建了一个连接问题,但不幸的是,该网站无法再访问。)

© www.soinside.com 2019 - 2024. All rights reserved.