Поиск по ключевым словам справки HTML - PullRequest
1 голос
/ 19 февраля 2009

У меня возникли проблемы с выяснением того, как заставить поиск по ключевым словам (HH_KEYWORD_LOOKUP) работать в Справке HTML. Если у меня есть индекс, который отображается так:

Machine
    Add
    Edit
    Selection

Как мне указать поиск по ключевым словам, который вызывает выбор машины? «Машина; Выбор» вызывает ключевое слово Machine; «Выбор» и «Выбор машины» вообще не работают; «Машина, Выбор» также не работает, даже если это то, что отображается на вкладке «Индекс» средства просмотра справки HTML, если пользователь вручную выбирает соответствующую тему.

Ответы [ 2 ]

1 голос
/ 22 ноября 2011

Я думаю, что прочитал (во многих моих поисках в Google), что HH_KEYWORD_LOOKUP не работает в справке HTML, вздох. То есть я придумал это решение для поиска. Он выведет файл chm, введет ключевое слово в поле поиска и нажмите клавишу ВВОД, чтобы выполнить поиск вручную.

procedure PostKey(aKey: Word; const aShift: TShiftState; aSpeciaKey: Boolean);
type
  TShiftKeyInfo = record
    shift: Byte;
    vkey: Byte;
  end;
  byteset = set of 0..7;
const
  shiftkeys: array [1..3] of TShiftKeyInfo =
    ((shift: Ord(ssCtrl); vkey: VK_CONTROL),
    (shift: Ord(ssShift); vkey: VK_SHIFT),
    (shift: Ord(ssAlt); vkey: VK_MENU));
var
  flag: DWORD;
  bShift: ByteSet absolute aShift;
  i: Integer;
begin
  for i := 1 to 3 do
  begin
    if shiftkeys[i].shift in bShift then
      keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), 0, 0);
  end; { For }
  if aSpeciaKey then
    flag := KEYEVENTF_EXTENDEDKEY
  else
    flag := 0;
  keybd_event(aKey, MapvirtualKey(aKey, 0), flag, 0);
  flag := flag or KEYEVENTF_KEYUP;
  keybd_event(aKey, MapvirtualKey(aKey, 0), flag, 0);
  for i := 3 downto 1 do
  begin
    if shiftkeys[i].shift in bShift then
      keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0),
        KEYEVENTF_KEYUP, 0);
  end; { For }
end;

procedure CHMSearch(aCHMFilename, aSearch: string);
var
  cfn: string;
  qry: THHFtsQuery;
  hnd: HWND;

  procedure DoSearch(aMsg: string);
  var
    i,n: Integer;
    c: Char;
    shift: TShiftState;
  begin
    if hnd = 0 then Exit;
    Windows.SetFocus(hnd);
    n := Length(aMsg);
    if n > 0 then
    begin
      for i := 1 to n do
      begin
        c := aMsg[i];
        shift := [];
        case c of
          'a'..'z': shift := [];
          'A'..'Z': shift := [ssShift];
          '_': // underscore key
          begin
            keybd_event(VK_SHIFT, 0, 0, 0);
            keybd_event(VK_OEM_MINUS, 0, 0, 0);
            keybd_event(VK_OEM_MINUS, 0, KEYEVENTF_KEYUP, 0);
            keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
            continue;
          end;
          '$': // $ key
          begin
            PostKey(Ord('4'), [ssShift], False);
            continue;
          end;

        end;
        PostKey(Ord(UpCase(c)), shift, False);
      end;
      PostKey(VK_RETURN, [], False);
      PostKey(VK_RETURN, [], False);
    end;
  end;

begin
  cfn := ChangeFileExt(aCHMFilename, '.chm');
  FillChar(qry, SizeOf(qry), 0);
  qry.cbStruct := SizeOf(THHFtsQuery);
  qry.fExecute := TRUE;
  HH.HtmlHelpA(GetDesktopWindow, PAnsiChar(AnsiString(cfn)), HH_DISPLAY_TOC, 0);
  hnd := HH.HtmlHelpA(GetDesktopWindow, PAnsiChar(AnsiString(cfn)), HH_DISPLAY_SEARCH,
    Cardinal(@qry));
  DoSearch(aSearch);
end;
0 голосов
/ 20 декабря 2013

ахи !!!

После одного часа печати и попытки я выяснил, что необходимы ДВЕ ПРОСТРАНСТВА между ключевым словом первого уровня и ключевым словом второго уровня, и, наконец, необходим ключ "Enter", чтобы показать тему, связанную со вторым ключевым словом !! !!

Помните, ровно два пробела! один или три не работает. Хитрость заключается в том, что при наборе второго пробела и второго ключевого слова в списке ключевых слов выделяется какое-то другое ключевое слово, что может заставить вас думать, что вы уже допустили ошибку и не продолжите вводить второе ключевое слово! Это обман инженера Microsoft?

Однако, хотя он работает вручную, программный API, похоже, не работает сразу с ДВУМЯ пробелами. Если я вызываю следующий API в C # после нажатия клавиши F1 (я должен использовать «пробел», чтобы представить пробел здесь, потому что этот сайт обрезает два пробела до одного, если я использую реальный пробел):

System.Windows.Forms.Help.ShowHelp (this, «file: /// C: /apps/MyHelpContentNew/QACT.chm», System.Windows.Forms.HelpNavigator.KeywordIndex, пространство «key2'space») «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'space») «x_subkey_of_key2 \ п");

Это тоже не работает. Так что, думаю, мне нужно программно отправить ключ возврата машины в окно справки. Буду публиковать, если я однажды осуществлю это.

...