chm - palabras - keywords ejemplos
Búsqueda de palabras clave de la Ayuda HTML (2)
Creo que leí (en mis muchas búsquedas en Google) que HH_KEYWORD_LOOKUP está roto en la ayuda HTML, suspiro. Así que se me ocurrió esta solución para hacer una búsqueda. Aparecerá el archivo chm e ingresará la palabra clave en el cuadro de búsqueda y presione la tecla ENTRAR para realizar la búsqueda manualmente.
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;
Tengo problemas para averiguar cómo obtener búsquedas de palabras clave ( HH_KEYWORD_LOOKUP
) para que funcionen en la Ayuda HTML. Si tengo un índice que se muestra así:
Machine
Add
Edit
Selection
¿Cómo especifico una búsqueda por palabra clave que abre la Selección de máquina? "Machine; Selection" muestra la palabra clave Machine; "Selección" y "Selección de máquina" no funcionan en absoluto; tampoco lo hace "Máquina, Selección", aunque eso es lo que se muestra en la pestaña Índice del Visor de Ayuda HTML si el usuario selecciona manualmente el tema apropiado.
Ahaa !!!
Después de una hora escribiendo y probando, descubrí que se necesitan DOS ESPACIOS entre la palabra clave de primer nivel y la palabra clave de segundo nivel, y finalmente se necesita una tecla "Enter" para mostrar el tema vinculado desde la segunda palabra clave.
Recuerde, exactamente dos espacios! uno o tres no funciona. El truco es, al escribir el segundo espacio y la segunda palabra clave, resaltar algunas otras palabras clave en la lista de palabras clave, lo que puede hacer que pienses que ya cometiste un error y que no continuaría escribiendo la segunda palabra clave. ¿Es esto un engaño del ingeniero de Microsoft?
Sin embargo, aunque funciona manualmente, parece que la API de software no funciona inmediatamente con los DOS espacios. Si llamo a la siguiente API en C # con la tecla F1 presionada (tengo que usar "espacio" para representar un espacio aquí porque este sitio web recorta dos espacios si utilizo el espacio real):
System.Windows.Forms.Help.ShowHelp (esto, "file: /// C: /apps/MyHelpContentNew/QACT.chm", System.Windows.Forms.HelpNavigator.KeywordIndex, "key2''space''''space''x_subkey_of_key2" );
no muestra el tema vinculado desde x_subkey_of_key2. Pero casi está allí, la Ventana de Ayuda aparece con las palabras clave correctas de dos niveles puestas en la búsqueda TextBox, ¡y solo falta un "Car-Return"!
Luego traté de agregar el retorno del auto así:
System.Windows.Forms.Help.ShowHelp (esto, "archivo: /// C: /apps/MyHelpContentNew/QACT.chm", System.Windows.Forms.HelpNavigator.KeywordIndex, "espacio_espacio''espacio''x_subkey_de_key2 / norte");
Tampoco funciona. Así que supongo que necesito enviar una clave de devolución de carro a la ventana de ayuda de forma programada. Publicaré si alguna vez lo implementé.