Sunteți pe pagina 1din 22

2/11/2019 Creación de controladores de menú de acceso directo - Aplicaciones Win32 | Documentos de Microsoft

Crear controladores de menú de


acceso directo
30/05/2018 • 19 minutos para leer •
In this article
Canonical Verbs
Extended Verbs
Customizing a Shortcut Menu Using Static Verbs
Completing Verb Implementation Tasks
Related topics

Los controladores de menú de acceso directo, también conocidos como controladores de


menú contextual o controladores de verbos, son un tipo de controlador de tipo de archivo. Al
igual que todos estos controladores, son objetos del Modelo de objetos componentes (COM)
en proceso implementados como DLL.

7 Nota

Existen consideraciones especiales para Windows de 64 bits al registrar controladores


que funcionan en el contexto de aplicaciones de 32 bits: cuando se invocan verbos de
Shell en el contexto de una aplicación de 32 bits, el subsistema WOW64 redirige el
acceso del sistema de archivos a algunas rutas. Si su controlador .exe está almacenado
en una de esas rutas, no es accesible en este contexto. Por lo tanto, como solución
alternativa, almacene su .exe en una ruta que no se redirija o almacene una versión de
código auxiliar de su .exe que inicie la versión real.

Este tema está organizado de la siguiente manera:

Verbos canónicos
Verbos Extendidos
Personalizar un menú contextual utilizando verbos estáticos
Activación de su controlador utilizando la interfaz IDropTarget
Especificar la posición y el orden de los verbos estáticos
Posicionar verbos en la parte superior o inferior del menú
https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers 1/22
2/11/2019 Creación de controladores de menú de acceso directo - Aplicaciones Win32 | Documentos de Microsoft

Crear menús en cascada estáticos


Obtención de comportamiento dinámico para verbos estáticos mediante la sintaxis
de consulta avanzada
En desuso: Asociar verbos con comandos de intercambio dinámico de datos
Completar tareas de implementación de verbos
Personalizar el menú contextual para objetos de Shell predefinidos
Ampliar un nuevo submenú
Suprimir verbos y controlar la visibilidad
Empleando el modelo de selección de verbos
Usar atributos de artículo
Implementación de verbos personalizados para carpetas a través de Desktop.ini
Temas relacionados

Verbos canónicos
Las aplicaciones son generalmente 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 de uso común
llamados 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 utiliza el nombre canónico para
generar automáticamente una cadena de visualización correctamente localizada. Por
ejemplo, la cadena de visualizació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

Abierto Abre el archivo o la carpeta.

Opennew Abre el archivo o carpeta en una nueva ventana.

Impresión 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.

https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers 2/22
2/11/2019 Creación de controladores de menú de acceso directo - Aplicaciones Win32 | Documentos de Microsoft

7 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 del 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 el segundo parámetro ( lpOperation ) pasado a
ShellExecute , y es el CMINVOKECOMMANDINFO . El miembro lpVerb pasó 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 comúnmente o que están destinados a usuarios
experimentados. Por esta razón, también puede definir uno o más verbos extendidos. Estos
verbos son similares a los verbos normales, pero se distinguen de los verbos normales por la
forma en que están registrados. 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 más verbos extendidos. Los comandos asociados se
mostrarán solo 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 a la subclave del verbo. El valor no debe tener ningún dato asociado.

Personalizar un menú contextual utilizando verbos


estáticos
Después de elegir un verbo estático o dinámico para su menú contextual, puede ampliar el
menú contextual para un tipo de archivo registrando un verbo estático para el tipo de
archivo. Para hacerlo, agregue una subclave de Shell debajo de la subclave para el ProgID de

https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers 3/22
2/11/2019 Creación de controladores de menú de acceso directo - Aplicaciones Win32 | Documentos de Microsoft

la aplicación asociada con el tipo de archivo. Opcionalmente, puede definir un verbo


predeterminado para el tipo de archivo convirtiéndolo 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 pueda usar cuando se llama a la función ShellExecuteEx
, pero no se especifica ningún verbo. El Shell no selecciona necesariamente el verbo
predeterminado cuando ShellExecuteEx se usa de esta manera.

Shell utiliza el primer verbo disponible en el siguiente orden:

1. El verbo predeterminado
2. El primer verbo en el registro, si se especifica el orden del verbo
3. El verbo abierto
4. El verbo abierto con

Si ninguno de los verbos enumerados está disponible, la operación falla.

Cree una subclave para cada verbo que desee agregar debajo de 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 verbal, cree una subclave de comando con el
valor predeterminado establecido en la línea de comando para activar los elementos. Para los
verbos canónicos, como Abrir e Imprimir , puede omitir la cadena de visualización porque el
sistema muestra automáticamente una cadena correctamente localizada. Para verbos no
canónicos, si omite la cadena de visualización, se muestra la cadena de verbo.

En el siguiente ejemplo de registro, tenga en cuenta que:

Como Doit no es un verbo canónico, se le asigna un nombre para mostrar, que puede
seleccionarse 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 colocándolos en un icono de impresora.
Se muestra una subclave para cada verbo. % 1 representa el nombre del archivo y % 2
el nombre de la impresora.

= Copiar

HKEY_CLASSES_ROOT
.myp-ms
(Default) = MyProgram.1
MyProgram.1
(Default) = My Program Application
Shell

https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers 4/22
2/11/2019 Creación de controladores de menú de acceso directo - Aplicaciones Win32 | Documentos de Microsoft

(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"

El siguiente diagrama ilustra la extensión del menú contextual de acuerdo con las entradas de
registro anteriores. Este menú contextual tiene los verbos Abrir , Hacer e Imprimir en su
menú, con Hacerlo como verbo predeterminado.

Activación de su controlador utilizando la interfaz IDropTarget

El intercambio dinámico de datos (DDE) está en desuso; use IDropTarget en su lugar.


IDropTarget es más robusto y tiene un mejor soporte de activación porque utiliza la
activación COM del controlador. En el caso de la selección de elementos múltiples,
IDropTarget no está sujeto a las restricciones de tamaño del búfer que se encuentran tanto
en DDE como en CreateProcess . Además, los elementos se pasan a la aplicación como un
https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers 5/22
2/11/2019 Creación de controladores de menú de acceso directo - Aplicaciones Win32 | Documentos de Microsoft

objeto de datos que se puede convertir en una matriz de elementos mediante la función
SHCreateShellItemArrayFromDataObject . Hacerlo es más simple y no pierde la
información del espacio de nombres como ocurre cuando el elemento se convierte en una
ruta para la línea de comandos o los protocolos DDE.

Para obtener más información sobre IDropTarget y consultas de Shell para los atributos de
asociación de archivos, consulte 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 luego en
el orden de los elementos en la matriz de asociación, según lo definido por el orden de
clasificació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 el último caso, el primer elemento de la lista es el elemento
predeterminado, y los otros verbos se muestran inmediatamente debajo de él en el orden
especificado.

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

1. Monitor
2. Artilugio
3. Personalización

= Copiar

HKEY_CLASSES_ROOT
DesktopBackground
Shell
Display
Gadgets
Personalization

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

1. Personalización

https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers 6/22
2/11/2019 Creación de controladores de menú de acceso directo - Aplicaciones Win32 | Documentos de Microsoft

2. Artilugio
3. Monitor

= Copiar

HKEY_CLASSES_ROOT
DesktopBackground
Shell = "Personalization,Gadgets"
Display

Posicionar verbos en la parte superior o inferior del menú

El siguiente atributo de 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 en hacerlo
tendrá prioridad:

sintaxis = Copiar

Position=Top | Bottom

Crear menús en cascada estáticos

En Windows 7 y versiones posteriores, la implementación del menú en cascada es


compatible a través de la configuración del registro. Antes de Windows 7, la creación de
menús en cascada solo era posible mediante la implementación de la interfaz
IContextMenu . En Windows 7 y versiones posteriores, debe recurrir a soluciones basadas
en el código COM solo cuando los métodos estáticos son insuficientes.

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

https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers 7/22
2/11/2019 Creación de controladores de menú de acceso directo - Aplicaciones Win32 | Documentos de Microsoft

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

Crear menús en cascada con la entrada de registro de subcomandos


Creación de menús en cascada con la entrada de registro ExtendedSubCommandsKey
Crear menús en cascada con la interfaz IExplorerCommand

Crear menús en cascada con la entrada de registro de subcomandos

En Windows 7 y versiones posteriores, puede usar la entrada Subcomandos para crear


menús en cascada mediante el siguiente procedimiento.

Para crear un menú en cascada utilizando la entrada Subcomandos

1. Cree una subclave debajo de HKEY_CLASSES_ROOT \ ProgID \ shell para representar


su menú en cascada. En este ejemplo, le damos a esta subclave el nombre CascadeTest .
Asegúrese de que el valor predeterminado de la subclave CascadeTest esté vacío y se
muestre como (valor no establecido) .

= Copiar

HKEY_CLASSES_ROOT
*
shell
CascadeTest
(Default)

2. A su 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, le
asignamos "Test Cascade Menu".

= Copiar

HKEY_CLASSES_ROOT
*
shell
CascadeTest
(Default)
MUIVerb = Test Cascade Menu

3. A su subclave CascadeTest , agregue una entrada de Subcomandos de tipo REG_SZ a la


que se le asigna una lista, desmultiplicada por punto y coma, de los verbos que deben
aparecer en el menú, en el orden de aparición. Por ejemplo, aquí asignamos una
cantidad de verbos proporcionados por el sistema:
https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers 8/22
2/11/2019 Creación de controladores de menú de acceso directo - Aplicaciones Win32 | Documentos de Microsoft

= Copiar

HKEY_CLASSES_ROOT
*
Shell
CascadeTest
SubCommands
Windows.delete;Windows.properties;Windows.rename;Windows.cu
t;Windows.copy;Windows.paste

4. En el caso de los verbos personalizados, impleméntelos utilizando cualquiera de los


métodos de implementación de verbos estáticos y enumerelos en la subclave
CommandStore como se muestra en este ejemplo para un verbo ficticio VerbName :

= Copiar

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

7 Nota

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

Creación de menús en cascada con la entrada de registro


ExtendedSubCommandsKey

En Windows 7 y versiones posteriores, puede usar la entrada ExtendedSubCommandKey


para crear menús en cascada extendidos: menús en cascada dentro de los menús en cascada.

https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers 9/22
2/11/2019 Creación de controladores de menú de acceso directo - Aplicaciones Win32 | Documentos de Microsoft

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

Debido a que HKEY_CLASSES_ROOT es una combinación de HKEY_CURRENT_USER y


HKEY_LOCAL_MACHINE , puede registrar cualquier verbo personalizado en la subclave
HKEY_CURRENT_USER \ Software \ Classes . La principal ventaja de hacerlo es que no se
requiere un permiso elevado. Además, otras asociaciones de archivos pueden reutilizar todo
este conjunto de verbos especificando la misma subclave ExtendedSubCommandsKey. Si no
necesita reutilizar este conjunto de verbos, puede enumerar los verbos debajo del padre,
pero asegúrese de que el valor predeterminado del padre esté vacío.

Para crear un menú en cascada utilizando una entrada ExtendedSubCommandsKey

1. Cree una subclave debajo de HKEY_CLASSES_ROOT \ ProgID \ shell para representar


su menú en cascada. En este ejemplo, le damos a esta subclave el nombre CascadeTest2
. Asegúrese de que el valor predeterminado de la subclave CascadeTest esté vacío y se
muestre como (valor no establecido) .

= Copiar

HKEY_CLASSES_ROOT
*
shell
CascadeTest2
(Default)

2. A su 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, le
asignamos "Test Cascade Menu".

= Copiar

https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers 10/22
2/11/2019 Creación de controladores de menú de acceso directo - Aplicaciones Win32 | Documentos de Microsoft

HKEY_CLASSES_ROOT
*
shell
CascadeTest
(Default)
MUIVerb = Test Cascade Menu 2

3. Bajo la subclave CascadeTest que ha creado, agregue una subclave


ExtendedSubCommandsKey y luego agregue los subcomandos del documento (del
tipo REG_SZ ); por ejemplo:

= Copiar

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 Test Cascade Menu 2 esté


vacío y se muestre como (valor no establecido) .

4. Rellene los subverbos usando cualquiera de las siguientes implementaciones de verbos


estáticos. Tenga en cuenta que la subclave CommandFlags representa los 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 estos indicadores de Windows 7 y posteriores, vea
IExplorerCommand :: GetFlags . ECF_SEPARATORBEFORE funciona solo para los
elementos del menú de nivel superior. MUIVerb es de tipo REG_SZ y CommandFlags es
de tipo REG_DWORD .

= Copiar

HKEY_CLASSES_ROOT
txtile
Shell
Test Cascade Menu 2
(Default)
ExtendedSubCommandsKey
Shell

https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers 11/22
2/11/2019 Creación de controladores de menú de acceso directo - Aplicaciones Win32 | Documentos de Microsoft

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 siguiente captura de pantalla es una ilustración de los ejemplos de entrada de clave de


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 las fuentes de datos que proporcionan
sus comandos del módulo de comando a través de IExplorerCommandProvider utilicen
esos comandos como verbos en un menú contextual. En Windows 7 y versiones posteriores,
puede proporcionar la misma implementación de verbos con IExplorerCommand que con
IContextMenu .

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

La siguiente captura de pantalla ilustra otra implementación de un menú en cascada en la


carpeta Dispositivos .
https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers 12/22
2/11/2019 Creación de controladores de menú de acceso directo - Aplicaciones Win32 | Documentos de Microsoft

7 Nota

Debido a que IExplorerCommand solo admite la activación en proceso, se recomienda


su uso por parte de las fuentes de datos de Shell que necesitan compartir la
implementación entre comandos y menús contextuales.

Obtención de comportamiento dinámico para verbos estáticos mediante la


sintaxis de consulta avanzada

La sintaxis de consulta avanzada (AQS) puede expresar una condición que se evaluará
utilizando las propiedades del elemento para el que se está instanciando el verbo. Este
sistema funciona solo con propiedades rápidas. Estas son propiedades que el origen de datos
de Shell informa tan rápido al no devolver SHCOLSTATE_SLOW de IShellFolder2 ::
GetDefaultColumnState .

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

sintaxis = Copiar

System.StructuredQueryType.Boolean#True

En la siguiente entrada de registro de ejemplo:

El valor de AppliesTo controla si el verbo se muestra u oculta.


El valor DefaultAppliesTo controla qué verbo es el predeterminado.
El valor HasLUAShield controla si se muestra un escudo de Control de cuenta de
usuario (UAC).

https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers 13/22
2/11/2019 Creación de controladores de menú de acceso directo - Aplicaciones Win32 | Documentos de Microsoft

En este ejemplo, el valor DefaultAppliesTo hace que este verbo sea el 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.

= Copiar

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

Agregue la subclave Comando y un valor:

= Copiar

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

En el registro de Windows 7, vea HKEY_CLASSES_ROOT \ drive como un ejemplo de verbos


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: Asociar verbos con comandos de intercambio dinámico 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 descubrir el servidor DDE. Un bloqueo del servidor DDE
detiene el mensaje de la ventana de difusión y, por lo tanto, bloquea las conversaciones DDE
para otras aplicaciones. Es común que una sola aplicación atascada provoque bloqueos
posteriores en toda la experiencia del usuario.
https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers 14/22
2/11/2019 Creación de controladores de menú de acceso directo - Aplicaciones Win32 | Documentos de Microsoft

El método IDropTarget es más robusto y tiene un mejor soporte de activación porque utiliza
la activación COM del controlador. En el caso de la selección de elementos múltiples,
IDropTarget no está sujeto a las restricciones de tamaño del búfer que se encuentran tanto
en DDE como en 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 . Hacerlo es más simple y no pierde la
información del espacio de nombres como ocurre cuando el elemento se convierte en una
ruta para la línea de comandos o los protocolos DDE.

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

Completar tareas de implementación de verbos


Las siguientes tareas para implementar verbos son relevantes tanto para implementaciones
de verbos estáticos como dinámicos. Para obtener más información sobre los verbos
dinámicos, consulte Personalización de un menú contextual utilizando verbos dinámicos .

Personalizar el 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 el nombre del 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 de acceso directo se pueden personalizar agregando verbos en el registro están
marcados en la tabla con la palabra Verbo.

Ampliar un nuevo submenú

Cuando un usuario abre el menú Archivo en el Explorador de Windows, uno de los


comandos que se muestran es Nuevo . Al seleccionar este comando, se muestra un
submenú. De manera predeterminada, el submenú contiene dos comandos, Carpeta y
Acceso directo , que permiten a los usuarios crear subcarpetas y accesos directos. Este
submenú se puede ampliar para incluir comandos de creación de archivos para cualquier
tipo de archivo.

Para agregar un comando de creación de archivos al nuevo submenú, los archivos de su


aplicación deben tener un tipo de archivo asociado. Incluya una subclave ShellNew debajo
https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers 15/22
2/11/2019 Creación de controladores de menú de acceso directo - Aplicaciones Win32 | Documentos de Microsoft

del nombre del archivo. Cuando se selecciona el comando Nuevo del menú Archivo , el
Shell agrega el tipo de archivo al nuevo submenú. La cadena de visualizació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 más valores de datos a la
subclave ShellNew . Los valores disponibles se enumeran en la siguiente tabla.

Shell Nuevo
valor de
subclave Descripción

Mando Ejecuta una aplicación. Este valor REG_SZ especifica la ruta de la aplicación que
se ejecutará. Por ejemplo, puede configurarlo para iniciar un asistente.

Datos Crea un archivo que contiene datos específicos. Este valor REG_BINARY
especifica los datos del archivo. Los datos se ignoran si se especifica NullFile o
FileName .

Nombre del Crea un archivo que es una copia de un archivo especificado. Este valor REG_SZ
archivo especifica la ruta de acceso completa del archivo que se copiará.

NullFile Crea un archivo vacío. NullFile no tiene asignado un valor. Si se especifica


NullFile , los valores de registro de Data y FileName se ignoran.

El siguiente ejemplo de clave de registro y captura de pantalla ilustran el nuevo submenú


para el tipo de archivo .myp-ms. Tiene un comando, Aplicación MyProgram .

= Copiar

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

La captura de pantalla ilustra el nuevo submenú. Cuando un usuario selecciona Aplicación


MyProgram en el submenú Nuevo , el Shell crea un archivo llamado Nueva Aplicación
MyProgram.myp-ms y lo pasa a MyProgram.exe .

https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers 16/22
2/11/2019 Creación de controladores de menú de acceso directo - Aplicaciones Win32 | Documentos de Microsoft

Crear controladores de arrastrar y soltar

El procedimiento básico para implementar un controlador de arrastrar y soltar es el mismo


que para los controladores de menú de acceso directo convencionales. Sin embargo, los
controladores de menú de acceso directo normalmente usan solo el puntero IDataObject
pasado al método IShellExtInit :: Initialize del controlador para extraer el nombre del
objeto. Un controlador de arrastrar y soltar 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 soltar el objeto. La siguiente
captura de pantalla ilustra un típico menú contextual de arrastrar y soltar.

https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers 17/22
2/11/2019 Creación de controladores de menú de acceso directo - Aplicaciones Win32 | Documentos de Microsoft

Un controlador de arrastrar y soltar es un controlador de menú contextual que puede


agregar elementos a este menú contextual. Los controladores de arrastrar y soltar
generalmente se registran en la siguiente subclave.

= Copiar

HKEY_CLASSES_ROOT
Directory
shellex
DragDropHandlers

Agregue una subclave debajo de la subclave DragDropHandlers llamada para el


controlador de arrastrar y soltar, y establezca el valor predeterminado de la subclave en la
forma de cadena del GUID del identificador de clase (CLSID) del controlador. El siguiente
ejemplo habilita el controlador de arrastrar y soltar MyDD.

= Copiar

HKEY_CLASSES_ROOT
Directory
shellex

https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers 18/22
2/11/2019 Creación de controladores de menú de acceso directo - Aplicaciones Win32 | Documentos de Microsoft

DragDropHandlers
MyDD
(Default) = {MyDD CLSID GUID}

Suprimir verbos y controlar la visibilidad

Puede usar la configuración de políticas de Windows para controlar la visibilidad de los


verbos. Los verbos se pueden suprimir mediante la configuración de políticas agregando un
valor SuppressionPolicy o un valor GUID SuppressionPolicyEx a la subclave de registro
del verbo. Establezca el valor de la subclave SuppressionPolicy en la ID de política. Si la
política está activada, el verbo y su entrada de menú contextual asociada se suprimen. Para
ver los posibles valores de ID de política, consulte la enumeración RESTRICTIONS .

Empleando el modelo de selección de verbos

Los valores de registro deben establecerse para que los verbos manejen situaciones en las
que un usuario puede seleccionar un solo elemento, múltiples elementos o una selección de
un elemento. Un verbo requiere valores de registro separados 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 de MultiSelectModel para todos los verbos. Si no se especifica el


valor de MultiSelectModel, se deduce del tipo de implementación de verbo que haya
elegido. Para los métodos basados en COM (como DropTarget y ExecuteCommand), se
asume Player , y para los otros métodos, se asume Document .
Especifique Single para verbos que admitan solo una selección.
Especifique Player para verbos que admitan cualquier cantidad de elementos.
Especifique el documento para los verbos que crean una ventana de nivel superior
para cada elemento. Hacerlo limita la cantidad 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 siguiente tabla, el verbo
no aparece.

Tipo de implementación de verbos Documento Jugador

Legado 15 artículos 100 artículos

COM 15 artículos Sin límite

https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers 19/22
2/11/2019 Creación de controladores de menú de acceso directo - Aplicaciones Win32 | Documentos de Microsoft

Las siguientes son entradas de registro de ejemplo que usan el valor MultiSelectModel.

= Copiar

HKEY_CLASSES_ROOT
Folder
shell
open
= MultiSelectModel = Document

= Copiar

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

Usar atributos de artículo

Los valores del indicador SFGAO de los atributos de Shell para un elemento se pueden
probar para determinar si el verbo se debe habilitar o deshabilitar.

To use this attribute feature, add the following the REG_DWORD values under the verb:

The AttributeMask value specifies the SFGAO value of the bit values of the mask to test
with.
The AttributeValue value specifies the SFGAO value of the bits that are tested.
The ImpliedSelectionModel specifies zero for item verbs, or nonzero for verbs on the
background shortcut menu.

In the following example registry entry, the AttributeMask is set to SFGAO_READONLY


(0x40000).

= Copy

HKEY_CLASSES_ROOT
txtfile
Shell
test.verb2
AttributeMask = 0x40000
AttributeValue = 0x0

https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers 20/22
2/11/2019 Creación de controladores de menú de acceso directo - Aplicaciones Win32 | Documentos de Microsoft

ImpliedSelectionModel = 0x0
command
(Default) = %SystemRoot%\system32\notepad.exe %1

Implementing Custom Verbs for Folders through Desktop.ini

In Windows 7 and later, you can add verbs to a folder through Desktop.ini. For more
information about Desktop.ini files, see How to Customize Folders with Desktop.ini.

7 Note

Desktop.ini files should always be marked System + Hidden so they won't be


displayed to users.

To add custom verbs for folders through a Desktop.ini file, perform the following
steps:

1. Create a folder that is marked Read-only or System.

2. Create a Desktop.ini file that includes a [.ShellClassInfo] DirectoryClass=Folder ProgID.

3. In the registry create HKEY_CLASSES_ROOT\Folder ProgID with a value of


CanUseForDirectory. The CanUseForDirectory value avoids the misuse of ProgIDs that
are set not to participate in implementing custom verbs for folders through Desktop.ini.

4. Add verbs under the FolderProgID subkey, for example:

= Copy

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

7 Note

https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers 21/22
2/11/2019 Creación de controladores de menú de acceso directo - Aplicaciones Win32 | Documentos de Microsoft

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

Temas relacionados
Mejores prácticas para controladores de menú de acceso directo y verbos de selección
múltiple

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

Personalizar un menú contextual utilizando verbos dinámicos

Menús de acceso directo (contexto) y controladores de menú de acceso directo

Verbos y asociaciones de archivos

Referencia del menú contextual

Is this page helpful?

 Yes  No

https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers 22/22

S-ar putea să vă placă și