2009-02-18 7 views
1

Je n'arrive pas à trouver comment obtenir des recherches de mots clés (HH_KEYWORD_LOOKUP) pour travailler dans l'aide HTML. Si j'ai un index qui s'affiche comme ceci:Recherche de mots clés d'aide HTML

Machine 
    Add 
    Edit 
    Selection 

Comment est-ce que je spécifie une recherche de mot-clé qui fait apparaître la sélection de machine? "Machine; Sélection" fait apparaître le mot-clé Machine; "Sélection" et "Sélection de machine" ne fonctionnent pas du tout; ni "Machine, Selection", même si c'est ce qui est affiché dans l'onglet Index de HTML Help Viewer si l'utilisateur sélectionne manuellement le sujet approprié.

Répondre

1

Je pense que j'ai lu (dans mes nombreuses recherches google) que HH_KEYWORD_LOOKUP est cassé dans l'aide HTML, soupir. Donc Ie est venu avec cette solution pour faire une recherche. Il fera apparaître le fichier chm et entrez le mot-clé dans la boîte de recherche et appuyez sur la touche ENTRÉE pour faire manuellement la recherche.

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 !!! Après une heure de dactylographie et d'essai, j'ai compris que DEUX ESPACES sont nécessaires entre le mot clé de premier niveau et le mot clé de deuxième niveau, et qu'une touche "Entrée" est enfin nécessaire pour afficher le sujet lié au second mot clé! !!!

Rappelez-vous, exactement deux espaces! un ou trois ne fonctionne pas. L'astuce est, tout en tapant le deuxième espace et deuxième mot-clé, un autre mot-clé mis en évidence dans la liste des mots-clés, ce qui peut vous faire penser que vous avez déjà fait une erreur et ne continuerait pas à taper le deuxième mot-clé! Est-ce un canular par un ingénieur de Microsoft?

Cependant, bien que cela fonctionne manuellement, il semble que l'API du logiciel ne fonctionne pas immédiatement avec les deux espaces. Si j'appelle l'API suivante en C# lorsque j'appuie sur la touche F1 (je dois utiliser "espace" pour représenter un espace ici car ce site réduit deux espaces à un si j'utilise un espace réel):

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

il n'affiche pas le sujet lié à x_subkey_of_key2. Mais il est presque là, la fenêtre d'aide apparaît avec les mots clés corrects de deux niveaux mis dans la zone de texte de recherche, manquant seulement un "Car-Return"!

Alors j'ai essayé d'ajouter la voiture-retour comme ceci:

System.Windows.Forms.Help.ShowHelp (this, "file: /// C: /apps/MyHelpContentNew/QACT.chm", System.Windows.Forms.HelpNavigator.KeywordIndex, "l'espace 'de l'espace2 de la clé' espace 'x_subkey_de_key2 \ n");

Cela ne fonctionne pas non plus. Donc je suppose que j'ai besoin d'envoyer une clé de retour de voiture à la fenêtre d'aide de manière programmée. Publiera si je l'implémente une fois.

Questions connexes