1

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

Machine
    Add
    Edit
    Selection

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

4

2 回答 2

1

我想我读到(在我的许多谷歌搜索中)HH_KEYWORD_LOOKUP 在 HTML 帮助中被破坏了,叹息。所以 Ie 想出了这个解决方案来进行搜索。它将调出 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;
于 2011-11-22T12:51:56.257 回答
0

啊啊啊!!!

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

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

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

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 链接的主题。但它几乎就在那里,帮助窗口显示正确的两个级别的关键字放在搜索文本框中,只缺少一个“汽车返回”!

然后我尝试像这样添加汽车返回:

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");

它也不起作用。所以我想我需要通过编程向帮助窗口发送一个回车键。如果我实施它会发布。

于 2013-12-20T09:39:44.160 回答