我正在尝试使用MSFT HTML帮助为我们的某个应用程序提供帮助系统。
我遇到了问题,在任何文档中都找不到任何线索。我相信这是一个容易解决的简单问题,只需知道它:)。
HTML帮助关键字文件允许用户创建多个级别的关键字。打开“帮助窗口”并进入“索引”选项卡后,有一个“键入要查找的关键字:”区域,用户可以在其中输入关键字,所有可用的关键字也显示如下。输入时,正确的命中关键字将滚动到窗口并突出显示。
问题是第二级关键字未滚动且高亮度正确。输入第一级关键字并找到关键字后,接下来无论按哪个键,第二级关键字都无法正确突出显示。因此,无法正确显示与第二个键相关的主题。
任何人都知道用于继续搜索下一关键字级别的不同关键字级别之间的分隔符键是什么?使用HTML帮助API也会发生此问题,其中F1键应该找到第二级关键字但实际上不能。
例如,我有以下关键字:
KEY1
KEY2
x_subkey_of_key2
y_subkey_of_key2
z_subkey_of_key2
KEY3
KEY4
键入key2和hilights key2后,无论我按哪个键,都无法突出显示y_subkey_of_key2。许多键将高亮显示z_subkey_of_key2,这是key2的最后一个子键。
有什么想法吗?
非常感谢。
答案 0 :(得分:1)
AHAA !!!经过一个小时的打字和尝试,我发现第一级关键字和第二级关键字之间需要两个空格,最后需要一个 Enter 键来显示从第二个关键字链接的主题!!!!
请记住,正好两个空格!一三个不起作用。诀窍是,在键入第二个空格和第二个关键字时,其他一些关键字会在关键字列表中突出显示,这可能会让您认为您已经犯了错误并且不会继续输入第二个关键字!这是微软工程师的骗局吗?
然而,虽然手动工作,但似乎软件API不能立即使用TWO空间。如果我按下 F1 键在C#中调用以下API:
System.Windows.Forms.Help.ShowHelp(this, "file:///C:/apps/MyHelpContentNew/QACT.chm",
System.Windows.Forms.HelpNavigator.KeywordIndex, "key2 x_subkey_of_key2");
它不显示从x_subkey_of_key2链接的主题。但它几乎就在那里,帮助窗口显示正确的两级关键字放在搜索TextBox中,只缺少“Car-Return”!
然后我试着像这样添加汽车回报:
System.Windows.Forms.Help.ShowHelp(this, "file:///C:/apps/MyHelpContentNew/QACT.chm",
System.Windows.Forms.HelpNavigator.KeywordIndex, "key2 x_subkey_of_key2\n");
它也不起作用。所以我想我需要以编程方式将一个汽车返回键发送到帮助窗口。如果我实施它,将发布。
答案 1 :(得分:0)
现在我也在程序中处理了F1键。在处理F1键时,我调用此API来启动帮助窗口并使用两个级别关键字填充关键字文本框,这两个关键字用两个空格分隔:
{
System.Windows.Forms.Help.ShowHelp(this, "file:///C:/apps/MyHelpContentNew/QACT.chm",
System.Windows.Forms.HelpNavigator.KeywordIndex, "key2 x_subkey_of_key2");
}
然后,我需要向该帮助窗口发送一个“ENTER”键。我阅读了一些MSDN文档,并想出了以下方法将“ENTER”键发送到该窗口:
首先我们需要调用Win32函数EnumChildWindows()来查找所有打开的窗口。 Win32函数将回调到C#以处理每个打开的窗口。因此,在调用Win32函数时,我们需要传递一个C#函数作为回调。这个C#函数定义为Delegate,在其中我们可以过滤出HTML Help窗口并向其发送“ENTER”键。 HTML帮助窗口通常称为Your-App-Name + Help。例如,如果应用程序名为“XYZ”,则ShowHelp()启动的HTML帮助窗口称为“XYZ帮助”。这是代码:
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Text;
class YourClass {
[DllImport("user32.dll")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
// declare the delegate
public delegate bool WindowEnumDelegate(IntPtr hwnd,
int lParam);
// declare the API function to enumerate child windows
[DllImport("user32.dll")]
public static extern int EnumChildWindows(IntPtr hwnd,
WindowEnumDelegate del,
int lParam);
// declare the GetWindowText API function
[DllImport("user32.dll")]
public static extern int GetWindowText(IntPtr hwnd,
StringBuilder bld, int size);
//define your callback function:
public static bool WindowEnumProc(IntPtr hwnd, int lParam)
{
// get the text from the window
StringBuilder bld = new StringBuilder(256);
GetWindowText(hwnd, bld, 256);
string text = bld.ToString();
if (text.Length > 0 )
{
if (text == "XYZ Help")
{
//IntPtr h = p.MainWindowHandle;
SetForegroundWindow(hwnd);
SendKeys.Send("{ENTER}");
}
}
return true;
}
//在F1键处理程序中,通过调用ShowHelp()启动帮助窗口后,实例化//回调函数委托并调用EnumChildWindows():
private void GenericTreeView_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.F1)
{
System.Windows.Forms.Help.ShowHelp(this, "file:///C:/apps/MyHelpContentNew/QACT.chm",
System.Windows.Forms.HelpNavigator.KeywordIndex, "key2 x_subkey_of_key2");
// instantiate the delegate
WindowEnumDelegate del
= new WindowEnumDelegate(WindowEnumProc);
// call the win32 function
EnumChildWindows(IntPtr.Zero, del, 0);
}
}
}
瞧!
您将看到按F1键后,帮助窗口可以很好地打开正确的HTML文件并滑动到两级关键字所指向的锚点!
BTW,我发现将索引放在HTML文件中没有帮助(即使我在HTML文件中启用了使用关键字的选项)。我必须明确地将关键字放在关键字文件中。享受!