2009-02-18 52 views
1

我無法弄清楚如何讓關鍵字查找(HH_KEYWORD_LOOKUP)在HTML幫助中工作。如果我有一個像這樣顯示的索引:HTML幫助關鍵字查找

Machine 
    Add 
    Edit 
    Selection 

如何指定關鍵字搜索來調出機器選擇? 「Machine; Selection」調出Machine關鍵字; 「選擇」和「機器選擇」完全不起作用;如果用戶手動選擇適當的主題,即使「HTML幫助查看器」的「索引」選項卡中顯示的內容也不是「機器,選擇」。

回答

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; 
0

AHAA!

經過一個小時的打字和嘗試,我發現第一關鍵字和第二關鍵字之間需要兩個空格,最後還需要一個「Enter」鍵來顯示從第二個關鍵字鏈接的主題! !

請記住,正好兩個空格!一個或三個不起作用。訣竅是,在鍵入第二個空格和第二個關鍵字的同時,其他一些關鍵字會在關鍵字列表中突出顯示,這會讓您認爲您已經犯了一個錯誤,並且不會繼續完成鍵入第二個關鍵字!這是微軟工程師的惡作劇嗎?

但是,雖然它手動工作,但似乎軟件API不能立即與TWO空間一起工作。如果我在C#中用F1鍵調用下面的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鏈接的主題。但它幾乎就在那裏,幫助窗口顯示正確的兩個級別的關鍵字放在搜索TextBox中,只是缺少一個「Car-Return」!

然後我試圖添加的車回這樣的:

System.Windows.Forms.Help.ShowHelp(這一點, 「文件:/// C:/apps/MyHelpContentNew/QACT.chm」 System.Windows.Forms.HelpNavigator.KeywordIndex,「key2'space''space'x_subkey_of_key2 \ n」);

它也不起作用。所以我想我需要將汽車返回鍵編程地發送給幫助窗口。如果我實施它,我會發布。