代码之家  ›  专栏  ›  技术社区  ›  Josh Kelley

HTML帮助关键字查找

chm
  •  1
  • Josh Kelley  · 技术社区  · 15 年前

    我很难弄清楚如何查找关键字( HH_KEYWORD_LOOKUP )在HTML帮助中工作。如果索引显示如下:

    Machine
        Add
        Edit
        Selection
    

    2 回复  |  直到 12 年前
        1
  •  1
  •   Nitrowares Development    12 年前

    我想我读过(在我的很多谷歌搜索中)在HTML帮助中HH\u关键字\u查找被破坏了,叹气。所以我想出了这个方法来做搜索。它将调出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;
    
        2
  •  0
  •   user1943928    10 年前

    啊哈!!!

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

    然而,尽管它可以手动工作,但是软件API似乎不能立即与这两个空间一起工作。如果我在按下F1键时调用C中的以下API(我必须使用“space”来表示此处的空间,因为如果我使用实际空间,此网站会将两个空间修剪为一个空间):

    系统.Windows.Forms.帮助。显示帮助(这是“file:///C:/apps/MyHelpContentNew”/质量保证.chm", 系统.Windows.Forms.HelpNavigator.KeywordIndex索引,“key2'space”“space'x\u子键(第/u个key2”);

    它不显示从\u键2的x\u子键\u链接的主题。但它几乎在那里,帮助窗口显示了正确的两个级别的关键字放在搜索文本框,只是错过了一个“汽车返回”!

    然后我试着加上这样的汽车回报: