2013-12-20 50 views
0

我正在嘗試使用MSFT HTML幫助爲我們的應用程序之一提供幫助系統。MSFT HTML Help:如何達到第二級關鍵字?

我遇到一個問題,但沒有找到任何文檔中的任何線索。我相信這是一個容易解決的簡單問題,只需要知道它:)。

HTML幫助關鍵字文件允許用戶創建關鍵字的多級。打開幫助窗口並進入「索引」選項卡後,會出現一個「輸入要查找的關鍵字:」區域,用戶可以輸入關鍵字,所有可用的關鍵字也顯示在下面。在輸入時,正確的匹配關鍵字將滾動到窗口中並突出顯示。

問題是第二級的關鍵字不滾動和高正確地點燃。在輸入第一級關鍵字並找到關鍵字後,接下來無論按什麼鍵都無法正確突出顯示第二級關鍵字。因此,與第二個鍵相關的主題無法正確顯示。

任何人都知道什麼是不同級別的關鍵字之間的分隔符鍵使用繼續關鍵字的下一級進行搜索嗎?使用HTML幫助API也會發生此問題,其中F1鍵應該找到第二級關鍵字但實際上不能。

例如,我有以下關鍵字:

key1的

鍵2

x_subkey_of_key2 

    y_subkey_of_key2 

    z_subkey_of_key2 

KEY3

KEY4

打字鍵2之後和hilights KEY2,那麼不管我按哪個鍵,它不能突出顯示y_subkey_of_key2。許多按鍵將高亮z_subkey_of_key2,這是key2的最後一個子鍵。

任何想法?

非常感謝。

+0

相似(或重複):[HTML幫助關鍵字查找](http://stackoverflow.com/q/563012/113116) – Helen

回答

1

阿哈!!!一個小時的打字和努力之後,我想通了,需要將第一級關鍵字和第二級關鍵字之間的兩個空格和回車關鍵需要在最後顯示從第二關鍵字鏈接主題!!!!

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

然而,儘管手動它的工作原理,似乎軟件API不與兩個空格立即開展工作。如果我在F1調用C#以下API鍵按下:

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

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

+0

供參考:您可以使用工具欄上的{}按鈕來格式化文本塊作爲代碼。它將保留代碼中的空白。 – Helen

0

現在我在處理F1鍵的程序中也使其工作。在處理F1鍵,我叫這個API來啓動幫助窗口和填充用兩個空格分開的兩個級別的關鍵字關鍵字文本框:

{ 
System.Windows.Forms.Help.ShowHelp(this, "file:///C:/apps/MyHelpContentNew/QACT.chm", 
System.Windows.Forms.HelpNavigator.KeywordIndex, "key2 x_subkey_of_key2"); 
} 

然後,我需要發送一個「ENTER」鍵,它幫助窗口。我讀了一些MSDN文檔,想通過以下方法將「ENTER」鍵發送到該窗口:

首先,我們需要調用Win32函數EnumChildWindows()來查找所有打開的窗口。 Win32函數將回調C#以處理每個打開的窗口。所以當調用Win32函數時,我們需要傳遞一個C#函數作爲回調函數。這個C#函數被定義爲一個Delegate,在其中我們可以過濾出HTML幫助窗口併發送「ENTER」鍵給它。 HTML幫助窗口通常稱爲您的應用程序名稱+幫助。例如,如果您的應用程序名爲「XYZ」,則由ShowHelp()啓動的HTML幫助窗口稱爲「XYZ幫助」。下面是代碼:

using System.Diagnostics; 
using System.Runtime.InteropServices; 
using System.Text; 

class YourClass { 
    [DllImport("user32.dll")] 
    public static extern bool SetForegroundWindow(IntPtr hWnd); 

    // declare the delegate 
    public delegate bool WindowEnumDelegate(IntPtr hwnd, 
              int lParam); 

    // declare the API function to enumerate child windows 
    [DllImport("user32.dll")] 
    public static extern int EnumChildWindows(IntPtr hwnd, 
              WindowEnumDelegate del, 
              int lParam); 

    // declare the GetWindowText API function 
    [DllImport("user32.dll")] 
    public static extern int GetWindowText(IntPtr hwnd, 
             StringBuilder bld, int size); 

    //define your callback function: 
    public static bool WindowEnumProc(IntPtr hwnd, int lParam) 
    { 
    // get the text from the window 
    StringBuilder bld = new StringBuilder(256); 
    GetWindowText(hwnd, bld, 256); 
    string text = bld.ToString(); 

    if (text.Length > 0) 
    { 
     if (text == "XYZ Help") 
     { 
      //IntPtr h = p.MainWindowHandle; 
      SetForegroundWindow(hwnd); 
      SendKeys.Send("{ENTER}"); 
     } 
    } 
    return true; 
    } 

//在您的F1鍵處理,之後通過調用ShowHelp(啓動幫助窗口),實例化//回調函數委託,並調用EnumChildWindows():

private void GenericTreeView_KeyDown(object sender, KeyEventArgs e) 
    { 
    if (e.KeyCode == Keys.F1) 
    { 
     System.Windows.Forms.Help.ShowHelp(this, "file:///C:/apps/MyHelpContentNew/QACT.chm", 
      System.Windows.Forms.HelpNavigator.KeywordIndex, "key2 x_subkey_of_key2"); 
       // instantiate the delegate 
       WindowEnumDelegate del 
         = new WindowEnumDelegate(WindowEnumProc); 

       // call the win32 function 
       EnumChildWindows(IntPtr.Zero, del, 0); 
    } 
    } 

}

瞧!

您將看到按下F1鍵後,幫助窗口很好地打開了正確的HTML文件,並滑動到兩級關鍵字指向的錨!

順便說一句,我發現把索引放在HTML文件中並沒有幫助(即使我啓用了在HTML文件中使用關鍵字的選項)。我必須明確地將關鍵字放在關鍵字文件中。

享受!

相關問題