Al hacer clic con el botón derecho del ratón sobre cualquier ítem del shell (ya sea un fichero o no), el sistema nos muestra un menú contextual formado por una serie de acciones (verbos) entre las que se incluyen un cierto número de acciones por defecto (cortar, copiar, pegar, renombrar, propiedades, etc.), así como ciertas acciones añadidas por programas de terceros. Puesto que un requisito para lograr una buena usabilidad podría ser un menú contextual simple y organizado, un usuario preguntaba cómo se pueden ocultar selectivamente estas acciones de la interfaz de usuario, pero sin eliminarlas del sistema.
Hay unas cuantas formas para lograr esto, agregando algunos valores al registro de Windows:
Valor de registro “Extended”
Si se agrega al registro, justo en la sección donde se define el verbo, un valor de tipo cadena de nombre “Extended” y contenido vacío, el sistema entiende que se trata de una acción que o bien raramente se usa, o bien solo suelen usarla los usuarios avanzados. De tal forma que para mostrarla es necesario mantener pulsada la tecla Mayúsculas mientras se abre el menú contextual. Un ejemplo de esto es la acción “Abrir consola de comandos aquí” del menú contextual de Windows 7 (HKEY_CLASSES_ROOT\Directory\shell\cmd).
Valor de registro “ProgrammaticAccessOnly”
Este valor es nuevo en Windows Vista. Sirve para indicar que dicha acción no está pensada para que la ejecuten los usuarios a través de la interfaz gráfica. Solamente se puede invocar mediante programación. Un ejemplo de ello es el verbo “explorar” (explore), que está presente en el registro, por ejemplo en la clave HKEY_CLASSES_ROOT\Folder\shell\explore, pero que no aparece en el menú contextual.
Valor de registro “LegacyDisable”
Este valor indica que la acción está presente simplemente por motivos de compatibilidad con algún programa antiguo y no debería usarse de ahora en adelante.
Valor de registro “SuppressionPolicy”
Esta opción oculta el verbo si se ha aplicado al sistema una determinada directiva. Las directivas pueden ser de dos tipos: una restricción de licencia o una directiva de grupo de toda la vida. Podemos ver una ejemplo de esto en la clave de registro HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Manage. Ahí encontramos un valor de nombre “SuppressionPolicy” con contenido a 0x4000003c. ¿Qué quiere decir esto? El valor SuppressionPolicy contiene un valor de 32 bits que representa la restricción que, de estar aplicada, queremos que oculte el verbo del menú contextual. Es un valor del tipo enumerado RESTRICTIONS que se le pasa como parámetro a la API SHRestricted. Para ver la correspondencia entre restricciones y códigos hexadecimales, podemos abrir el fichero del SDK de Windows ShlObj.h y posicionarnos en la definición del tipo enumerado RESTRICTIONS (typedef enum RESTRICTIONS). Esta es la línea para el ejemplo que estamos desarrollando:
REST_NOMANAGEMYCOMPUTERVERB = 0x4000003C, // No Manage verb on My Computer
A partir de Windows Vista, Microsoft está usando un modelo distinto de restricciones. La primera diferencia la encontramos en la clave de registro donde se activan dichas restricciones. Anteriormente se agregaban a la clave de registro Software\Policies\Microsoft\Windows (ya sea dentro de HKCU o HKLM), pero recientemente toda nueva restricción se agrega a la clave Software\Microsoft\Windows\CurrentVersion\Policies. La segunda diferencia reside en el formato de representación de la restricción: En lugar de usar un valor de 32 bits, se da preferencia a un nuevo formato basado en un GUID de 128 bits. Para agregar una restricción a un verbo usando este nuevo formato debemos crear un valor de nombre “SuppressionPolicyEx” (nótese el “Ex” final) cuyo contenido sea el GUID correspondiente a la restricción. Podemos ver un ejemplo en la clave de registro HKEY_CLASSES_ROOT\batfile\shell\runasuser. Lamentablemente, Microsoft no ha documentado esta información, lo que hace pensar que pueda ser algo transitorio y propenso a cambios. Para el lector interesado, en esta página se recoge información adicional: http://www.geoffchappell.com/viewer.htm?doc=studies/windows/shell/shlwapi/api/winpolicy/policies.htm
De manera análoga podemos restringir la aparición de una acción en el menú contextual en función de una consulta al servicio de licencias de Windows. En este caso el valor de registro se denominaría “SuppressionSlapiPolicy” y el contenido sería la licencia a consultar, correspondiéndose con el primer parámetro de la función SLGetWindowsInformationDWORD. Si la directiva de licencia que se consulta no está disponible, se ocultará la acción del menú contextual.
Valor de registro “HideInSafeMode”
Si la acción que hemos agregado solamente tiene sentido si el sistema ha arrancado en modo seguro, podemos añadir este valor de cadena (con contenido vacío) para que Windows solo lo muestre en ese escenario.
Estas son las posibles formas de ocultar un verbo del menú contextual de Windows. La extensión del menú contextual y las asociaciones de archivos es un tema bastante amplio, en algunas ocasiones complejo y que generan bastantes dudas no solo entre desarrolladores de aplicaciones, también entre usuarios finales. Un buen punto de partida para comprender mejor el menú contextual es la documentación oficial de MSDN: http://msdn.microsoft.com/en-us/library/cc144169(v=vs.85).aspx
Muy interesante Daniel. Muchas gracias.
Hola que tal Daniel, me contacto contigo del programa MVP de Microsoft me encantaria conocer un poco más de las actividades que realizas en cuanto a tecnologías Microsoft, espero me permitas estar en contacto.
Deje mi correo electrónico espero me permitas el que estemos en contacto y podamos platicar sobre el reconicimiento que da el programa MVP a profesonales como tú.
Si pudieras hacerme llegar tus datos como nombre completo y correo electrónico te lo agradecería enormemente.
a-danam@microsoft.com
Hola que tal Daniel, me contacto contigo del programa MVP de Microsoft me encantaria conocer un poco más de las actividades que realizas en cuanto a tecnologías Microsoft, espero me permitas estar en contacto.
Deje mi correo electrónico espero me permitas el que estemos en contacto y podamos platicar sobre el reconicimiento que da el programa MVP a profesonales como tú.
Si pudieras hacerme llegar tus datos como nombre completo y correo electrónico te lo agradecería enormemente.
a-danam@microsoft.com