Share via


Extensión de menús contextuales

Hacer clic con el botón derecho en un objeto normalmente hace que se muestre un menú contextual. Este menú contiene una lista de comandos que el usuario puede seleccionar para realizar diversas acciones en el objeto. Esta sección es una introducción a los menús contextuales de los objetos del sistema de archivos.

La información adicional está disponible aquí:

Menús contextuales para objetos del sistema de archivos

Cuando un usuario hace clic con el botón derecho en un objeto, como un archivo, que se muestra en el Explorador de Windows o en el escritorio, aparece un menú contextual con una lista de comandos. A continuación, el usuario puede realizar una acción en el archivo, como abrirlo o eliminarlo, seleccionando el comando adecuado.

Dado que a menudo se usan menús contextuales para la administración de archivos, shell proporciona un conjunto de comandos predeterminados, como Cortar y copiar, que aparecen en el menú contextual de cualquier archivo. Tenga en cuenta que aunque Open With es un comando predeterminado, no se muestra para algunos tipos de archivo estándar, como .wav. En la siguiente ilustración del directorio Mis documentos de ejemplo, que también se usó como ejemplo en Personalizar iconos, se muestra un menú contextual predeterminado que se mostró haciendo clic con el botón derecho en MyDocs4.xyz.

captura de pantalla del menú contextual predeterminado para objetos del sistema de archivos

El motivo por el que MyDocs4.xyz muestra un menú contextual predeterminado es que no es miembro de un tipo de archivo registrado. Por otro lado, .txt es un tipo de archivo registrado. Si hace clic con el botón derecho en uno de los archivos de .txt, en su lugar verá un menú contextual con dos comandos adicionales en su sección superior: Abrir e Imprimir.

captura de pantalla del menú contextual personalizado para objetos del sistema de archivos

Una vez registrado un tipo de archivo, puede ampliar su menú contextual con comandos adicionales. Se muestran encima de los comandos predeterminados cuando se hace clic con el botón derecho en cualquier archivo de ese tipo. Aunque la mayoría de los comandos agregados de esta manera son comunes, como Imprimir o Abrir, puede agregar cualquier comando que un usuario pueda resultar útil.

Todo lo que es necesario para extender el menú contextual de un tipo de archivo es crear una entrada del Registro para cada comando. Un enfoque más sofisticado es implementar un controlador de menú contextual, que permite ampliar el menú contextual de un tipo de archivo en un archivo por archivo. Para obtener más información, vea Crear controladores de menú contextual.

Verbos del menú contextual

Cada comando del menú contextual se identifica en el Registro por su verbo. Estos verbos son los mismos que los que usa ShellExecuteEx al iniciar aplicaciones mediante programación. Para obtener más información sobre el uso de ShellExecuteEx, consulte la discusión sobre el inicio de aplicaciones.

Un verbo es una cadena de texto simple que usa shell para identificar el comando asociado. Cada verbo corresponde a la cadena de comandos que se usa para iniciar el comando en una ventana de consola o en un archivo por lotes (.bat). Por ejemplo, el verbo abierto normalmente inicia un programa para abrir un archivo. Su cadena de comandos suele tener un aspecto similar al siguiente:

"My Program.exe" "%1"

"%1" es el marcador de posición estándar de un parámetro de línea de comandos proporcionado con el nombre de archivo. Por ejemplo, puede especificar una página determinada para mostrarla en una vista con pestañas.

Nota

Si algún elemento de la cadena de comandos contiene o puede contener espacios, debe ir entre comillas. De lo contrario, si el elemento contiene un espacio, no se analizará correctamente. Por ejemplo, "Mi Program.exe" iniciará la aplicación correctamente. Si usa Mi Program.exe, el sistema intentará iniciar "My" con "Program.exe" como primer argumento de línea de comandos. Siempre debe usar comillas con argumentos como "%1" expandidos a cadenas por shell, ya que no puede estar seguro de que la cadena no contendrá un espacio.

 

Los verbos también pueden tener asociada una cadena de visualización , que se muestra en el menú contextual en lugar de la propia cadena de verbo. Por ejemplo, la cadena de presentación de openas es Open With. Al igual que las cadenas de menú normales, incluida una y comercial (&) en la cadena de presentación permite la selección de teclado del comando.

Verbos canónicos

En general, las aplicaciones son responsables de proporcionar cadenas de visualización localizadas para los verbos que definen. Sin embargo, para proporcionar un grado de independencia del lenguaje, el sistema define un conjunto estándar de verbos usados comúnmente denominados verbos canónicos. Un verbo canónico se puede usar con cualquier idioma y el sistema genera automáticamente una cadena de visualización localizada correctamente. Por ejemplo, la cadena de presentación del verbo abierto se establecerá en Abrir en un sistema inglés y en Öffnen en un sistema alemán.

Los verbos canónicos incluyen:

Valor Descripción
abrir Abre el archivo o la carpeta.
opennew Abre el archivo o la carpeta en una nueva ventana.
imprimir Imprime el archivo.
explore Abre el Explorador de Windows con la carpeta seleccionada.
find Abre el cuadro de diálogo Búsqueda de Windows con la carpeta establecida como ubicación de búsqueda predeterminada.
openas Abre el cuadro de diálogo Abrir con .
properties Abre la hoja de propiedades del objeto.

 

El verbo printto también es canónico, pero nunca se muestra. Permite al usuario imprimir un archivo arrastrándolo a un objeto de impresora.

Verbos extendidos

Cuando el usuario hace clic con el botón derecho en un objeto, el menú contextual contiene todos los verbos normales. Sin embargo, podría haber comandos que quiera admitir, pero que no se hayan mostrado en todos los menús contextuales. Por ejemplo, podría tener comandos que no se usan normalmente o que están diseñados para usuarios experimentados. Por este motivo, también puede definir uno o varios verbos extendidos. Estos verbos también son cadenas de caracteres y son similares a los verbos normales. Se distinguen de verbos normales por la forma en que se registran. Para tener acceso a los comandos asociados a verbos extendidos, el usuario debe hacer clic con el botón derecho en un objeto mientras presiona la tecla MAYÚS. Los verbos extendidos se mostrarán junto con los verbos normales.

Extensión del menú contextual de un tipo de archivo

La manera más sencilla de extender el menú contextual de un tipo de archivo es con el Registro. Para ello, agregue una subclave shell debajo de la clave para el ProgID de la aplicación asociada al tipo de archivo. Opcionalmente, puede definir un verbo predeterminado para el tipo de archivo haciendo que sea el valor predeterminado de la subclave shell .

El verbo predeterminado se muestra primero en el menú contextual. Su propósito es proporcionar al Shell un verbo que puede usar cuando se llama a ShellExecuteEx , pero no se especifica ningún verbo. Shell no selecciona necesariamente el verbo predeterminado cuando shellExecuteEx se usa de esta manera. En el caso de las versiones 5.0 y posteriores de Shell, que se encuentran en los sistemas Windows 2000 y versiones posteriores, shell usa el primer verbo disponible de la lista siguiente. Si no hay ninguno disponible, se produce un error en la operación.

  • Verbo abierto
  • Verbo predeterminado
  • Primer verbo del Registro
  • Verbo openwith

Para las versiones de Shell anteriores a la versión 5.0, omita el tercer elemento.

Debajo de la subclave shell , cree una subclave para cada verbo que quiera agregar. Cada una de estas subclaves tendrá un valor REG_SZ establecido en la cadena de visualización del verbo. Puede omitir la cadena de presentación de verbos canónicos porque el sistema mostrará automáticamente una cadena localizada correctamente. Si omite la cadena de presentación de verbos nocanonicos, se mostrará la cadena de verbo. Para cada subclave de verbo, cree una subclave de comando con el valor predeterminado establecido en la cadena de comandos.

En la ilustración siguiente se muestra un menú contextual para el tipo de archivo .myp usado en Tipos de archivo y Personalización de iconos. Ahora tiene verbos abiertos, doit, print e printto en su menú contextual, con doit como verbo predeterminado. El menú contextual tiene este aspecto.

captura de pantalla del menú contextual personalizado

Las entradas del Registro usadas para ampliar el menú contextual que se muestra en la ilustración anterior son:

HKEY_CLASSES_ROOT
   .myp
      (Default) = MyProgram.1
   MyProgram.1
      (Default) = MyProgram Application
      Shell
         (Default) = doit
         open
            command
               (Default) = C:\MyDir\MyProgram.exe "%1"
         doit
            (Default) = &Do It
            command
               (Default) = C:\MyDir\MyProgram.exe /d "%1"
         print
            command
               (Default) = C:\MyDir\MyProgram.exe /p "%1"
         printto
            command
               (Default) = C:\MyDir\MyProgram.exe /p "%1" "%2" %3 %4

Aunque el comando Abrir con está por encima del primer separador, el sistema lo crea automáticamente y no requiere una entrada del Registro. El sistema crea automáticamente nombres para mostrar para los verbos canónicos abiertos e impresos. Dado que doit no es un verbo canónico, se le asigna un nombre para mostrar, "&Do It", que se puede seleccionar presionando la tecla D. El verbo printto no aparece en el menú contextual, pero lo incluye permite al usuario imprimir archivos si los coloca en un icono de impresora. En este ejemplo, %1 representa el nombre de archivo y %2 el nombre de la impresora.

Los verbos se pueden suprimir mediante la configuración de directiva agregando un valor SuppressPolicy a la clave del verbo. Establezca el valor de SuppressionPolicy en el identificador de directiva. Si la directiva está activada, se suprime el verbo y su entrada de menú contextual asociado. Para conocer los posibles valores de identificador de directiva, consulte la enumeración RESTRICTIONS .

Extensión del menú contextual para objetos de shell predefinidos

Muchos objetos shell predefinidos tienen menús contextuales que se pueden extender. Registre el comando de la misma manera que registra los tipos de archivo típicos, pero use el nombre del objeto predefinido como nombre de tipo de archivo.

Puede encontrar una lista de objetos predefinidos en la sección Objetos de shell predefinidos de Creación de controladores de extensión de Shell. Los objetos shell predefinidos cuyos menús contextuales se pueden extender agregando verbos en el Registro se marcan en la tabla con la palabra "Verbo".

Registro de una aplicación para controlar tipos de archivo arbitrarios

En las secciones anteriores de este documento se ha explicado cómo definir elementos de menú contextual para un tipo de archivo determinado. Entre otras cosas, definir el menú contextual permite especificar cómo abre la aplicación asociada un miembro del tipo de archivo. Sin embargo, como se describe en Tipos de archivo, las aplicaciones también pueden registrar un procedimiento predeterminado independiente que se usará cuando un usuario intenta usar la aplicación para abrir un tipo de archivo que no haya asociado a la aplicación. Este tema se describe aquí porque registra el procedimiento predeterminado de la misma manera que registra los elementos de menú contextual.

El procedimiento predeterminado sirve para dos propósitos básicos. Uno es especificar cómo se debe invocar la aplicación para abrir un tipo de archivo arbitrario. Por ejemplo, podría usar una marca de línea de comandos para indicar que se está abriendo un tipo de archivo desconocido. El otro propósito es definir las diversas características de un tipo de archivo, como los elementos del menú contextual y el icono. Si un usuario asocia la aplicación con un tipo de archivo adicional, ese tipo tendrá estas características. Si el tipo de archivo adicional estaba asociado anteriormente a otra aplicación, estas características reemplazarán a los originales.

Para registrar el procedimiento predeterminado, coloque las mismas claves del Registro que creó para el ProgID de la aplicación en la subclave de la aplicación de HKEY_CLASSES_ROOT\Aplicaciones. También puede incluir un valor FriendlyAppName para proporcionar al sistema un nombre descriptivo para la aplicación. El nombre descriptivo de la aplicación también se puede extraer de su archivo ejecutable, pero solo si el valor FriendlyAppName no está presente. El siguiente fragmento del Registro muestra un procedimiento predeterminado de ejemplo para MyProgram.exe que define un nombre descriptivo y varios elementos de menú contextual. Las cadenas de comandos incluyen la marca /a para notificar a la aplicación que está abriendo un tipo de archivo arbitrario. Si incluye una subclave DefaultIcon , debe usar un icono genérico.

HKEY_CLASSES_ROOT
   Applications
      MyProgram.exe
         FriendlyAppName = Friendly Name
         shell
            open
               command
                  (Default) = C:\MyDir\MyProgram.exe /a "%1"
            print
               command
                  (Default) = C:\MyDir\MyProgram.exe /a /p "%1"
            printto
               command
                  (Default) = C:\MyDir\MyProgram.exe /a /p "%1" "%2" %3 %4

Extensión del submenú Nuevo

Cuando un usuario abre el menú Archivo en el Explorador de Windows, el primer comando es Nuevo. Al seleccionar este comando se muestra un submenú. De forma predeterminada, contiene dos comandos, Carpeta y Acceso directo, que permiten a los usuarios crear subcarpetas y accesos directos. Este submenú se puede extender para incluir comandos de creación de archivos para cualquier tipo de archivo.

Para agregar un comando de creación de archivos al submenú Nuevo , los archivos de la aplicación deben tener un tipo de archivo asociado. Incluya una subclave ShellNew en la clave de la extensión de nombre de archivo. Cuando se selecciona el comando Nuevo del menú Archivo, el Shell lo agregará al submenú Nuevo. La cadena de presentación del comando será la cadena descriptiva que se asigna al ProgID del programa.

Asigne uno o varios valores de datos a la subclave ShellNew para especificar el método de creación de archivos. A continuación se muestran los valores disponibles.

Valor Descripción
Comando Ejecuta una aplicación. Se trata de un valor de REG_SZ que especifica la ruta de acceso de la aplicación que se va a ejecutar. Por ejemplo, puede establecerlo para iniciar un asistente.
data Crea un archivo que contiene los datos especificados. Los datos son un valor de REG_BINARY con los datos del archivo. Los datos se omiten si se especifica NullFile o FileName.
FileName Crea un archivo que es una copia de un archivo especificado. FileName es un valor de REG_SZ , establecido en la ruta de acceso completa del archivo que se va a copiar.
NullFile Crea un archivo vacío. NullFile no tiene asignado un valor. Si se especifica NullFile, se omiten los valores Data y FileName.

 

En la ilustración siguiente se muestra el submenú Nuevo para el tipo de archivo .myp que se usa como ejemplo en Tipos de archivo y Personalización de iconos. Ahora tiene un comando, MyProgram Application. Cuando un usuario selecciona MyProgram Application en el submenú Nuevo , el Shell crea un archivo denominado "New MyProgram Application.myp" y lo pasa a MyProgram.exe.

captura de pantalla del menú nuevo personalizado

La entrada del Registro ahora es la siguiente:

HKEY_CLASSES_ROOT
   .myp
      (Default) = MyProgram.1
      MyProgram.1
         ShellNew
            NullFile
   MyProgram.1
      (Default) = MyProgram Application
      DefaultIcon
         (Default) = C:\MyDir\MyProgram.exe,2
      Shell
         (Default) = doit
         open
            command
               (Default) = C:\MyDir\MyProgram.exe "%1"
         doit
            (Default) = &Do It
            command
               (Default) = C:\MyDir\MyProgram.exe /d "%1"
         print
            command
               (Default) = C:\MyDir\MyProgram.exe /p "%1"
         printto
            command
               (Default) = C:\MyDir\MyProgram.exe /p "%1" "%2" %3 %4