1

HH_KEYWORD_LOOKUPHTML ヘルプでキーワード検索 ( ) を機能させる方法がわかりません。次のように表示されるインデックスがある場合:

Machine
    Add
    Edit
    Selection

Machine Selection を表示するキーワード検索を指定するにはどうすればよいですか? 「Machine; Selection」は Machine キーワードを表示します。「選択」と「マシン選択」はまったく機能しません。ユーザーが適切なトピックを手動で選択すると、HTML ヘルプ ビューアーの [インデックス] タブに表示されますが、"Machine, Selection" も表示されません。

4

2 に答える 2

1

HH_KEYWORD_LOOKUP が HTML ヘルプで壊れていることを (私の多くの Google 検索で) 読んだと思います。だから私は検索を行うためにこの解決策を思いつきました。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

あはぁ!!!

1 時間の入力と試行の後、第 1 レベルのキーワードと第 2 レベルのキーワードの間に 2 つのスペースが必要であり、第 2 レベルのキーワードからリンクされたトピックを表示するには「Enter」キーが最後に必要であることがわかりました!!!!

正確に 2 つのスペースを覚えておいてください。1 つまたは 3 つでは機能しません。トリックは、2 番目のスペースと 2 番目のキーワードを入力しているときに、キーワードのリストで他のキーワードが強調表示されることです。これにより、すでに間違いを犯したと思われ、2 番目のキーワードを入力し続けることができなくなります。これはマイクロソフトのエンジニアによるデマですか?

ただし、手動では機能しますが、ソフトウェア API は 2 つのスペースですぐには機能しないようです。F1 キーが押されたときに C# で次の API を呼び出すと (実際のスペースを使用する場合、この Web サイトでは 2 つのスペースが 1 つに切り捨てられるため、ここではスペースを表すために「スペース」を使用する必要があります)。

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 からリンクされたトピックは表示されません。ヘルプ ウィンドウが表示され、正しい 2 つのレベルのキーワードが検索 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");

それもうまくいきません。だから私はプログラムでヘルプ ウィンドウに車のリターン キーを送信する必要があると思います。実装したら投稿します。

于 2013-12-20T09:39:44.160 に答える