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
- Verbos extendidos
- Solo verbos de acceso mediante programación
- Personalización de un menú contextual mediante verbos estáticos
- Activación del controlador mediante la interfaz IDropTarget
- Especificar la posición y el orden de los verbos estáticos
- Posicionamiento de verbos en la parte superior o inferior del menú
- Crear menús estáticos en cascada
- Obtención del comportamiento dinámico para verbos estáticos mediante la sintaxis de consulta avanzada
- En desuso: Asociación de verbos con comandos dinámicos de Intercambio de datos
- Completar tareas de implementación de verbos
- Temas relacionados
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:
- Verbo predeterminado
- Primer verbo del Registro, si se especifica el orden del verbo.
- El verbo Open
- 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.
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:
- Mostrar
- Gadgets
- 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:
- Personalización
- Gadgets
- 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.
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
- Crear menús en cascada con la entrada del Registro ExtendedSubCommandsKey
- Crear menús en cascada con la interfaz IExplorerCommand
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
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)
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
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
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.
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
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)
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
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).
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.
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 .
La captura de pantalla siguiente muestra otra implementación de un menú en cascada en la carpeta Dispositivos .
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.
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.
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:
Cree una carpeta marcada como De solo lectura o Sistema.
Cree un archivo Desktop.ini que incluya un [. ShellClassInfo] DirectoryClass=Folder ProgID.
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.
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.
Temas relacionados
-
Procedimientos recomendados para controladores de menú contextual y selección de varios verbos
-
Personalización de un menú contextual mediante verbos dinámicos