(Il s'agit d'une copie d'une réponse que j'ai laissée sur le site Web de la Commission européenne. Quora en réponse à une copie de cette question laissée sur place).
Merci pour cette question ! Pour être honnête, je ne mettrais normalement pas presque Je n'ai pas fait autant d'efforts pour y répondre. Mais il se trouve qu'elle est pertinente pour un projet sur lequel je travaille, et je suis toujours amoureux de la simplicité avec laquelle elle s'avère être, car je pensais que j'aurais à écrire un programme Windows avec toutes sortes de bits compliqués pour parler au Shell de Windows et ajouter et supprimer des options de menu à la volée, et il s'avère que cela ne prend qu'environ six nouvelles entrées dans le registre. Ce qui est si cool .
La documentation relative à cette fonctionnalité se trouve à l'adresse suivante https://docs.microsoft.com/en-us/Windows/win32/Shell/context-menu-handlers . C'est un peu intimidant, car il aborde toutes les options, y compris les plus compliquées. Mais celle qui vous intéresse est "Getting Dynamic Behavior for Static Verbs by Using Advanced Query Syntax".
La syntaxe de requête avancée est ce que vous utilisez, sans vous en rendre compte, lorsque vous recherchez des fichiers dans l'explorateur de fichiers. Par exemple, si je tape simplement "test" dans le champ de recherche, il recherche les fichiers dont le nom contient "test".
Mais si j'utilise les menus de l'onglet Recherche pour dire "Je veux juste les fichiers modifiés cette semaine, qui sont entre 16K et 1MB", cela fera apparaître un ensemble plus petit de résultats. Et vous pouvez voir que les menus font cela en ajoutant plus de termes comme "datemodified:thisweek" et "size:small" au champ de recherche - il s'agit en fait de construire une requête en syntaxe de requête avancée pour vous.
Et si vous êtes un utilisateur expérimenté, une fois que vous avez compris ce qui se passe, vous pouvez commencer à faire des requêtes que les menus ne vous permettent pas de faire - comme "Montrez-moi tous les fichiers avec 'test' dans le nom, modifiés pour la dernière fois avant le début de 2020, et dont la taille est comprise entre 2K et 5K" - en utilisant vous-même les mots-clés de la syntaxe de requête avancée (dans ce cas, "test datemodified:<202020-01-01 size:>2000 size:<5000").
Et cela nous amène à ce que vous voulez faire, c'est-à-dire créer une option de menu contextuel qui divise les fichiers. Disons que votre programme qui fait cela est C:\Program Files \divider.exe. Vous l'exécutez en lui donnant un nom de fichier et une taille, comme ceci :
C:\Program Files\divider.exe /size:15000000000 C:\MyData\MyHugeFile.txt
Comme le montre le reste de la documentation sur la "Création de gestionnaires de menu de raccourcis" (insérez une majestueuse poignée de main ici), si vous voulez simplement ajouter cette option de menu pour tous les fichiers texte, vous pouvez le faire avec cet ensemble d'entrées de registre :
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\txtfile\shell\divide]
@="Divide Large File"
[HKEY_CLASSES_ROOT\txtfile\shell\divide\command]
@="\"C:\\Program Files\\Divider.exe\" /size:15000000000 \"%1\""
Cela crée une nouvelle commande de menu contextuel, "Diviser un grand fichier", qui s'affiche pour les fichiers texte (fichiers avec l'extension '.txt'). Lorsque l'utilisateur sélectionne cette commande, le programme Divider est lancé pour diviser le fichier.
Mais vous voulez quelque chose de plus spécifique - vous ne voulez afficher ceci que pour les très gros fichiers. Nous ajoutons donc une autre ligne magique dans le registre. (En fait, je vais en ajouter deux - faisons en sorte que cela n'apparaisse que lorsque vous sélectionnez exactement un fichier, puisque cela semble être une opération assez intensive).
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\txtfile\shell\divide]
"AppliesTo"="System.Size:>15000000000"
@="Divide Large File"
"MultiSelectModel"="Single"
[HKEY_CLASSES_ROOT\txtfile\shell\divide\command]
@="\"C:\\Program Files\\Divider.exe\" /size:15000000000 \"%1\""
La valeur "AppliesTo" indique "N'afficher cette option de menu que si le fichier sélectionné correspond à cette requête de syntaxe de requête avancée - dans ce cas, si la taille est supérieure à 15 gigaoctets". (Et la ligne "MultiSelectModel" dit "N'afficher cette option que si un seul fichier est sélectionné").
Et maintenant, j'ai cet outil vraiment utile dans ma poche, qui peut être utilisé pour tant d'autres choses subtiles sensibles au contexte, avec seulement quelques lignes de texte ajoutées au registre.
(Cela me rappelle l'histoire du conducteur qui apporte sa voiture à un atelier de réparation parce que le moteur tourne mal. Le mécanicien dit que la réparation coûtera 100 dollars. Le conducteur accepte. Le mécanicien regarde sous le capot pendant une minute, puis saisit un marteau et donne un coup sur un connecteur. Le moteur se met immédiatement à ronronner comme un chaton. Le conducteur est stupéfait mais aussi contrarié. "Comment cela peut-il valoir 100 dollars ? Vous n'avez fait que le frapper une fois avec un marteau !" Le mécanicien sourit. "Oh, frapper avec le marteau était gratuit. Savoir où le frapper ? C'est ce qui vaut 100 dollars.")