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-файла). Я должен явно указать ключевое слово в файле ключевых слов.

Наслаждайтесь!

Другие вопросы по тегам