HTML帮助关键字查找

时间:2009-02-18 21:56:26

标签: chm

我无法弄清楚如何在HTML帮助中使用关键字查找(HH_KEYWORD_LOOKUP)。如果我有一个如下所示的索引:

Machine
    Add
    Edit
    Selection

如何指定引发机器选择的关键字搜索? “Machine; Selection”调出Machine关键字; “选择”和“机器选择”根本不起作用; “机器,选择”也没有,即使用户手动选择适当的主题,也会显示在HTML帮助查看器的“索引”选项卡中。

2 个答案:

答案 0 :(得分:1)

我想我(在我的许多谷歌搜索中)看到HH_KEYWORD_LOOKUP在HTML帮助中被打破,叹了口气。所以我想出了这个解决方案来进行搜索。它将调出chm文件并在搜索框中输入关键字,然后按ENTER键手动进行搜索。

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;

答案 1 :(得分:0)

AHAA !!!

经过一个小时的打字和尝试,我发现在第一级关键字和第二级关键字之间需要两个空格,最后需要一个“输入”键来显示从第二个关键字链接的主题!! !!

请记住,正好两个空格!一三个不起作用。诀窍是,在键入第二个空格和第二个关键字时,其他一些关键字会在关键字列表中突出显示,这可能会让您认为您已经犯了错误并且不会继续输入第二个关键字!这是微软工程师的骗局吗?

然而,虽然手动工作,但似乎软件API不能立即使用TWO空间。如果我按下F1键在C#中调用以下API(我必须使用“space”来表示这里的空格,因为如果我使用真实空间,这个网站将两个空格修剪为一个):

System.Windows.Forms.Help.ShowHelp(this,“file:/// C:/apps/MyHelpContentNew/QACT.chm”,System.Windows.Forms.HelpNavigator.KeywordIndex,“key2'space”space “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'space”space “x_subkey_of_key2 \ n“);

它也不起作用。所以我想我需要以编程方式将一个汽车返回键发送到帮助窗口。如果我实施它,将发布。