Sous Windows 8 / 8.1 x64, je voudrais attribuer une icône personnalisée pour les éléments du menu contextuel de Windows par défaut tels que Copier , Couper , Coller , Supprimer , Annuler , Rétablir et Envoyer vers , qui par défaut a n'importe quelle icône:
Où puis-je trouver la "référence" à ces éléments de menu contextuel dans le registre, puis ajouter une valeur de registre "icône" pour eux?
Ou en d'autres termes, comment attribuer une icône à un menu d'extension de shell comme le shellex SendTo?.
Recherche
Comme l'a commenté @ Sk8erPeter , il semble que:
"L'ajout de la
Icon
valeur de chaîne à différents gestionnaires de menu contextuel ne fonctionne pas comme lors de l'ajout à un élément personnalisé comme par exempleHKEY_CLASSES_ROOT\*\shell\MYCUSTOMKEY
"
la source
Icon
valeur de chaîne dans une clé commeHKEY_CLASSES_ROOT\*\shell\MYCUSTOMITEM
(et la valeur deIcon
serait comme par exemple%SystemRoot%\System32\shell32.dll,-133
ou sg. else). MAIS l'ajout de laIcon
valeur de chaîne à différents gestionnaires de menu contextuel ne fonctionne pas comme lors de l'ajout à ces éléments personnalisés.SetMenuItemInfo
en réponse àQueryContextMenu
.Réponses:
Avis d'affiliation: je suis l'auteur du logiciel mentionné dans cette réponse.
Tout d'abord, je vous ferai savoir que j'ai appris C ++ et Win32 juste pour cette question .
J'ai développé une extension shell 64 bits qui est enregistrée en tant que gestionnaire de menu contextuel. Lorsqu'il est invoqué, il fouille dans les éléments de menu existants, à la recherche d'entrées intéressantes. S'il en trouve un, il y colle une icône (qui doit avoir été chargée plus tôt). À l'heure actuelle, il recherche Copier , Couper , Supprimer , Coller , Rétablir , Envoyer vers et Annuler . Vous pouvez ajouter le vôtre en modifiant le code; la procédure à suivre est décrite ci-dessous. (Désolé, je ne suis pas assez bon en C ++ pour le rendre configurable.)
Une capture d'écran de celui-ci en action, avec les icônes les plus laides connues de l'homme:
Vous pouvez télécharger ces icônes si vous le souhaitez.
Configuration
Téléchargez-le (depuis ma Dropbox). Remarque : ce fichier est détecté par un analyseur VirusTotal comme étant une forme de malware. Ceci est compréhensible, étant donné le genre de choses qu'il doit faire pour supprimer les entrées existantes. Je vous donne ma parole qu'il ne fait aucun mal intentionnel à votre ordinateur. Si vous êtes suspect et / ou que vous souhaitez le modifier et l'étendre, consultez le code sur GitHub !
Créez un dossier dans votre lecteur C:
C:\shellicon
. Créer des fichiers BMP avec les titres suivants:copy
,cut
,delete
,paste
,redo
,sendto
,undo
. (J'espère qu'il est évident que l'on fait quelle chose.) Ces images devraient probablement être de 16 x 16 pixels (ou quelle que soit la taille de vos paramètres DPI, cela fait la marge du menu), mais j'ai également réussi avec des images plus grandes. Si vous voulez que les icônes soient transparentes, vous devrez simplement faire en sorte que leur arrière-plan soit de la même couleur que le menu contextuel. (Cette astuce est également utilisée par Dropbox.) J'ai créé mes terribles icônes avec MS Paint; d'autres programmes peuvent ou non enregistrer d'une manière compatible avecLoadImageA
. 16 par 16 à une profondeur de couleur de 24 bits à 96 pixels par pouce semble être l'ensemble de propriétés d'image le plus fiable.Mettez la DLL dans un endroit accessible à tous les utilisateurs, ce dossier que vous venez de créer est un bon choix. Ouvrez une invite d'administration dans le dossier contenant la DLL et faites
regsvr32 ContextIcons.dll
. Cela crée des informations d'inscription pour les types de coquillages*
,Drive
,Directory
etDirectory\Background
. Si vous souhaitez supprimer l'extension shell, faites-leregsvr32 /u ContextIcons.dll
.Code pertinent
Fondamentalement, l'extension interroge simplement le texte de chaque élément du menu contextuel avec
GetMenuItemInfo
et, le cas échéant, ajuste l'icône avecSetMenuItemInfo
.Visual Studio génère beaucoup de code mystérieux magique pour les projets ATL, mais voici le contenu de
IconInjector.cpp
, qui implémente le gestionnaire de menu contextuel:Notez que les
HBITMAP
s ne sont jamais nettoyés, mais cela n'a pas trop d'importance étant donné que le contenu de la DLL disparaîtra lorsque l'Explorateur s'arrêtera. Les icônes prennent à peine de la mémoire de toute façon.Si vous compilez pour 32 bits, le premier paramètre de
GetCommandString
est juste unUINT
au lieu d'unUINT_PTR
.Si vous voulez vraiment des icônes transparentes, vous devrez créer une fenêtre avec l'icône désirée, puis mis
mii.hBmpItem
àHBMMENU_SYSTEM
et mettre la poignée à la fenêtremii.dwItemData
, comme décrit au bas de l'article MSDN surMENUITEMINFO
. Je n'ai pas pu comprendre comment créer des fenêtres à partir d'extensions shell.LR_LOADTRANSPARENT
semble prometteur comme indicateurLoadImageA
, mais il a ses propres pièges - en particulier, ne fonctionne pas à moins que vous n'utilisiez des bitmaps 256 couleurs.Si vous rencontrez des problèmes avec le chargement de l'image, essayez de supprimer l'
LR_DEFAULTSIZE
indicateur desLoadImageA
appels.Quelqu'un suffisamment compétent en C ++ pourrait probablement extraire des ressources d'autres DLL et les convertir en
HBITMAP
s, mais ce n'est pas moi.Le modifier
J'ai écrit cela dans Visual Studio, qui je pense être le meilleur éditeur pour Windows C ++.
Chargez le fichier SLN dans Visual Studio 2015 après avoir installé les outils C ++. Dans
IconInjector.cpp
, vous pouvez ajouter desHBITMAP
entrées en haut etLoadImageA
appelerInitialize
pour ajouter de nouvelles icônes. Dans laelse if
section, utilisez unwcscmp
appel pour rechercher une correspondance exacte ou unwcsstr
appel pour rechercher la présence d'une sous-chaîne. Dans les deux cas, le&
représente la position du soulignement / accélérateur lors de l'utilisation de Maj + F10. Définissez votre mode sur Release et votre architecture sur x64, et faites Build → Build Solution . Vous obtiendrez une erreur sur l'échec de l'enregistrement de la sortie, mais ne vous inquiétez pas; vous voudriez quand même le faire manuellement. End Explorer, copiez la nouvelle DLL (\x64\Release\ContextIcons.dll
dans le dossier de la solution) à l'endroit, puis faites laregsvr32
danse.Attributions
Un grand merci aux rédacteurs MSDN et au créateur du " Guide complet de l'idiot pour l'écriture d'extensions de shell ", auquel j'ai fait référence de manière intensive.
Éloge
Aux nombreuses instances d'Explorer qui ont été tuées lors de la production de cette extension de shell: vous êtes mort pour une bonne cause, que certaines personnes sur Internet peuvent avoir des icônes à côté de leurs mots.
la source
C:\shellicon\copy.bmp
, etc. - ce sont des icônes de 20x20 pixels au format BMP) et j'ai enregistré la DLL en tant qu'administrateur dans l'invite de commande avecregsvr32 ContextIcons.dll
laquelle elle s'est déroulée avec succès, mais Je ne vois aucun changement dans le menu contextuel. J'ai même redémarré l'ordinateur, désenregistré et réenregistré à nouveau la DLL, mais aucun changement. J'essaie de compiler la source dans VS2015!Je n'ai pas assez de représentant pour laisser un commentaire mais il semble que ces informations soient contenues dans shell32.dll. Les fichiers ont été compilés, il est donc difficile de voir quelles sont les fonctions, mais il semble que ce soit celle-là.
D'intérêt (exportation du registre):
HKEY_CLASSES_ROOT \ CLSID {3ad05575-8857-4850-9277-11b85bdb8e09}
(Par défaut) REG_SZ Copier / Déplacer / Renommer / Supprimer / Lier un objet
AppID REG_SZ {3ad05575-8857-4850-9277-11b85bdb8e09}
LocalizedString REG_EXPAND_SZ @% SystemRoot% \ system32 \ shell32.dll, -50176
Sous la clé InProcServer32, il fait référence à shell32.dll. Il y en a aussi quelques autres avec des noms de sondage pertinents. Peut-être aussi intéressant est windows.storage.dll
la source