C# Microsoft HTML帮助-从主题ID获取主题页URL

C# Microsoft HTML帮助-从主题ID获取主题页URL,c#,c++,.net,chm,html-help,C#,C++,.net,Chm,Html Help,我们目前正在使用HTML帮助在我们的软件中显示CHM帮助文件。但是,我们希望更改打开帮助的方式,在我们自己的自定义窗口中使用嵌入式浏览器打开帮助 通过直接请求使用URL打开主题页面来实现这一点是非常简单的,但是,我们希望保持主题ID的使用,这样编辑团队就可以自由地重新构造并重新命名他们认为合适的帮助,只需操纵映射和别名 我已经四处搜索了一段时间,但找不到任何(合理便宜的)方法从主题ID获取要打开的URL,这样我就可以请求在自定义窗口中打开的URL。我是否错过了一个技巧,或者是否有任何库可以帮助实

我们目前正在使用HTML帮助在我们的软件中显示CHM帮助文件。但是,我们希望更改打开帮助的方式,在我们自己的自定义窗口中使用嵌入式浏览器打开帮助

通过直接请求使用URL打开主题页面来实现这一点是非常简单的,但是,我们希望保持主题ID的使用,这样编辑团队就可以自由地重新构造并重新命名他们认为合适的帮助,只需操纵映射和别名


我已经四处搜索了一段时间,但找不到任何(合理便宜的)方法从主题ID获取要打开的URL,这样我就可以请求在自定义窗口中打开的URL。我是否错过了一个技巧,或者是否有任何库可以帮助实现这一点?

AFAIK在使用web浏览器控件时,您需要一个主题文件名为“Garden/Garden.htm”的有效URL。因此,其他解决方案非常困难,我认为使用web浏览器控件是不可能的

您知道您可以使用以下代码进行硬编码呼叫:

    public static string GetChmUrl(string fileName, string page)
{
  StringBuilder url = new StringBuilder();
  url.AppendFormat("mk:@MSITStore:{0}::", fileName);
  if (page.IndexOf('/') != 0) url.Append('/');
  url.Append(page);
  return url.ToString();
}

要通过TopicId显示HTMLHelp主题而不显示完整的帮助窗口,您可以为HTMLHelp查看器窗口创建特殊的窗口类型。好的–这更多的是帮助编写工作准备来自应用程序的调用。可以通过特殊方式编译CHM,并将其缩减到通常位于HTMLHelp查看器右侧的内容窗格中

您可以通过TopicId调用内容,结果显示在快照中:

    private void btnTopicId_Click(object sender, EventArgs e)
{
    Help.ShowHelp(this.btnOpenHelpShowTopic, helpProvider1.HelpNamespace, HelpNavigator.TopicId, @"10000");
}

许多年前,有一个所谓的“嵌入式帮助”应用程序,您可以在快照中看到。这是通过HtmlHelpAPI调用完成的。我有旧的Delphi代码,但没有翻译成.net。HTMLHelp已经使用了近20年,如今,web帮助的使用越来越多。所以你必须考虑和决定

您需要使用编组从Visual C应用程序调用非托管HTML帮助API。在.net中使用HTMLHELPAPI并不容易。要尝试一下,您可以从以下下载示例(在本文末尾)开始:

我还附上了一张快照:


Hth.< /P>为什么这是C++的标记?我们的代码库在托管/非托管C++和C语言之间进行了分割,我们可以在其中的任一个使用一个库。languages@Zepee-您当然知道,您将失去HTMLHelp Viewer的所有功能,包括目录、索引、,搜索?是的:)这或多或少是为了在我们自己的LightWPF窗口中打开某些帮助页面,我们不希望显示完整的帮助。目前,我们可以通过硬编码的URL来使用它,但我们希望通过主题ids来使用它。您可以看看免费的Pascal“chmls”命令,特别是它的extractalias命令。chmls是一个辅助工具,用于检查用于构造CHM库和编译器的CHM结构。也许你可以移植选定的代码。谢谢回复。这些似乎是我在自己的调查中得出的结论。您可以使用windows HTMLHelp窗口(可以在一定程度上进行自定义),在该窗口中可以按ID打开主题,也可以使用自己的HTLM窗口并按URL打开主题。据我所知,手动读取chm映射并从主题ID推断URL是不容易的。解码ALink映射似乎是可能的,一些自定义库会对它们进行操作,但这不是一个简单的实现方案,而且可能不值得为此付出代价。

    private void btnTopicId_Click(object sender, EventArgs e)
{
    Help.ShowHelp(this.btnOpenHelpShowTopic, helpProvider1.HelpNamespace, HelpNavigator.TopicId, @"10000");
}