Compartir a través de


Control de la Ayuda en línea

La ayuda en línea puede tener una variedad de formas, desde información conceptual detallada hasta definiciones rápidas. En este tema se incluyen las siguientes secciones.

Acerca de la Ayuda

Un elemento importante de una aplicación fácil de usar está disponible en la ayuda en línea. Windows proporciona funciones y mensajes que, cuando se usan junto con la aplicación de ayuda de Windows, facilitan la implementación de ayuda en línea en la aplicación. En esta introducción se describen los elementos de Windows que admiten ayuda en línea. Describe cómo usar estos elementos para proporcionar a los usuarios un medio para solicitar ayuda y explica cómo usar la aplicación de Ayuda de Windows para mostrar ayuda.

Solicitudes de ayuda

La mayoría de las aplicaciones basadas en Windows proporcionan información de ayuda en línea en una variedad de formas, desde la ayuda conceptual que explica el propósito de las características de una aplicación hasta la ayuda emergente que proporciona definiciones rápidas de elementos individuales en la interfaz de usuario de la aplicación. Las funciones y los mensajes se usan para proporcionar a los usuarios una variedad de formas de solicitar acceso a esta información. En las secciones siguientes se describen estas solicitudes de ayuda.

Menú Ayuda

La mayoría de las aplicaciones proporcionan acceso de los usuarios a la información de ayuda mediante la inclusión de un menú ayuda en la ventana principal. Cuando el usuario selecciona un elemento en un menú Ayuda , el procedimiento de ventana correspondiente recibe un mensaje de WM_COMMAND que identifica el elemento seleccionado. La aplicación responde mostrando la información de ayuda adecuada, como una lista de temas de ayuda, un índice o una introducción a la aplicación.

Ayuda del teclado

Windows proporciona acceso de usuario para ayudar a la información del teclado notificando a la aplicación cada vez que el usuario presiona la tecla F1. El sistema envía un mensaje WM_HELP a la ventana que tenía el foco del teclado cuando el usuario presionaba la tecla. Si la ventana es una ventana secundaria (por ejemplo, un control en un cuadro de diálogo), la función DefWindowProc pasa el mensaje a la ventana primaria. Si un menú está activo cuando se presiona F1, el sistema envía el mensaje a la ventana asociada al menú. La aplicación responde mostrando información de ayuda asociada a la ventana, el control o el menú que tiene el foco o está activo. Por ejemplo, si el usuario selecciona un control en un cuadro de diálogo y presiona F1, la aplicación muestra información de ayuda para ese control.

El parámetro lParam de WM_HELP es un puntero a una estructura HELPINFO que contiene información detallada sobre el elemento para el que se solicita ayuda. Esta información se usa para determinar el tema de ayuda que se va a mostrar. La estructura HELPINFO también incluye las coordenadas del cursor del mouse en el momento en que el usuario presionó la tecla. Puede usar esta información para proporcionar ayuda en función de la ubicación del cursor del mouse.

Ayuda del mouse

Windows proporciona al usuario acceso para ayudar a la información del mouse notificando a la aplicación cada vez que el usuario hace clic en el botón derecho del mouse o hace clic en una ventana, control o menú después de hacer clic en el botón Pregunta (?). La aplicación responde mostrando información de ayuda asociada a la ventana, el control o el menú especificados.

El sistema envía un mensaje de WM_CONTEXTMENU cuando el usuario hace clic en el botón derecho del mouse. La ventana en la que se hizo clic recibe el mensaje. Si la ventana es una ventana secundaria, como un control, la función DefWindowProc pasa el mensaje a la ventana primaria. El mensaje WM_CONTEXTMENU especifica las coordenadas del cursor del mouse. La coordenada x se encuentra en la palabra de orden bajo del parámetro lParam y la coordenada y está en la palabra de orden superior. Si el usuario ha hecho clic en un control, el parámetro wParam es el identificador del control que recibió el clic.

El sistema envía un mensaje de WM_HELP cuando el usuario hace clic en un elemento de una ventana después de hacer clic en el botón Pregunta (?) que aparece en la barra de título de la ventana. Puede agregar un botón Pregunta a una barra de título especificando el estilo WS_EX_CONTEXTHELP en la función CreateWindowEx al crear la ventana. El parámetro lParam de WM_HELP es un puntero a una estructura HELPINFO que contiene información detallada sobre el elemento para el que se solicita ayuda, incluidas las coordenadas del cursor del mouse en el momento en que el usuario ha hecho clic en el botón del mouse.

El botón Pregunta solo se recomienda para su uso en cuadros de diálogo. En el pasado, las aplicaciones han proporcionado acceso de usuario para ayudar a obtener información sobre un cuadro de diálogo proporcionando un botón Ayuda en el cuadro de diálogo. Este método ya no se recomienda. En su lugar, use el botón Pregunta.

Ayuda para mostrar y ayuda de Windows

Una vez que una aplicación recibe una solicitud de ayuda, debe mostrar la información de ayuda adecuada. Dado que la aplicación de Ayuda de Windows proporciona una interfaz de usuario coherente, se recomienda que las aplicaciones usen la Ayuda de Windows en lugar de otros métodos. Para dirigir la Ayuda de Windows para mostrar información de ayuda, una aplicación usa la función WinHelp , especificando detalles como la información que se va a mostrar y el formulario de la ventana en la que se va a mostrar. En las secciones siguientes se explica cómo usar WinHelp para mostrar información de ayuda.

archivos de ayuda

Para ver la información de ayuda, debe especificar un archivo de ayuda al llamar a la función WinHelp . El archivo de ayuda debe tener el formato de archivo de Ayuda de Windows (.hlp) y uno o varios temas. Cada tema es una unidad de información distinta, como una descripción conceptual, un conjunto de instrucciones, una imagen, una definición de glosario, etc. Los temas deben identificarse de forma única para que la Ayuda de Windows pueda localizarlos siempre que se soliciten. Internamente, la Ayuda de Windows usa identificadores de tema para buscar temas, pero las aplicaciones suelen usar identificadores de contexto (valores enteros únicos) para especificar los temas que se van a mostrar. El autor del archivo de ayuda debe asignar explícitamente identificadores de contexto a identificadores de tema en la sección [MAP] del archivo de proyecto usado para compilar el archivo de ayuda.

Cuando se especifica un archivo de ayuda, pero no se especifica una ruta de acceso, WinHelp busca el archivo de ayuda en el directorio de ayuda o en un directorio especificado por la variable de entorno PATH. Además, WinHelp puede encontrar un archivo de ayuda cuyo nombre aparece en la siguiente ubicación del Registro:

HKEY_LOCAL_MACHINE
   Software
      Microsoft
         Windows
            Help

Para aprovechar el registro, debe crear un nombre de valor que tenga el mismo nombre que el archivo de ayuda. El valor asignado a ese nombre debe ser el directorio donde reside el archivo de ayuda.

Si WinHelp no encuentra el archivo de ayuda especificado, muestra un cuadro de diálogo que permite al usuario especificar la ubicación del archivo de ayuda. Dado que WinHelp guarda la información de ubicación en el registro, no solicita de nuevo la ubicación del mismo archivo de ayuda.

Para obtener más información sobre cómo crear y crear un archivo de ayuda, consulte la documentación proporcionada con las herramientas de desarrollo.

Iniciar la Ayuda de Windows

En el ejemplo siguiente se usa la función WinHelp para iniciar la aplicación de ayuda de Windows y abrir el archivo de ayuda en su tema Contenido.

HWND hwnd;     // main window handle 
BOOL bResult   // for checking Boolean function result 

bResult = WinHelp(hWnd, "WINNT.HLP", HELP_CONTENTS, 0L);

En este ejemplo siguiente se abre el archivo de ayuda del usuario, se busca el archivo del tema asociado a una cadena de palabra clave y, a continuación, se muestra el tema.

HWND hwnd;     // main window handle 
BOOL bResult   // for checking Boolean function result 

bResult = WinHelp(hWnd, "WINNT.HLP", HELP_KEY, (DWORD) "finding topics");

Cuadro de diálogo Temas de Ayuda

Puede mostrar el cuadro de diálogo Temas de Ayuda llamando a la función WinHelp con el comando HELP_FINDER . El cuadro de diálogo Temas de Ayuda permite al usuario seleccionar temas para mostrar viendo los títulos de los temas, las palabras clave asociadas a los temas o las palabras y frases que se encuentran en los temas. Las aplicaciones suelen mostrar este cuadro de diálogo cuando el usuario elige un comando, como Temas de Ayuda, en el menú Ayuda. Una aplicación también puede mostrar este cuadro de diálogo si el usuario presiona la tecla cuando ninguna ventana, control o menú específicos de la aplicación tiene el foco o está activo.

En el pasado, las aplicaciones han usado los comandos HELP_CONTENTS y HELP_INDEX con la función WinHelp para mostrar el tema Contenido y el índice de palabras clave del archivo de Ayuda. Estos comandos ya no se recomiendan. Use el comando HELP_FINDER en su lugar.

Temas de información

Puedes mostrar un tema específico llamando a la función WinHelp con el comando HELP_CONTEXT y especificando el identificador de contexto del tema. Las aplicaciones suelen usar el comando HELP_CONTEXT en respuesta a las solicitudes de usuario para temas que contienen información conceptual o ayuda de procedimientos en lugar de información sobre un control o menú específico. En tales casos, el usuario puede seguir examinando el archivo de ayuda buscando información relacionada antes de volver a la aplicación.

El comando HELP_CONTEXT invoca una instancia normal de la Ayuda de Windows, lo que permite al usuario buscar otros temas en el archivo de ayuda. Normalmente se muestra la ventana de ayuda principal, que incluye una barra de título, un menú del sistema, minimizar y maximizar botones, un menú principal, una barra de navegación opcional, un borde de tamaño y un área de cliente. El texto del tema seleccionado aparece en el área cliente y el usuario puede navegar por el archivo de ayuda mediante vínculos activos o botones de navegación en la ventana principal. La instancia normal de la Ayuda de Windows también se puede usar para mostrar ayuda en una o varias ventanas secundarias en lugar de en la ventana principal.

Temas emergentes

Puedes mostrar un tema emergente que contenga información de un control o menú específico llamando a la función WinHelp con el comando HELP_WM_HELP o HELP_CONTEXTMENU. Estos comandos muestran un tema en una ventana emergente cerca del control o menú correspondiente. Para permitir que el usuario vuelva inmediatamente a trabajar en la aplicación, la ventana emergente se destruye en cuanto el usuario presiona una tecla o hace clic en el botón izquierdo del mouse.

Use el comando HELP_WM_HELP al procesar mensajes WM_HELP para las ventanas de control. Dado que la mayoría de los controles pasan el mensaje WM_HELP a la función DefWindowProc , el procedimiento de cuadro de diálogo correspondiente (o procedimiento de ventana principal) procesa este mensaje. En lugar de proporcionar un identificador de contexto específico, el procedimiento del cuadro de diálogo debe pasar una matriz de pares de identificadores de control y contexto a WinHelp junto con el identificador de control especificado en el miembro hItemHandle de la estructura HELPINFO pasada con el mensaje WM_HELP . La función determina el identificador del control para el que se generó el mensaje de WM_HELP y usa el identificador de contexto coincidente para mostrar el tema adecuado.

Use el comando HELP_CONTEXTMENU al procesar mensajes WM_CONTEXTMENU . Dado que la mayoría de los controles pasan el mensaje WM_CONTEXTMENU a la función DefWindowProc , el procedimiento de cuadro de diálogo correspondiente (o procedimiento de ventana principal) procesa este mensaje. El procedimiento especifica una matriz de pares de identificadores de control y contexto; también especifica el identificador en el parámetro wParam al llamar a WinHelp para que la función pueda elegir el identificador de contexto adecuado de la matriz y mostrar el tema adecuado. A diferencia del comando HELP_WM_HELP, HELP_CONTEXTMENU muestra primero un comando What's This? en un menú. Si el usuario elige el comando, WinHelp muestra el tema. De lo contrario, se cancela la solicitud.

También puede mostrar temas emergentes mediante el comando HELP_CONTEXTPOPUP y especificar un identificador de contexto del tema. Este comando es similar al comando HELP_CONTEXT, pero invoca la instancia emergente de la Ayuda de Windows usada por HELP_WM_HELP y HELP_CONTEXTMENU. Las aplicaciones pueden usar este comando en respuesta a WM_HELP mensajes para mostrar ayuda para menús y para ventanas que no son controles en un cuadro de diálogo. Para usar este comando de forma más eficaz, la aplicación debe asignar identificadores de contexto a estos menús y ventanas.

Puede asignar un identificador de contexto a cualquier ventana o menú de la aplicación. Cuando se genera un mensaje de WM_HELP , el sistema incluye el identificador de contexto en la estructura HELPINFO que se pasa a la ventana primaria del mensaje WM_HELP . A continuación, la ventana primaria puede pasar el identificador de contexto a WinHelp para mostrar el tema de ayuda solicitado.

La función SetWindowContextHelpId se usa para asignar un identificador de contexto a una ventana o control y la función SetMenuContextHelpId para asignar un identificador de contexto a un menú. Puede recuperar el identificador de contexto de una ventana o menú mediante la función GetWindowContextHelpId o GetMenuContextHelpId .

Búsquedas de palabras clave

Puede permitir que el usuario busque y vea temas mediante la asignación de palabras clave a temas en el archivo de ayuda. Una palabra clave es simplemente una cadena asociada a uno o varios temas. La Ayuda de Windows recopila todas las palabras clave de un archivo de ayuda, las coloca en una tabla y las muestra en la lista Índice del cuadro de diálogo Temas de ayuda . Cuando el usuario selecciona una palabra clave, la Ayuda de Windows muestra el tema de ayuda asociado o, si hay más de un tema asociado a la palabra clave, muestra una lista de temas de los que el usuario puede elegir.

En una aplicación, puede usar el comando HELP_KEY, HELP_PARTIALKEY o HELP_MULTIKEY con la función WinHelp para buscar y mostrar temas de ayuda basados en palabras clave completas o parciales. Especifique el comando, la cadena de palabra clave, el archivo de ayuda y el identificador de la ventana del propietario. En todos los casos, si se encuentra una coincidencia única, WinHelp muestra el tema correspondiente. Si se encuentra más de una coincidencia, la función muestra el cuadro de diálogo Temas encontrados y el usuario puede elegir qué tema ver. Si no se encuentra ninguna coincidencia, WinHelp muestra la lista Índice (para HELP_KEY y HELP_PARTIALKEY) o muestra un mensaje de error (para HELP_MULTIKEY).

La aplicación puede buscar varias palabras clave en una sola llamada a WinHelp separando las palabras clave con punto y coma. (No se admite la búsqueda de varias palabras clave para archivos de ayuda creados para Windows versión 3. x) También puede buscar palabras clave en varios archivos de ayuda si el archivo de ayuda especificado tiene un archivo contents(.cnt) que contiene comandos :Index o :Link. Con el comando HELP_KEY, WinHelp busca palabras clave en todos los archivos especificados por estos comandos. Con los comandos HELP_MULTIKEY y HELP_PARTIALKEY, la función busca en todos los archivos excepto los especificados por los comandos :Link.

De forma predeterminada, la Ayuda de Windows solo reconoce la tabla de palabras clave identificada por el carácter de nota al pie K en el archivo de origen de ayuda. Puede dirigir la Ayuda de Windows para crear tablas de palabras clave adicionales agregando un carácter de nota al pie que no sea K, con la definición de palabra clave, en el archivo de código fuente de ayuda. (El carácter de nota al pie A, sin embargo, está reservado). Debe definir las tablas de palabras clave adicionales mediante instrucciones MULTIKEY en la sección [OPTIONS] del archivo de proyecto al compilar el archivo de ayuda.

Una aplicación puede usar el comando HELP_SETINDEX con la función WinHelp para dirigir la Ayuda de Windows para mostrar una tabla de palabras clave distinta de K en su lista de índices. Para dirigir la Ayuda de Windows para buscar una palabra clave en una tabla de palabras clave alternativa, una aplicación puede usar el comando HELP_MULTIKEY. Especifique la palabra clave y la tabla de palabras clave en una estructura MULTIKEYHELP , que se pasa a WinHelp.

Cuando WinHelp muestra un tema, lo muestra en la ventana especificada por la nota al pie ">" del tema, en la ventana especificada por el comando :Base en el archivo de contenido o en la ventana principal. Si la ventana principal ya está abierta a un archivo de ayuda diferente al llamar a WinHelp, la función oculta la ventana principal mientras busca. En este caso, al cancelar los cuadros de diálogo Temas encontrados y Temas de Ayuda , se cierra la ventana principal.

Ventanas de Ayuda secundaria

La ventana principal de la aplicación ayuda de Windows se denomina ventana principal. La Ayuda de Windows también puede mostrar temas de ayuda en una ventana secundaria. A diferencia de la ventana de Ayuda principal, una ventana secundaria no contiene una barra de menús. Puede incluir una barra de navegación en una ventana secundaria y puede agregar botones a la barra. También puede optar por que la Ayuda de Windows ajuste automáticamente el alto de la ventana secundaria para dar cabida al tema.

Debe definir ventanas secundarias en la sección [WINDOWS] del archivo del proyecto de ayuda, proporcionando el nombre y, opcionalmente, el tamaño inicial y la posición de cada ventana. Puedes dirigir la aplicación de Ayuda de Windows para mostrar un tema en una ventana secundaria anexando un corchete angular (>) y el nombre que has definido para la ventana secundaria al nombre del archivo de ayuda. A continuación, la cadena resultante se pasa a la función WinHelp .

Una aplicación puede cambiar el tamaño y la posición de una ventana principal o secundaria especificando la dirección de una estructura HELPWININFO y el comando HELP_SETWINPOS en una llamada a WinHelp. HELPWININFO especifica el nombre de la ventana y su nuevo tamaño y posición.

Ayuda de tarjeta de entrenamiento

Con la ayuda de la tarjeta de entrenamiento, una aplicación puede mostrar una secuencia de instrucciones para guiar al usuario a través de los pasos de una tarea. Normalmente, una tarjeta de entrenamiento consta de texto que explica un paso y botones concretos asociados a macros de TCard, que permiten al usuario indicar a la aplicación qué hacer a continuación. Las tarjetas de entrenamiento solo se pueden mostrar en ventanas secundarias y no deben contener vínculos activos a otros temas del archivo de ayuda.

Una aplicación inicia la instancia de tarjeta de entrenamiento de la Ayuda de Windows llamando a la función WinHelp y especificando el comando HELP_TCARD en combinación con otro comando, como HELP_CONTEXT. Posteriormente, cuando el usuario hace clic en un botón de la tarjeta de entrenamiento, hace clic en un punto activo asignado a la macro TCard o cierra la tarjeta de entrenamiento, la Ayuda de Windows notifica a la aplicación mediante el envío de un mensaje de WM_TCARD . El parámetro wParam identifica el botón o la acción del usuario, y el parámetro lParam contiene datos adicionales, cuyo significado depende del valor de wParam.

Cancelación de ayuda

La Ayuda de Windows requiere que una aplicación cancele explícitamente la ayuda para que pueda liberar los recursos usados para realizar un seguimiento de la aplicación y sus archivos de ayuda. La aplicación puede hacerlo en cualquier momento llamando a la función WinHelp y especificando el comando HELP_QUIT. Tenga en cuenta que esto no es cierto para la instancia emergente de la Ayuda de Windows. Una aplicación no debe intentar cerrar una instancia emergente.

Si una aplicación ha realizado alguna llamada a WinHelp, debe cancelar la ayuda antes de cerrar su ventana principal (por ejemplo, en respuesta al mensaje WM_DESTROY en el procedimiento de ventana principal). Una aplicación necesita llamar a WinHelp solo una vez para cancelar la ayuda, independientemente de cuántos archivos de ayuda haya abierto. La Ayuda de Windows permanece en ejecución hasta que todas las aplicaciones o dll hayan cancelado la ayuda.

Para cerrar la instancia de la tarjeta de entrenamiento de la Ayuda de Windows, debe especificar los comandos HELP_TCARD y HELP_QUIT al llamar a WinHelp. Una aplicación no necesita cancelar la instancia de la tarjeta de entrenamiento de la Ayuda de Windows si el usuario la cancela primero. La Ayuda de Windows notifica a una aplicación cuando el usuario cancela la instancia de la tarjeta de entrenamiento enviando el mensaje WM_TCARD con el parámetro wParam establecido en IDCLOSE.

Uso de la Ayuda

En esta sección se muestra cómo proporcionar ayuda contextual para un cuadro de diálogo y cómo establecer la apariencia de una ventana de Ayuda secundaria.

Proporcionar ayuda en un cuadro de diálogo

Para proporcionar ayuda contextual en un cuadro de diálogo, debe crear una matriz que consta de pares de valores DWORD . El primer valor de cada par es el identificador de un control en el cuadro de diálogo y el segundo es el identificador de contexto del tema de ayuda para el control. La matriz debe contener un par de identificadores para cada control del cuadro de diálogo.

El procedimiento del cuadro de diálogo debe procesar los mensajes WM_HELP y WM_CONTEXTMENU . El procedimiento del cuadro de diálogo recibe WM_HELP cuando el usuario presiona la tecla y WM_CONTEXTMENU cuando el usuario hace clic en el botón derecho del mouse.

El parámetro lParam de WM_HELP contiene la dirección de una estructura HELPINFO . El miembro hItemHandle de esta estructura identifica el control para el que el usuario ha solicitado ayuda. Debe pasar este identificador a la función WinHelp junto con el comando HELP_WM_HELP, el nombre del archivo de ayuda y un puntero a la matriz de identificadores. La función WinHelp busca en la matriz el identificador de control del control especificado y, a continuación, recupera el identificador de contexto de ayuda correspondiente. A continuación, la función pasa el identificador de contexto de ayuda a la Ayuda de Windows, que busca el tema correspondiente y lo muestra en una ventana emergente. Si el control tiene un identificador de -1, el sistema busca el siguiente control que es una tabulación y, a continuación, usa su identificador para buscar el identificador de contexto de ayuda. Por este motivo, es importante colocar texto estático antes de los controles en un archivo de recursos.

Al llamar a la función WinHelp , el procesamiento WM_CONTEXTMENU es similar al procesamiento de WM_HELP con estas dos excepciones:

  • Pase el parámetro wParam de WM_CONTEXTMENU, que es el identificador del control que envió el mensaje.
  • Especifique el comando HELP_CONTEXTMENU en lugar de HELP_WM_HELP.

El comando HELP_CONTEXTMENU hace que la Ayuda de Windows muestre un menú antes de mostrar el tema de ayuda. El menú está definido por el sistema. Permite al usuario mostrar ayuda para el control o mostrar el cuadro de diálogo Temas de ayuda .

En el ejemplo siguiente se muestra cómo implementar ayuda contextual en un cuadro de diálogo.

LRESULT CALLBACK EditDlgProc(HWND hwndDlg, UINT uMsg, 
                             WPARAM wParam, LPARAM lParam) 
{ 
    // Create an array of control identifiers and context identifiers. 
    static DWORD aIds[ ] = 
    { 
        ID_SAVE,   IDH_SAVE, 
        ID_DELETE, IDH_DELETE, 
        ID_COPY,   IDH_COPY, 
        ID_PASTE,  IDH_PASTE, 
        0,0 
    }; 

    switch (uMsg) 
    { 
        case WM_HELP: 
            WinHelp(((LPHELPINFO)lParam)->hItemHandle, "helpfile.hlp", 
                    HELP_WM_HELP, (DWORD)(LPSTR)aIds); 
            break; 

        case WM_CONTEXTMENU: 
            WinHelp((HWND)wParam, "helpfile.hlp", HELP_CONTEXTMENU, 
                    (DWORD)(LPVOID)aIds); 
            break; 
        
        // Process other messages here. 
    } 
    return FALSE; 
}

Establecer la apariencia de una ventana de ayuda secundaria

Una aplicación puede establecer el tamaño, la posición y mostrar el estado de una ventana de ayuda secundaria pasando el comando HELP_SETWINPOS y la dirección de una estructura HELPWININFO a la función WinHelp . Los miembros de HELPWININFO especifican el nombre de la ventana que se va a cambiar y el nuevo tamaño, posición y estado de presentación de la ventana.

En el ejemplo siguiente se establece la apariencia de una ventana secundaria denominada "wnd_menu". El nombre debe definirse en la sección [WINDOWS] del archivo del proyecto de ayuda.

BOOL DoWindowSize(VOID) 
{ 
    HANDLE hhwi; 
    LPHELPWININFO lphwi; 
    WORD wSize; 
    char *szWndName = "wnd_menu"; 
    size_t NameLength;      // Does not include the terminating null character
    HRESULT hr
    BOOL retval;

    hr = StringCbLengthA(szWndName, STRSAFE_MAX_CCH, &NameLength);
    
    if (SUCCEEDED(hr))
    {
        // Add 1 to account for the name string's terminating null character.
        NameLength++;
        
        // The HELPWININFO structure contains a minimal TCHAR array of size [2] 
        // that is used for the window name. Since sizeof(HELPWININFO) 
        // includes those two TCHARS, they must be subtracted from the 
        // total when adding the actual string length to calculate the  
        // size of the structure. 
        wSize = sizeof(HELPWININFO) - 2 + NameLength; 
    }
    else
        // Something's amiss with the string.
        return FALSE;
        
    hhwi  = GlobalAlloc(GHND, wSize); 
    lphwi = (LPHELPWININFO)GlobalLock(hhwi); 

    lphwi->wStructSize = wSize; 
    lphwi->x    = 256;      // horizontal position 
    lphwi->y    = 256;      // vertical position 
    lphwi->dx   = 767;      // width 
    lphwi->dy   = 512;      // height 
    lphwi->wMax = SW_SHOW;  // show the window 
    
    // secondary window
    hr = StringCbCopyA(lphwi->rgchMember, sizeof(lphwi->rgchMember), szWndName);
    
    if (SUCCEEDED(hr))
    {
        WinHelp(hwnd, "myhelp.hlp", HELP_SETWINPOS, (DWORD)lphwi); 
     
        GlobalUnlock(hhwi); 
        GlobalFree(hhwi); 

        return TRUE; 
    }
    else
        // There was a problem copying the window name.
        return FALSE;
}