2010-06-23 34 views
7

L'idée de base avec la programmation shell Windows est que vous pouvez associer à ce que MS appelle actuellement un progid (par exemple Company.Type.Ver) un type de fichier donné (extension):Comment ajouter un verbe secondaire à un type de fichier dans le shell Windows?

HKCR \ txt @ = Acme .Text.1

HKCR \ Acme.Text.1 @ = Ceci est le ProgID pour les associations de fichiers texte pour Acme

Et puis Acme Corp peut mettre autant de verbes shell comme ils veulent que les sous-clés de HKCR \ Acme.Text.1 \ shell tel que HKCR \ Acme.Text.1 \ shell \ open. Mais si je suis XyzCorp, comment ajouter un verbe secondaire aux fichiers texte? Je ne veux pas usurper l'association de fichier primaire - je suis heureux pour qu'il soit associé à Acme.Text.1, mais je veux ajouter "Importer dans l'éditeur de Xyz".

je pouvais:
1. ajouter un verbe au progid Acme (par exemple HKCR \ Acme.Text.1 \ shell \ my-verbe)
2. créer une nouvelle progid sur nos deux behalfs et copier les données ACME cela, et fusionner les verbes de XyzCorp en cela
3. ajouter des verbes directement à l'extension de fichier (au moins un utilisé pour être en mesure de le faire)
4. ???

Quelqu'un connaît-il la «bonne» réponse à cette question?

EDIT: Je ne suis vraiment pas ravi de toute solution qui implique de devoir modifier le PROGID de quelqu'un d'autre. Je préférerais vraiment ajouter quelque chose - un IContextMenu ou tout ce qui est requis, en dehors du PROGID associé pour ajouter des verbes/options supplémentaires à un type de fichier donné.

Il semble que ce système est si fou qu'il est impossible de le faire lorsque des maisons de développement individuelles le détiennent et qu'il peut être supprimé ou modifié par un tel système. Cela me semble fragile (désinstaller quelque chose et pouf, votre extension de fichier cesse de fonctionner correctement, ou installer quelque chose et de même votre verbe secondaire disparaît car ext est maintenant mappé à un PROGID propriétaire différent auquel je n'ai pas ajouté notre verbe quand nous étions installé (pas, à ce moment-là, sachant quoi que ce soit sur cet autre progid encore inexistant)), et juste bête. Après tout ce temps, toutes ces versions de Windows et Microsoft n'ont jamais trouvé un moyen d'avoir des couches de gestionnaires pour un type de fichier donné? Vraiment?!?

Je viens de trouver ça ahurissant! La programmation junior 101 implique l'apprentissage de systèmes de commande ou d'autres systèmes en couches/en cascade. Les WinProcs Windows eux-mêmes sont organisés dans un modèle de modèle de commande - de sorte que, depuis le contexte de la fenêtre interne vers l'extérieur, de nombreux gestionnaires possibles reçoivent une fissure à un MSG donné. Il existe sûrement un moyen d'ajouter un verbe qui s'applique à plusieurs extensions sans outrepasser l'association progid primaire des extensions, elle-même totalement indépendante du mappage extension-> progid primaire (pour que l'utilisateur puisse installer plusieurs programmes sur temps, et toujours avoir accès à un verbe secondaire pour ce type de fichier). Je suppose que je peux regarder HKCR. * ... Je comprends qu'il est possible d'y ajouter des verbes qui s'appliquent à tous les types de fichiers. Mais alors, j'ai besoin de trouver un moyen de filtrer afin que notre verbe ne soit vraiment présent que pour les types de fichiers auxquels nous devrions appliquer ...

Répondre

9

Ceci est possible, et c'est très facile à faire (une fois que vous savez où chercher). La magie réside dans la clé HKEY_CLASSES_ROOT\SystemFileAssociations. Ici vous trouverez de nombreuses sous-clés nommées après les extensions de fichiers. Créez simplement vos clés shell/open/command sous ces éléments.

Voici un exemple de fichier de registre montrant la structure. Si vous enregistrez en tant que fichier .reg et de l'importer, alors vous aurez la commande « Importer dans Xyz Editor » ajouté à tous les fichiers txt, et sans affecter l'association de fichier principal:

Windows Registry Editor Version 5.00 

[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt] 

[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt\shell] 

[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt\shell\xyz-import] 
@="Import into Xyz Editor" 

[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt\shell\xyz-import\command] 
@="notepad.exe \"%1\"" 

également sous HKCR\SystemFileAssociatons sont quelques clés non nommées après les extensions: "texte", "image", "vidéo", etc. Elles correspondent aux entrées PerceivedType sous les extensions dans HKCR. Par exemple, HKCR\.png\PerceivedType est défini sur "image", tout comme HKCR\.jpg\PerceivedType. Vous pouvez donc ajouter des gestionnaires sous HKCR\SystemFileAssociations\image qui apparaîtront pour tous les types "image".

+0

Cela semble extrêmement intrigant. Si cela fonctionne pour XP +, alors je suis doré! Waaaaay mieux que l'une des solutions précédentes! Bonus pour le "type perçu"! – Mordachai

+0

@Mordachai: Cela fonctionne pour XP +; pas sûr si cela fonctionne avant XP ou si XP était quand il a été ajouté. – Boann

+0

Cette réponse a été très utile, merci! :) – CptRobby

5

La valeur sans nom (alias default ou valeur standard) sous la clé d'extension de fichier peut être un progID, mais ne doit pas être.C'est vraiment juste un identifiant. Vous pouvez ajouter vos verbes sous l'identificateur de type de fichier, même s'il semble que le nom de quelqu'un d'autre s'y trouve. Les paragraphes suivants examinent chacune des options.

1. ajouter un verbe au progid Acme (par exemple HKCR \ Acme.Text.1 \ shell \ my-verbe)

Celui-ci obtient mon vote. C'est simple et efficace. Les mises à niveau/réinstallations du logiciel ACME n'affecteront pas les verbes que vous avez ajoutés au type de fichier/progid d'ACME. La désinstallation du logiciel Acme ne supprimera généralement pas vos verbes, car les désinstalleurs ne suppriment généralement pas les clés de registre contenant des sous-clés qu'ils n'ont pas créées.

2. Créez un nouveau progid sur nos deux behalfs et copier les données de Acme à cela, et fusionner les verbes de XyzCorp dans ce

Cela fonctionnerait au moment où le changement, mais cesseront de travailler lorsque le programme d'Acme est mis à jour/réinstallé - le programme d'installation ne saura pas mettre à jour le type de fichier partagé. De même, lorsque le programme de désinstallation d'Acme est lancé, les verbes ne seront pas supprimés, donc ils seront placés dans un chemin inexistant.

3. verbes ajouter directement l'extension de fichier (au moins un utilisé pour être en mesure de le faire)

Je viens d'essayer cela sur Win XP SP3, et malheureusement, il n'a pas fonctionné. Les verbes doivent être définis sous la clé de type de fichier, pas la clé extesion de fichier.

4. ???

Vous pouvez créer un gestionnaire ContextMenu - il s'agit d'une extension shell et nécessite l'implémentation d'interfaces COM. Une vue d'ensemble des différences et des avantages des gestionnaires de menus contextuels par rapport aux verbes simples configurés par registre est décrite dans Shell Context Menu.

Résumé Pour simplifier, j'irais aveC# 1. Le programme d'installation de XYZCorp peut vérifier si un type de fichier existe pour l'extension de fichier, et si oui, ajoute des verbes sous le type existant, ou il crée un nouveau type de fichier s'il n'existe pas et enregistre les verbes sous celui-ci.

+0

Le menu contextuel shell est toujours basé sur l'enregistrement de clés et de valeurs dans le registre sous le ProgID associé à une extension de fichier. Donc, je ne comprends pas comment on pourrait créer une option de menu contextuel qui apparaît pour une extension donnée sans modifier le ProgID de quelqu'un d'autre? – Mordachai

+0

Mon vote est pour modifier l'ID prog existant s'il y en a un - la première option. Peut-être que j'ai confondu le problème en mentionnant que ce n'est pas toujours un progID - juste un identifiant de type de fichier. (Par exemple .txt a 'txtfile' comme identifiant de type de fichier.) Mais, peu importe comment on l'appelle, c'est un enregistrement existant, et c'est la partie importante! :) – mdma

+0

@Mordachai - Je viens de relire votre commentaire - j'ai mal compris la première fois. Vous pouvez enregistrer un gestionnaire de menu contextuel pour tous les types de fichiers, puis contrôler par programme l'affichage des verbes (par exemple, en vérifiant l'extension du fichier.) Voir http://msdn.microsoft.com/fr-fr/library/cc144175%28v= VS.85% 29.aspx – mdma