MSFT HTML Help: Как достичь второго уровня ключевого слова?
Я пытаюсь использовать справку MSFT HTML для предоставления справочной системы для одного из наших приложений.
Я столкнулся с проблемой и не смог найти никакой подсказки ни в одной документации. Я считаю, что это простая проблема с простым решением, просто нужно знать об этом:).
Файл справки HTML Help позволяет пользователям создавать многоуровневые ключевые слова. После открытия окна справки и перехода на вкладку "Указатель" появляется область "Введите ключевое слово для поиска:", в которую пользователь может вводить ключевые слова. Все доступные ключевые слова также показаны ниже. Во время набора правильное ключевое слово попадания будет прокручено в окно и выделено.
Проблема в том, что ключевое слово второго уровня не прокручивается и выделено правильно. После ввода ключевого слова первого уровня и нахождения ключевого слова, а затем следующего, независимо от нажатия клавиши, ключевое слово второго уровня не может быть выделено правильно. В результате тема, относящаяся ко второму ключу, не может быть отображена правильно.
Кто-нибудь знает, что является ключом-разделителем между различными уровнями ключевых слов, чтобы использовать их для продолжения поиска на следующем уровне ключевых слов? Эта проблема также возникает с помощью HTML Help API, где клавиша F1 должна найти ключевое слово второго уровня, но на самом деле не может.
Например, у меня есть следующие ключевые слова:
key1
key2
x_subkey_of_key2
y_subkey_of_key2
z_subkey_of_key2
ключ3
Key4
После ввода клавиши key2 и подсветки клавиши2, независимо от того, какую клавишу я нажимаю, она не может выделить y_subkey_of_key2. Многие клавиши будут подсвечены z_subkey_of_key2, который является последним подразделом key2.
Есть идеи?
Большое спасибо.
2 ответа
Ахи!!! После одного часа набора и попытки я выяснил, что необходимы ДВЕ ПРОСТРАНСТВА между ключевым словом первого уровня и ключевым словом второго уровня, и, наконец, необходим ключ Enter, чтобы показать тему, связанную со вторым ключевым словом!!!!
Помните, ровно два пробела! один или три не работает. Хитрость заключается в том, что при наборе второго пробела и второго ключевого слова в списке ключевых слов выделяется какое-то другое ключевое слово, что может заставить вас думать, что вы уже допустили ошибку и не продолжите вводить второе ключевое слово! Это обман инженера Microsoft?
Однако, хотя он работает вручную, программный API, похоже, не работает сразу с ДВУМЯ пробелами. Если я вызываю следующий API в C# при нажатии клавиши F1:
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. Но это почти там, окно справки отображается с правильными ключевыми словами двух уровней, вставленными в текстовое поле поиска, только пропуская "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");
Это тоже не работает. Поэтому я думаю, мне нужно программно отправить ключ возврата машины в окно справки. Выложу, если я однажды осуществлю это.
Теперь я заставил его работать и в программе при обработке клавиши 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");
}
Затем мне нужно отправить клавишу "ВВОД" в это окно справки. Я прочитал некоторые документы MSDN и выяснил следующие способы отправки ключа "ВВОД" в это окно:
Сначала нам нужно вызвать функцию Win32 EnumChildWindows () для поиска всех открытых окон. Функция Win32 будет вызывать C# для обработки каждого открытого окна. Поэтому при вызове функции Win32 нам нужно передать функцию C# в качестве обратного вызова. Эта функция C# определена как делегат, и внутри нее мы можем отфильтровать окно справки HTML и отправить ему ключ "ENTER". Окно справки HTML обычно называется Your-App-Name+Help. Например, если ваше приложение называется "XYZ", то окно справки HTML, запущенное функцией ShowHelp(), называется "Справка 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 и скользит к якору, на который указывают два уровня ключевых слов!
Кстати, я обнаружил, что размещение индекса внутри HTML-файла не помогает (даже если я включаю опцию использования ключевого слова внутри HTML-файла). Я должен явно указать ключевое слово в файле ключевых слов.
Наслаждайтесь!