En Windows 8 / 8.1 x64, me gustaría asignar un ícono personalizado para los elementos predeterminados del menú contextual de Windows, como Copiar , Cortar , Pegar , Eliminar , Deshacer , Rehacer y Enviar a elementos, que por defecto tiene cualquier ícono:
¿Dónde puedo ubicar la "referencia" a esos elementos del menú contextual en el registro y luego agregarles un valor de registro "icono"?
O en otras palabras, cómo asignar un icono a un menú de extensión de la cáscara como el SendTo shellex ?.
Investigación
Como comentó @ Sk8erPeter , parece que:
"Agregar el
Icon
valor de cadena a diferentes controladores de menú contextual no funciona como cuando se agrega a un elemento personalizado como, por ejemplo,HKEY_CLASSES_ROOT\*\shell\MYCUSTOMKEY
"
windows-8
context-menu
shell-extensions
ElektroStudios
fuente
fuente
Icon
valor de cadena en una clave comoHKEY_CLASSES_ROOT\*\shell\MYCUSTOMITEM
(y el valor deIcon
sería como eg%SystemRoot%\System32\shell32.dll,-133
o sg. else). PERO agregar elIcon
valor de cadena a diferentes controladores de menú contextual no funciona como cuando se agrega a estos elementos personalizados.SetMenuItemInfo
en respuesta aQueryContextMenu
.Respuestas:
Aviso de afiliación: soy el autor del software mencionado en esta respuesta.
Primero, quiero que sepa que aprendí C ++ y Win32 solo por esta pregunta .
He desarrollado una extensión de shell de 64 bits que se registra como un controlador de menú contextual. Cuando se invoca, revisa los elementos de menú existentes, buscando entradas interesantes. Si encuentra uno, le pega un ícono (que debe haberse cargado antes). Por el momento, busca Copiar , Cortar , Eliminar , Pegar , Rehacer , Enviar a y Deshacer . Puede agregar el suyo modificando el código; El procedimiento para esto se describe a continuación. (Lo siento, no soy lo suficientemente bueno en C ++ para hacerlo configurable).
Una captura de pantalla en acción, con los iconos más feos conocidos por el hombre:
Puede descargar estos iconos si realmente lo desea.
Configurarlo
Descárgalo (desde mi Dropbox). Aviso : un escáner de VirusTotal detecta este archivo como una forma de malware. Esto es comprensible, dado el tipo de cosas que tiene que hacer para bloquear las entradas existentes. Te doy mi palabra de que no hace daño intencional a tu computadora. Si sospecha y / o quiere modificarlo y extenderlo, ¡vea el código en GitHub !
Crear una carpeta en la unidad C:
C:\shellicon
. Crear archivos BMP con los siguientes títulos:copy
,cut
,delete
,paste
,redo
,sendto
,undo
. (Espero que sea obvio cuál hace qué.) Estas imágenes probablemente deberían ser de 16 por 16 píxeles (o por grande que sea su configuración de DPI que haga el margen del menú), pero también he tenido éxito con las más grandes. Si desea que los iconos se vean transparentes, deberá hacer que su fondo sea del mismo color que el menú contextual. (Este truco también lo emplea Dropbox). Hice mis terribles iconos con MS Paint; otros programas pueden o no guardar de una manera compatible conLoadImageA
. 16 por 16 a una profundidad de color de 24 bits a 96 píxeles por pulgada parece ser el conjunto más confiable de propiedades de imagen.Ponga la DLL en un lugar accesible para todos los usuarios, esa carpeta que acaba de hacer es una buena opción. Abra un indicador de administrador en la carpeta que contiene la DLL y haga
regsvr32 ContextIcons.dll
. Esto crea la información de registro para los tipos de concha*
,Drive
,Directory
, yDirectory\Background
. Si alguna vez desea eliminar la extensión de shell, hágaloregsvr32 /u ContextIcons.dll
.Código relevante
Básicamente, la extensión solo consulta el texto de cada elemento del menú contextual
GetMenuItemInfo
y, si corresponde, ajusta el icono conSetMenuItemInfo
.Visual Studio genera una gran cantidad de código misterioso mágico para proyectos ATL, pero este es el contenido de
IconInjector.cpp
, que implementa el controlador del menú contextual:Tenga en cuenta que los
HBITMAP
s nunca se limpian, pero esto no importa demasiado dado que las cosas de la DLL desaparecerán cuando Explorer se apague. Los íconos apenas toman memoria de todos modos.Si está compilando para 32 bits, el primer parámetro para
GetCommandString
es solo a enUINT
lugar de aUINT_PTR
.Si realmente quiere iconos transparentes, que tendrá que crear una ventana con el icono deseado y luego fijar
mii.hBmpItem
aHBMMENU_SYSTEM
y poner el identificador de la ventana enmii.dwItemData
, como se describe en la parte inferior de del artículo de MSDN sobreMENUITEMINFO
. No pude descubrir cómo crear ventanas a partir de extensiones de shell.LR_LOADTRANSPARENT
parece prometedor como una bandera deLoadImageA
, pero tiene sus propios riesgos, específicamente, no funciona a menos que use mapas de bits de 256 colores.Si tiene problemas con la carga de imágenes, intente eliminar el
LR_DEFAULTSIZE
indicador de lasLoadImageA
llamadas.Alguien suficientemente capacitado en C ++ probablemente podría tomar recursos de otras DLL y convertirlos a
HBITMAP
s, pero ese alguien no soy yo.Modificándolo
Escribí esto en Visual Studio, que creo que es el mejor editor para Windows C ++.
Cargue el archivo SLN en Visual Studio 2015 después de instalar las herramientas de C ++. En
IconInjector.cpp
, puede agregarHBITMAP
entradas en la parte superior yLoadImageA
llamadasInitialize
para agregar nuevos íconos. Abajo en laelse if
sección, use unawcscmp
llamada para buscar una coincidencia exacta o unawcsstr
llamada para buscar la presencia de una subcadena. En ambos casos,&
representa la posición del subrayado / acelerador cuando se usa Shift + F10. Establezca su modo en Release y su arquitectura en x64, y haga Build → Build Solution . Obtendrá un error acerca de no registrar la salida, pero no se preocupe; de todas formas querrás hacer esto manualmente. Finalice Explorer, copie la nueva DLL (\x64\Release\ContextIcons.dll
en la carpeta de la solución) en el lugar, luego haga elregsvr32
baile.Atribuciones
Muchas gracias a los escritores de MSDN y al creador de " The Complete Idiot's Guide to Writing Shell Extensions". ", a la que hice referencia en gran medida.
Elogio
Para las muchas instancias de Explorer que murieron en la producción de esta extensión de shell: usted murió por una gran causa, que algunas personas en Internet pueden tener iconos al lado de sus palabras.
fuente
C:\shellicon\copy.bmp
, etc., estos son iconos de 20x20 píxeles en formato BMP) y registré el dll como administrador en el símbolo del sistema con elregsvr32 ContextIcons.dll
que se ejecutó correctamente, pero No veo cambios en el menú contextual. Incluso reinicié la computadora, no registré y volví a registrar el dll, pero no hubo cambios. Estoy tratando de compilar la fuente en VS2015!No tengo suficiente representante para dejar un comentario, pero parece que esta información está contenida dentro de shell32.dll. Los archivos se han compilado, por lo que es difícil ver qué funciones contiene, pero parece ser la indicada.
De interés (registro de exportación):
HKEY_CLASSES_ROOT \ CLSID {3ad05575-8857-4850-9277-11b85bdb8e09}
(Predeterminado) REG_SZ Copiar / Mover / Cambiar nombre / Eliminar / Vincular objeto
AppID REG_SZ {3ad05575-8857-4850-9277-11b85bdb8e09}
LocalizedString REG_EXPAND_SZ @% SystemRoot% \ system32 \ shell32.dll, -50176
Bajo la clave InProcServer32, hace referencia a shell32.dll. También hay un par de otros con nombres que suenan relevantes. Posiblemente también de interés es windows.storage.dll
fuente