Compartir a través de


Creación de controladores de menús contextuales

Los controladores de menú contextual, también conocidos como controladores de menú contextual o controladores de verbos, son un tipo de controlador de tipo de archivo. Estos controladores se pueden implementar de una manera que les haga cargar en su propio proceso o en el explorador, u otros procesos de terceros. Tenga cuidado al crear controladores en proceso, ya que pueden causar daños en el proceso que los carga.

Nota:

Hay consideraciones especiales para las versiones basadas en 64 bits de Windows al registrar controladores que funcionan en el contexto de aplicaciones de 32 bits: cuando se invoca en el contexto de una aplicación de bits diferente, el subsistema WOW64 redirige el acceso del sistema de archivos a algunas rutas de acceso. Si el controlador .exe se almacena en una de esas rutas de acceso, no es accesible en este contexto. Por lo tanto, como solución alternativa, almacene el .exe en una ruta de acceso que no se redirija o almacene una versión de código auxiliar del .exe que inicie la versión real.

Este tema se organiza de la siguiente manera:

Verbos canónicos

Las aplicaciones suelen ser 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 nunca se muestra al usuario y se puede usar con cualquier lenguaje de interfaz de usuario. El sistema usa el nombre canónico para generar automáticamente una cadena de visualización localizada correctamente. Por ejemplo, la cadena de presentación del verbo abierto se establece en Abrir en un sistema inglés y en el equivalente alemán en un sistema alemán.

Verbo canónico Descripción
Abierta Abre el archivo o la carpeta.
Abrirnuevo Abre el archivo o la carpeta en una nueva ventana.
Imprimir Imprime el archivo.
Printto Permite al usuario imprimir un archivo arrastrándolo a un objeto de impresora.
Explorar Abre el Explorador de Windows con la carpeta seleccionada.
Propiedades Abre la hoja de propiedades del objeto.

Nota:

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

Los controladores de menú contextual pueden proporcionar sus propios verbos canónicos a través de IContextMenu::GetCommandString con GCS_VERBW o GCS_VERBA. El sistema usará los verbos canónicos como segundo parámetro (lpOperation) pasado a ShellExecute y es el CMINVOKECOMMANDINFO.miembro lpVerb pasado al método IContextMenu::InvokeCommand.

Verbos extendidos

Cuando el usuario hace clic con el botón derecho en un objeto, el menú contextual muestra los verbos predeterminados. Es posible que desee agregar y admitir comandos en algunos menús contextuales que no se muestran 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 son similares a los verbos normales, pero se distinguen de los verbos normales de la manera en que se registran. Para tener acceso a verbos extendidos, el usuario debe hacer clic con el botón derecho en un objeto mientras presiona la tecla MAYÚS. Cuando el usuario lo hace, se muestran los verbos extendidos además de los verbos predeterminados.

Puede usar el Registro para definir uno o varios verbos extendidos. Los comandos asociados solo se mostrarán cuando el usuario haga clic con el botón derecho en un objeto mientras presiona la tecla MAYÚS. Para definir un verbo como extendido, agregue un valor "extendido" REG_SZ al subclave del verbo. El valor no debe tener ningún dato asociado.

Solo verbos de acceso mediante programación

Estos verbos nunca se muestran en un menú contextual. Se puede acceder a ellos mediante ShellExecuteEx y especificando el campo lpVerb del parámetro pExecInfo (un objeto SHELLEXECUTEINFO ). Para definir un verbo como acceso mediante programación, agregue un valor "ProgrammaticAccessOnly" REG_SZ a la subclave del verbo. El valor no debe tener ningún dato asociado.

Puede usar el Registro para definir uno o varios verbos extendidos. Los comandos asociados solo se mostrarán cuando el usuario haga clic con el botón derecho en un objeto mientras presiona la tecla MAYÚS. Para definir un verbo como extendido, agregue un valor "extendido" REG_SZ al subclave del verbo. El valor no debe tener ningún dato asociado.

Personalización de un menú contextual mediante verbos estáticos

Después de elegir un verbo estático o dinámico para el menú contextual, puede ampliar el menú contextual de un tipo de archivo registrando un verbo estático para el tipo de archivo. Para ello, agregue una subclave shell debajo de la subclave del ProgID de la aplicación asociada al tipo de archivo. Opcionalmente, puede definir un verbo predeterminado para el tipo de archivo si lo convierte en 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 la función ShellExecuteEx , pero no se especifica ningún verbo. Shell no selecciona necesariamente el verbo predeterminado cuando shellExecuteEx se usa de esta manera.

Shell usa el primer verbo disponible en el orden siguiente:

  1. Verbo predeterminado
  2. Primer verbo del Registro, si se especifica el orden del verbo.
  3. El verbo Open
  4. El verbo Abrir con

Si ninguno de los verbos enumerados está disponible, se produce un error en la operación.

Cree una subclave para cada verbo que quiera agregar en la subclave shell. Cada una de estas subclaves debe tener un valor REG_SZ establecido en la cadena de visualización del verbo (cadena localizada). Para cada subclave de verbo, cree una subclave de comando con el valor predeterminado establecido en la línea de comandos para activar los elementos. En el caso de verbos canónicos, como Open e Print, puede omitir la cadena de visualización porque el sistema muestra automáticamente una cadena localizada correctamente. En el caso de verbos nocanonicos, si se omite la cadena para mostrar, se muestra la cadena de verbo.

En el ejemplo del Registro siguiente, tenga en cuenta que:

  • Dado que Doit no es un verbo canónico, se le asigna un nombre para mostrar, que se puede seleccionar presionando la tecla D.
  • El verbo Printto no aparece en el menú contextual. Sin embargo, su inclusión en el Registro permite al usuario imprimir archivos colocandolos en un icono de impresora.
  • Se muestra una subclave para cada verbo. %1 representa el nombre de archivo y %2 el nombre de la impresora.
HKEY_CLASSES_ROOT
   .myp-ms
      (Default) = MyProgram.1
   MyProgram.1
      (Default) = My Program Application
      Shell
         (Default) = doit
         doit
            (Default) = &Do It
            command
               (Default) = c:\MyDir\MyProgram.exe /d "%1"
         open
            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"

En el diagrama siguiente se muestra la extensión del menú contextual de acuerdo con las entradas del Registro anteriores. Este menú contextual tiene verbos Abrir, Hacer e Imprimir en su menú, con Do It como verbo predeterminado.

captura de pantalla del menú contextual de verbo predeterminado

Activación del controlador mediante la interfaz IDropTarget

El intercambio dinámico de datos (DDE) está en desuso; use IDropTarget en su lugar. IDropTarget es más sólido y tiene una mejor compatibilidad con la activación porque usa la activación COM del controlador. En el caso de la selección de varios elementos, IDropTarget no está sujeto a las restricciones de tamaño de búfer que se encuentran en DDE y CreateProcess. Además, los elementos se pasan a la aplicación como un objeto de datos que se puede convertir en una matriz de elementos mediante la función SHCreateShellItemArrayFromDataObject. Esto es más sencillo y no pierde la información del espacio de nombres tal como ocurre cuando el elemento se convierte en una ruta de acceso para los protocolos de línea de comandos o DDE.

Para obtener más información sobre las consultas de IDropTarget y Shell para los atributos de asociación de archivos, vea Tipos percibidos y registro de aplicaciones.

Especificar la posición y el orden de los verbos estáticos

Normalmente, los verbos se ordenan en un menú contextual en función de cómo se enumeran; la enumeración se basa primero en el orden de la matriz de asociación y, a continuación, en el orden de los elementos de la matriz de asociación, tal como se define en el criterio de ordenación del registro.

Los verbos se pueden ordenar especificando el valor predeterminado de la subclave shell para la entrada de asociación. Este valor predeterminado puede incluir un solo elemento, que se mostrará en la posición superior del menú contextual o una lista de elementos separados por espacios o comas. En este último caso, el primer elemento de la lista es el elemento predeterminado y los otros verbos se muestran inmediatamente debajo del orden especificado.

Por ejemplo, la siguiente entrada del Registro genera verbos de menú contextual en el orden siguiente:

  1. Mostrar
  2. Gadgets
  3. Personalización
HKEY_CLASSES_ROOT
   DesktopBackground
      Shell
         Display
         Gadgets
         Personalization

Del mismo modo, la siguiente entrada del Registro genera verbos de menú contextual en el orden siguiente:

  1. Personalización
  2. Gadgets
  3. Mostrar
HKEY_CLASSES_ROOT
   DesktopBackground
      Shell = "Personalization,Gadgets"
      Display

Posicionamiento de verbos en la parte superior o inferior del menú

El siguiente atributo del Registro se puede usar para colocar un verbo en la parte superior o inferior del menú. Si hay varios verbos que especifican este atributo, el último para hacerlo obtiene prioridad:

Position=Top | Bottom 

Crear menús estáticos en cascada

En Windows 7 y versiones posteriores, se admite la implementación del menú en cascada a través de la configuración del Registro. Antes de Windows 7, la creación de menús en cascada solo era posible a través de la implementación de la interfaz IContextMenu. En Windows 7 y versiones posteriores, debes recurrir a soluciones basadas en código COM solo cuando los métodos estáticos no sean suficientes.

La captura de pantalla siguiente proporciona un ejemplo de un menú en cascada.

captura de pantalla que muestra un ejemplo de un menú en cascada

En Windows 7 y versiones posteriores, hay tres maneras de crear menús en cascada:

Crear menús en cascada con la entrada del Registro SubCommands

En Windows 7 y versiones posteriores, puedes usar la entrada SubCommands para crear menús en cascada mediante el procedimiento siguiente.

Para crear un menú en cascada mediante la entrada SubCommands

  1. Cree una subclave en HKEY_CLASSES_ROOT\shell de ProgID\para representar el menú en cascada. En este ejemplo, asignamos a esta subclave el nombre CascadeTest. Asegúrese de que el valor predeterminado de la subclave CascadeTest esté vacío y que se muestre como (valor no establecido).

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest
                (Default)
    
  2. En la subclave CascadeTest , agregue una entrada MUIVerb de tipo REG_SZ y asígnele el texto que aparecerá como su nombre en el menú contextual. En este ejemplo, se le asigna "Test Cascade Menu".

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest
                (Default)
                MUIVerb = Test Cascade Menu
    
  3. En la subclave CascadeTest , agregue una entrada SubCommands de tipo REG_SZ que se asigna a la lista, delimitada por punto y coma, de los verbos que deben aparecer en el menú, en el orden de apariencia. Por ejemplo, aquí asignamos un número de verbos proporcionados por el sistema:

    HKEY_CLASSES_ROOT
       *
          Shell
             CascadeTest
                SubCommands
                Windows.delete;Windows.properties;Windows.rename;Windows.cut;Windows.copy;Windows.paste
    
  4. En el caso de verbos personalizados, impleméntelos mediante cualquiera de los métodos de implementación de verbo estáticos y enumerelos en la subclave CommandStore, como se muestra en este ejemplo para un verbo ficticio VerbName:

    HKEY_LOCAL_MACHINE
       Software
          Microsoft
             Windows
                CurrentVersion
                   Explorer
                      CommandStore
                         Shell
                            VerbName
                            command
                               (Default) = notepad.exe %1
    

Nota:

Este método tiene la ventaja de que los verbos personalizados se pueden registrar una vez y reutilizarlos enumerando el nombre del verbo en la entrada SubCommands. Sin embargo, requiere que la aplicación tenga permiso para modificar el registro en HKEY_LOCAL_MACHINE.

 

Crear menús en cascada con la entrada del Registro ExtendedSubCommandsKey

En Windows 7 y versiones posteriores, puedes usar la entrada ExtendedSubCommandKey para crear menús extendidos en cascada: menús en cascada dentro de menús en cascada.

La captura de pantalla siguiente es un ejemplo de un menú en cascada extendido.

captura de pantalla que muestra el menú en cascada extendido para dispositivos

Dado que HKEY_CLASSES_ROOT es una combinación de HKEY_CURRENT_USER y HKEY_LOCAL_MACHINE, puede registrar cualquier verbo personalizado en la subclave clases de software de HKEY_CURRENT_USER\\. La principal ventaja de hacerlo es que no se requiere el permiso con privilegios elevados. Además, otras asociaciones de archivos pueden reutilizar todo este conjunto de verbos especificando la misma subclave ExtendedSubCommandsKey. Si no necesita volver a usar este conjunto de verbos, puede enumerar los verbos en el elemento primario, pero asegurarse de que el valor predeterminado del elemento primario está vacío.

Para crear un menú en cascada mediante una entrada ExtendedSubCommandsKey

  1. Cree una subclave en HKEY_CLASSES_ROOT\shell de ProgID\para representar el menú en cascada. En este ejemplo, asignamos a esta subclave el nombre CascadeTest2. Asegúrese de que el valor predeterminado de la subclave CascadeTest esté vacío y que se muestre como (valor no establecido).

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest2
                (Default)
    
  2. En la subclave CascadeTest , agregue una entrada MUIVerb de tipo REG_SZ y asígnele el texto que aparecerá como su nombre en el menú contextual. En este ejemplo, se le asigna "Test Cascade Menu".

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest
                (Default)
                MUIVerb = Test Cascade Menu 2
    
  3. En la subclave CascadeTest que ha creado, agregue una subclave ExtendedSubCommandsKey y agregue los subcomandos del documento (de REG_SZ tipo); por ejemplo:

    HKEY_CLASSES_ROOT
       txtfile
          Shell
             Test Cascade Menu 2
                (Default)
                ExtendedSubCommandsKey
                   Layout
                   Properties
                   Select all
    

    Asegúrese de que el valor predeterminado de la subclave Menú de cascada de prueba 2 está vacío y se muestra como (valor no establecido).

  4. Rellene los subverbs mediante cualquiera de las siguientes implementaciones de verbo estático. Tenga en cuenta que la subclave CommandFlags representa valores EXPCMDFLAGS. Si desea agregar un separador antes o después del elemento de menú en cascada, use ECF_SEPARATORBEFORE (0x20) o ECF_SEPARATORAFTER (0x40). Para obtener una descripción de estas marcas de Windows 7 y posteriores, consulta IExplorerCommand::GetFlags. ECF_SEPARATORBEFORE solo funciona para los elementos de menú de nivel superior. MUIVerb es de tipo REG_SZ y CommandFlags es de tipo REG_DWORD.

    HKEY_CLASSES_ROOT
       txtile
          Shell
             Test Cascade Menu 2
                (Default)
                ExtendedSubCommandsKey
                   Shell
                      cmd1
                         MUIVerb = Notepad
                         command
                            (Default) = %SystemRoot%\system32\notepad.exe %1
                      cmd2
                         MUIVerb = Wordpad
                         CommandFlags = 0x20
                         command
                            (Default) = "C:\Program Files\Windows NT\Accessories\wordpad.exe" %1
    

La captura de pantalla siguiente es una ilustración de los ejemplos de entrada de clave del Registro anteriores.

captura de pantalla que muestra un ejemplo de un menú en cascada que muestra las opciones del Bloc de notas y el bloc de palabras

Crear menús en cascada con la interfaz IExplorerCommand

Otra opción para agregar verbos a un menú en cascada es a través de IExplorerCommand::EnumSubCommands. Este método permite que los orígenes de datos que proporcionen sus comandos de módulo de comandos a través de IExplorerCommandProvider usen esos comandos como verbos en un menú contextual. En Windows 7 y versiones posteriores, puedes proporcionar la misma implementación de verbo mediante IExplorerCommand que puedes con IContextMenu.

Las dos capturas de pantalla siguientes muestran el uso de menús en cascada en la carpeta Dispositivos .

Captura de pantalla que muestra un ejemplo de un menú en cascada en la carpeta devices.

La captura de pantalla siguiente muestra otra implementación de un menú en cascada en la carpeta Dispositivos .

captura de pantalla que muestra un ejemplo de un menú en cascada en la carpeta devices

Nota:

Dado que IExplorerCommand solo admite la activación en proceso, se recomienda usar los orígenes de datos de Shell que necesitan compartir la implementación entre comandos y menús contextuales.

 

Obtención del comportamiento dinámico para verbos estáticos mediante la sintaxis de consulta avanzada

Advanced Query Syntax (AQS) puede expresar una condición que se evaluará mediante propiedades del elemento para el que se crea una instancia del verbo. Este sistema solo funciona con propiedades rápidas. Estas son propiedades que el origen de datos de Shell notifica tan rápido al no devolver SHCOLSTATE_SLOW desde IShellFolder2::GetDefaultColumnState.

Windows 7 y versiones posteriores admiten valores canónicos que evitan problemas en compilaciones localizadas. Se requiere la siguiente sintaxis canónica en compilaciones localizadas para aprovechar esta mejora de Windows 7.

System.StructuredQueryType.Boolean#True

En la entrada del Registro de ejemplo siguiente:

  • El valor AppliesTo controla si el verbo se muestra u oculta.
  • El valor DefaultAppliesTo controla qué verbo es el valor predeterminado.
  • El valor HasLUAShield controla si se muestra un escudo de Control de cuentas de usuario (UAC).

En este ejemplo, el valor DefaultAppliesTo hace que este verbo sea el valor predeterminado para cualquier archivo con la palabra "exampleText1" en su nombre de archivo. El valor AppliesTo habilita el verbo para cualquier archivo con "exampleText1" en el nombre. El valor hasLUAShield muestra el escudo de los archivos con "exampleText2" en el nombre.

HKEY_CLASSES_ROOT
   txtile
      shell
         test.verb
            DefaultAppliesTo = System.ItemName:"exampleText1"
            HasLUAShield = System.ItemName:"exampleText2"
            AppliesTo = System.ItemName:"exampleText1"

Agregue la subclave Command y un valor:

HKEY_CLASSES_ROOT
   txtile
      shell
         test.verb
            Command
               (Default) = %SystemRoot%\system32\notepad.exe %1

En el Registro de Windows 7, consulte HKEY_CLASSES_ROOT\unidad como ejemplo de verbos de Bitlocker que emplean el siguiente enfoque:

  • AppliesTo = System.Volume.BitlockerProtection:=2
  • System.Volume.BitlockerRequiresAdmin:=System.StructuredQueryType.Boolean#True

Para obtener más información sobre AQS, consulte Sintaxis de consulta avanzada.

En desuso: Asociación de verbos con comandos dinámicos de Intercambio de datos

DDE está en desuso; use IDropTarget en su lugar. DDE está en desuso porque se basa en un mensaje de ventana de difusión para detectar el servidor DDE. Un servidor DDE bloquea el mensaje de ventana de difusión y, por tanto, bloquea las conversaciones de DDE para otras aplicaciones. Es habitual que una sola aplicación bloqueada provoque bloqueos posteriores en toda la experiencia del usuario.

El método IDropTarget es más sólido y tiene una mejor compatibilidad con la activación porque usa la activación COM del controlador. En el caso de la selección de varios elementos, IDropTarget no está sujeto a las restricciones de tamaño de búfer que se encuentran en DDE y CreateProcess. Además, los elementos se pasan a la aplicación como un objeto de datos que se puede convertir en una matriz de elementos mediante la función SHCreateShellItemArrayFromDataObject. Esto es más sencillo y no pierde la información del espacio de nombres tal como ocurre cuando el elemento se convierte en una ruta de acceso para los protocolos de línea de comandos o DDE.

Para obtener más información sobre las consultas de IDropTarget y Shell para los atributos de asociación de archivos, vea Tipos percibidos y registro de aplicaciones.

Completar tareas de implementación de verbos

Las siguientes tareas para implementar verbos son relevantes para las implementaciones de verbo estáticos y dinámicos. Para obtener más información sobre los verbos dinámicos, vea Personalización de un menú contextual mediante verbos dinámicos.

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

Muchos objetos shell predefinidos tienen menús contextuales que se pueden personalizar. 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.

Una lista de objetos predefinidos se encuentra 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 personalizar agregando verbos en el Registro se marcan en la tabla con la palabra Verbo.

Extensión de un nuevo submenú

Cuando un usuario abre el menú Archivo en el Explorador de Windows, uno de los comandos mostrados es Nuevo. Al seleccionar este comando se muestra un submenú. De forma predeterminada, el submenú 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 el nombre de archivo. Cuando se selecciona el comando Nuevo del menú Archivo, shell agrega el tipo de archivo al submenú Nuevo. La cadena de presentación del comando es la cadena descriptiva que se asigna al ProgID del programa.

Para especificar el método de creación de archivos, asigne uno o varios valores de datos a la subclave ShellNew . Los valores disponibles se enumeran en la tabla siguiente.

Valor de subclave ShellNew Descripción
Comando Ejecuta una aplicación. Este valor REG_SZ 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. Este valor REG_BINARY especifica 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. Este valor REG_SZ especifica la ruta de acceso completa del archivo que se va a copiar.
NullFile Crea un archivo vacío. NullFile no tiene asignado ningún valor. Si se especifica NullFile , se omiten los valores del Registro Data y FileName .

 

En el siguiente ejemplo de clave del Registro y captura de pantalla se muestra el submenú Nuevo para el tipo de archivo .myp-ms. Tiene un comando, Aplicación MyProgram.

HKEY_CLASSES_ROOT
   .myp
      (Default) = MyProgram.1
      MyProgram.1
         ShellNew
         NullFile

La captura de pantalla muestra el submenú Nuevo . Cuando un usuario selecciona Aplicación MyProgram en el submenú Nuevo , shell crea un archivo denominado New MyProgram Application.myp-ms y lo pasa a MyProgram.exe.

Captura de pantalla del explorador de Windows que muestra un nuevo comando

Creación de controladores de arrastrar y colocar

El procedimiento básico para implementar un controlador de arrastrar y colocar es el mismo que para los controladores de menú contextual convencionales. Sin embargo, los controladores de menú contextual suelen usar solo el puntero IDataObject pasado al método IShellExtInit::Initialize del controlador para extraer el nombre del objeto. Un controlador de arrastrar y colocar podría implementar un controlador de datos más sofisticado para modificar el comportamiento del objeto arrastrado.

Cuando un usuario hace clic con el botón derecho en un objeto Shell para arrastrar un objeto, se muestra un menú contextual cuando el usuario intenta colocar el objeto. En la captura de pantalla siguiente se muestra un menú contextual típico de arrastrar y colocar.

captura de pantalla del menú contextual de arrastrar y colocar

Un controlador de arrastrar y colocar es un controlador de menú contextual que puede agregar elementos a este menú contextual. Los controladores de arrastrar y colocar normalmente se registran en la siguiente subclave.

HKEY_CLASSES_ROOT
   Directory
      shellex
         DragDropHandlers

Agregue una subclave bajo la subclave DragDropHandlers denominada para el controlador de arrastrar y colocar y establezca el valor predeterminado de la subclave en la forma de cadena del IDENTIFICADOR de clase del controlador (CLSID). En el ejemplo siguiente se habilita el controlador de arrastrar y colocar MyDD .

HKEY_CLASSES_ROOT
   Directory
      shellex
         DragDropHandlers
            MyDD
               (Default) = {MyDD CLSID GUID}

Suprimir verbos y controlar la visibilidad

Puede usar la configuración de directiva de Windows para controlar la visibilidad del verbo. Los verbos se pueden suprimir a través de la configuración de directiva agregando un valor SuppressPolicy o un valor GUID de SuppressPolicyEx a la subclave del Registro del verbo. Establezca el valor de la subclave DeletePolicy 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.

Usar el modelo de selección de verbos

Los valores del Registro deben establecerse para que los verbos controle situaciones en las que un usuario puede seleccionar un solo elemento, varios elementos o una selección de un elemento. Un verbo requiere valores del Registro independientes para cada una de estas tres situaciones que admite el verbo. Los valores posibles para el modelo de selección de verbos son los siguientes:

  • Especifique el valor MultiSelectModel para todos los verbos. Si no se especifica el valor MultiSelectModel, se deduce del tipo de implementación de verbo que ha elegido. En el caso de los métodos basados en COM (como DropTarget y ExecuteCommand) Player se asume y para los otros métodos se asume Document .
  • Especifique Single para verbos que admitan solo una sola selección.
  • Especifique Player para verbos que admitan cualquier número de elementos.
  • Especifique Documento para verbos que creen una ventana de nivel superior para cada elemento. Al hacerlo, se limita el número de elementos activados y ayuda a evitar quedarse sin recursos del sistema si el usuario abre demasiadas ventanas.

Cuando el número de elementos seleccionados no coincide con el modelo de selección de verbos o es mayor que los límites predeterminados descritos en la tabla siguiente, el verbo no aparece.

Tipo de implementación de verbo Document Jugador
Heredado 15 elementos 100 elementos
COM 15 elementos Sin límite

 

A continuación se muestran entradas del Registro de ejemplo con el valor MultiSelectModel.

HKEY_CLASSES_ROOT
   Folder
      shell
         open
             = MultiSelectModel = Document
HKEY_CLASSES_ROOT
   ProgID
      shell
         verb
             = MultiSelectModel = Single | Document | Player

Uso de atributos de elemento

Los valores de marca SFGAO de los atributos de Shell para un elemento se pueden probar para determinar si el verbo debe estar habilitado o deshabilitado.

Para usar esta característica de atributo, agregue los siguientes valores REG_DWORD en el verbo:

  • El valor AttributeMask especifica el valor SFGAO de los valores de bits de la máscara con la que se va a probar.
  • El valor AttributeValue especifica el valor SFGAO de los bits que se prueban.
  • ImplicitSelectionModel especifica cero para verbos de elemento o distinto de cero para verbos en el menú contextual de fondo.

En la entrada del Registro de ejemplo siguiente, AttributeMask se establece en SFGAO_READONLY (0x40000).

HKEY_CLASSES_ROOT
   txtfile
      Shell
         test.verb2
            AttributeMask = 0x40000
            AttributeValue = 0x0
            ImpliedSelectionModel = 0x0
            command
               (Default) = %SystemRoot%\system32\notepad.exe %1

Implementación de verbos personalizados para carpetas a través de Desktop.ini

En Windows 7 y versiones posteriores, puedes agregar verbos a una carpeta a través de Desktop.ini. Para obtener más información sobre Desktop.ini archivos, consulte Personalización de carpetas con Desktop.ini.

Nota:

Desktop.ini archivos siempre deben marcarse como System + Hidden para que no se muestren a los usuarios.

 

Para agregar verbos personalizados para carpetas a través de un archivo Desktop.ini, realice los pasos siguientes:

  1. Cree una carpeta marcada como De solo lectura o Sistema.

  2. Cree un archivo Desktop.ini que incluya un [. ShellClassInfo] DirectoryClass=Folder ProgID.

  3. En el Registro, cree HKEY_CLASSES_ROOT\Folder ProgID con un valor de CanUseForDirectory. El valor CanUseForDirectory evita el uso indebido de progIDs que están establecidos para no participar en la implementación de verbos personalizados para carpetas a través de Desktop.ini.

  4. Agregue verbos en la subclave FolderProgID, por ejemplo:

    HKEY_CLASSES_ROOT
       CustomFolderType
          Shell
             MyVerb
                command
                   (Default) = %SystemRoot%\system32\notepad.exe %1\desktop.ini
    

Nota:

Estos verbos pueden ser el verbo predeterminado, en cuyo caso, al hacer doble clic en la carpeta, se activa el verbo.

 

Procedimientos recomendados para controladores de menú contextual y selección de varios verbos

Elegir un verbo estático o dinámico para el menú contextual

Personalización de un menú contextual mediante verbos dinámicos

Menús contextuales y controladores de menú contextual

Verbos y asociaciones de archivos

Referencia del menú contextual