2009-12-14 2 views
1

Ok, j'ai regardé partout et j'ai du mal à comprendre comment associer un type de fichier personnalisé à mon application C#. J'utilise Visual Studio 2008 et je suis limité à .NET 2.0 en raison du déploiement de l'entreprise. Fondamentalement tout ce que je veux vraiment faire est de pouvoir permettre à l'utilisateur de double-cliquer sur mon type de fichier personnalisé ou glisser-déposer sur l'icône de l'application et charger les données, ainsi que d'afficher une icône personnalisée sur le fichier lui-même. Je peux ouvrir le fichier via une boîte de dialogue et tout fonctionne très bien.Associer le type de fichier et l'icône

Essayer de lire les documents en ligne de Micosoft est difficile à comprendre et ne me donne pas vraiment tous les détails dont j'ai besoin. Si quelqu'un sait où je peux trouver un bon tutoriel ou peut l'expliquer, je l'apprécierais.

Merci Patrick

+0

C'est une honte de la limitation; ClickOnce dans 3.5 SP1 a ceci intégré dans ... –

+0

Cela a été entièrement répondu dans le fil de pile de débordement suivant (http://stackoverflow.com/questions/2993118/how-to-perform-shell-icon-embedding- in-visual-studio-2010/10415947 # 10415947). Nous avons utilisé cette implémentation et cela fonctionne très bien. Il est également open source et s'intègre dans MSBuild. –

Répondre

1

Ce CodeProject article a un code source démontrant l'association de fichier par code.

+0

J'ai trouvé ce http://www.mentalis.org/soft/class.qpx?id=5 et l'ai utilisé comme un modèle, maintenant je dois juste comprendre comment faire apparaître l'icône, et charger le fichier dans une instance de l'application si elle est déjà en cours d'exécution. – Patrick

+0

@ patrickst1 - exécuter une seule instance de l'application de cette manière vaut une autre question en soi. Le comportement par défaut de Windows consiste à charger une nouvelle copie de l'application, vous devrez donc faire quelques modifications. –

+0

Cool merci. J'ai donc tout fonctionné sauf pour l'icône, où es-tu? Le seul fichier dans le dossier ressources (qui n'est pas présent dans la phase de débogage, mais c'est une autre affaire) est l'icône de l'application principale.J'ai besoin de savoir où mon icône personnalisée est stockée. – Patrick

0

Here est une discussion sur la façon d'utiliser les utilitaires de ligne de commande assoc et ftype pour ce faire. Vous pouvez appeler le shell de commande pendant un déploiement de programme (ou lorsque l'application est exécutée) pour ce faire.

+0

Salut, merci cela m'a donné une meilleure compréhension de la façon dont cela fonctionne dans le système, mais pas sûr de la façon d'exécuter les commandes shell dans l'installateur. – Patrick

+0

@ patrickst1 - vaut une autre question, aussi. Dites quel installateur vous travaillez. –

+0

Juste celui par défaut qui est créé avec VisualStudio 2008 – Patrick

2

I wrote this up dans les newsgroups il y a quelques années. En parcourant ce document, je trouve que ce n'est pas le plus clair que j'ai jamais écrit, mais c'est assez complet. Pour ce que ça vaut, je l'ai réimprimé ci-dessous:


D'abord, vous devez créer une sous-clé sous HKEY_CLASSES_ROOT qui contiendra les commandes qui commencent votre application. Vous devriez nommer cette clé quelque chose de semi-descriptif. Votre extension de fichier sera mappée à cette clé. Par exemple, les fichiers TXT sont mappés à une clé nommée txtfile, par défaut. L'avantage de l'utilisation de cette configuration est que si vous disposez de plusieurs extensions que votre application peut gérer, vous pouvez les associer à cette clé. Par exemple, de nombreuses applications d'édition d'image créent une sous-clé appelée quelque chose comme "imagefile", et mappent .bmp, .jpg, .gif, etc. à cette touche. Nous appellerons votre clé "JoeBlowFile". Ensuite, vous devez définir la valeur "par défaut" de votre nouvelle clé JoeBlowFile sur une chaîne de texte décrivant à l'utilisateur le type de fichier dont il dispose. C'est ce qui apparaît dans Windows Explorer sous "Type". Encore une fois, pour utiliser l'exemple de fichier TXT, une bonne chaîne serait ici "Text File" ou "Text Document". (C'est le dernier par défaut.) Votre chaîne peut être "Joe Blow Data". Maintenant, sous votre nouvelle clé, vous pouvez créer une autre sous-clé, appelée "DefaultIcon". Ceci, comme son nom l'indique, définit l'icône utilisée avec les fichiers de ce type. Vous devez créer une icône personnalisée représentant de manière imagée les documents gérés par votre programme. Vous pouvez enregistrer cette icône en tant que fichier ICO dans le répertoire de votre application, mais mieux encore, vous pouvez l'inclure en tant que ressource dans votre EXE ou votre DLL. Dans tous les cas, vous devrez définir la valeur par défaut de la sous-clé sur une chaîne représentant le chemin complet et le nom de fichier de l'ICO, de l'EXE ou de la DLL. S'il y a plus d'une icône dans le fichier (particulièrement si vous l'incluez en tant que ressource dans votre fichier EXE ou DLL), vous devez également ajouter une virgule et un numéro d'index positif représentant l'icône J'aimerais utiliser, ou un identifiant de ressource négatif, en utilisant le négatif de l'identifiant que vous avez attribué votre icône dans votre script de ressources. Ainsi, le vôtre pourrait être, par exemple "C: \ Program Files \ JoeBlow \ JoeBlow.exe, 2".

Une note pour les développeurs C# sur le paragraphe ci-dessus. Malheureusement, les projets C# ne peuvent pas avoir de scripts de ressources. Les ressources ajoutées aux applications .NET en les ajoutant au projet et en les désignant comme une «ressource intégrée» sont incluses dans un nouveau format spécifique à .NET qui n'est pas compatible avec les méthodes précédentes.La seule icône que vous pouvez incorporer correctement dans votre application en utilisant C# sur VS.NET est l'icône de l'application, accessible depuis les propriétés du projet. Si vous avez besoin d'icônes supplémentaires, par exemple une icône pour représenter un fichier de document géré par votre application plutôt que de représenter l'application elle-même. Vous devez inclure les fichiers ICO, compiler une DLL avec C++ avec vos icônes incorporées ou créer et compiler un script de ressources et incluez-le dans votre projet à partir des propriétés du projet.

Si oui ou non vous choisissez d'utiliser la clé DefaultIcon, vous avez besoin maintenant de créer une sous-clé nommée « shell » sous votre clé JoeBlowFile. Sous la clé shell, vous allez créer des clés individuelles pour chacune des commandes que vous souhaitez que l'utilisateur puisse exécuter sur votre type de fichier à partir du menu contextuel (menu contextuel). Ces éléments sont appelés "verbes". Par souci de cohérence, l'un d'eux devrait être "ouvert" - cette clé, si elle existe, sera la valeur par défaut (c'est-à-dire lorsqu'un utilisateur double-clique sur un fichier de votre type, la commande d'ouverture sera exécutée). Au lieu de cela, vous pouvez définir la valeur par défaut de la touche "shell" égale au verbe que vous souhaitez utiliser par défaut. Vous pouvez éventuellement définir la valeur par défaut pour chaque verbe au texte que vous souhaitez afficher dans le menu contextuel lorsqu'un utilisateur clique avec le bouton droit sur un fichier de votre type. Une esperluette (&) peut être utilisée dans ce texte pour désigner que le caractère suivant sera souligné, ce qui signifie que l'utilisateur peut appuyer sur la touche correspondant à ce caractère pour sélectionner cette commande dans le menu contextuel. Par exemple, pour la clé "open", vous pouvez mettre "Open with & Joe Blow's app" comme valeur par défaut. Ce texte puis, avec un J souligné, apparaîtra dans le menu contextuel pour les fichiers de ce type, et un utilisateur peut appuyer sur la lettre J pour lancer l'application de Joe Blow.

La seule chose que vous avez à faire, cependant, avec les touches « ouvertes » (et les suivants), est de créer une autre clé comme une sous-clé de que l'on appelle « commande ». La valeur par défaut de la clé de commande doit être définie sur une chaîne représentant uniquement la commande requise pour effectuer cette action. Par exemple, la chaîne par défaut dans la clé de commande sous la clé "open" pourrait être "" C: \ Program Files \ JoeBlow \ JoeBlow.exe ""% 1 "". Notez les guillemets autour du chemin d'accès \ filename pour votre application et autour du %1. Ils ne sont nécessaires que dans le chemin d'accès \ nom de fichier de votre application s'il y a des espaces dans le chemin ou le nom de fichier, mais ils sont absolument requis autour du %1 pour les applications 32 bits. Le %1 est exactement comme %1 dans les anciens fichiers batch (.bat) MS-DOS. %1 est remplacé par le premier paramètre sur la ligne de commande, qui dans ce cas devient le nom de fichier du fichier que votre application est censée ouvrir. Parce que vous ne savez pas à l'avance si le chemin d'accès ou le nom de fichier contenant le fichier que vous êtes censé contenir contiendra des espaces, vous devez placer les guillemets autour de %1.

D'autres paramètres requis pour votre application doivent également être inclus. Par exemple, la valeur par défaut dans la clé "commande", sous la clé "print" pourrait être "" C: \ Program Files \ JoeBlow \ JoeBlow.exe ""% 1 "/ print", ou "" C: \ Program Fichiers \ JoeBlow \ JoeBlow.exe "/ print"% 1 "". C'est à vous de décider comment vous voulez traiter les paramètres de la ligne de commande dans votre application.

Une note sur les paramètres remplaçables comme "% 1", mentionné ci-dessus. Apparemment, le paramètre "% 1"/peut/doit être remplacé par le short nom de fichier à ouvrir. Ce n'est pas toujours le cas, et je n'ai pas compris quels sont les critères que Windows utilise pour déterminer ce qui va passer - court ou long. Il se peut que si le chemin d'accès exécutable répertorié dans le Registre est un nom de fichier long, Windows remplacera% 1 par le nom de fichier long, mais si le chemin d'accès est un nom de fichier court ou peut être interprété comme un seul, Windows remplacera %1 avec le nom de fichier court. Si vous voulez être sûr que vous obtenez toujours le long nom de fichier, utilisez "% L" à la place.Vous pouvez utiliser un L majuscule (comme je l'ai fait) ou un minuscule, mais je préfère utiliser majuscule car minuscule "l" ressemble beaucoup trop au nombre "1". De plus, si votre programme sait comment gérer les ID d'élément Shell, vous pouvez obtenir au lieu du nom de fichier long avec le paramètre "% i". Encore une fois, les majuscules et les minuscules «i» conviennent tout aussi bien, mais je trouve plus difficile de distinguer «I» en minuscule «l» et le chiffre «1». Si vous ne savez pas ce qu'est un ID d'article Shell, c'est bon. Vous n'aurez probablement jamais besoin d'en utiliser un. Vous avez enfin terminé avec la clé JoeBlowFile. Le reste est relativement simple. Vous avez simplement besoin de créer (si ce n'est déjà fait) une autre sous-clé sous HKEY_CLASSES_ROOT, et nommez-la comme l'extension de votre type de document. Pour utiliser l'exemple txtfile, le nom serait ".txt" (avec le point, mais sans les guillemets). Le vôtre (Joe Blow) pourrait être ".jbf" (pour Joe Blow File). La valeur par défaut de cette clé doit maintenant être définie sur le nom de la première clé que vous avez créée, dans l'exemple que nous utilisons "JoeBlowFile".

C'est tout. Vous avez terminé dans le registre. N'oubliez pas que vous devrez vous assurer que votre application traite la ligne de commande d'une manière cohérente avec les commandes que vous avez définies sous la clé "shell". La fenêtre n'ouvrira pas automatiquement ce fichier lorsque votre application démarre ... vous devez le faire.

Graphiquement, il ressemble à ceci:

 
HKEY_CLASSES_ROOT 
| +--.jbf = JoeBlowFile 
| 
+--JoeBlowFile = Joe Blow Data 
    | 
    +--DefaultIcon = C:\Program Files\JoeBlow\JoeBlow.exe, 2 
    | 
    +--Shell 
      | 
      +--open = Open with &Joe Blow's App 
      |  | 
      |  +--command = "C:\Program Files\JoeBlow\JoeBlow.exe" "%1" 
      | 
      +--print 
       | 
       +--command = "C:\Program Files\JoeBlow\JoeBlow.exe" "%1" /print 

Si vous ne savez pas encore comment modifier le Registre, consultez MSDN pour toutes les fonctions commençant par « Reg », y compris RegOpenKeyEx, RegCreateKeyEx, et RegSetValueEx. Vous pouvez aussi le faire de façon louche en créant un fichier ".reg" et simplement utiliser ShellExecuteEx() pour appeler "regedit.exe/s" dessus. (Le /s empêche Regedit d'ouvrir une boîte de message demandant "Êtes-vous sûr de vouloir ajouter les informations dans [nom de fichier.reg] au registre?") Le format d'un fichier REG est simple et direct. Voici un exemple de fichier REG pour ajouter l'exemple « JoeBlow » d'en haut:

 
REGEDIT4 

[HKEY_CLASSES_ROOT\.jbf] 
@="JoeBlowFile" 

[HKEY_CLASSES_ROOT\JoeBlowFile] 
@="Joe Blow Data" 

[HKEY_CLASSES_ROOT\JoeBlowFile\DefaultIcon] 
@="C:\\Program Files\\JoeBlow\\JoeBlow.exe, 2" 

[HKEY_CLASSES_ROOT\JoeBlowFile\Shell] 

[HKEY_CLASSES_ROOT\JoeBlowFile\Shell\open] 
@="Open with &Joe Blow's app" 

[HKEY_CLASSES_ROOT\JoeBlowFile\Shell\open\command] 
@="\"C:\\Program Files\\JoeBlow\\JoeBlow.exe\" \"%1\"" 

[HKEY_CLASSES_ROOT\JoeBlowFile\Shell\print] 
@="&Print" 

[HKEY_CLASSES_ROOT\JoeBlowFile\Shell\print\command] 
@="\"C:\\Program Files\\JoeBlow\\JoeBlow.exe \"%1\" /print" 

Assurez-vous que vous incluez « REGEDIT4 » comme la première ligne du fichier, ou il ne fonctionnera pas. En outre, assurez-vous d'appuyer sur Entrée sur la dernière ligne, sinon cette ligne ne sera pas lue. Au total, ajouter votre programme au registre de cette façon n'est pas aussi pratique que ça en a l'air, car vous devrez modifier votre fichier REG si votre application est installée n'importe où à l'exception de à C: \ Program Files \ JoeBlow. Les instructions ci-dessus visaient à programmer directement l'API Win32 à l'aide de C ou en C++. Pour C# sur .NET, c'est plutôt un peu plus facile. Voir la classe Registry, ou vous pouvez même en faire beaucoup graphiquement en utilisant un projet de déploiement dans VS.NET.


Pour ajouter des ressources indigènes accessibles à un ensemble de .NET, vous aurez besoin d'un script de ressources. Un script de ressource est un fichier texte brut, comme un fichier de code. En fait, c'est du code; code déclaratif qui est compilé par le compilateur de ressources, rc.exe. Une suite script de ressources exemple:

#include <windows.h> 

#define IDI_APP 100 
#define IDI_FILE 200 
#define ID_VERSION 1 

IDI_APP ICON "Resources\\Application.ico" 
IDI_FILE ICON "Resources\\JowBlowFile.ico" 

ID_VERSION VERSIONINFO 
    FILEVERSION 1, 0, 19, 186  // change this to your version 
    PRODUCTVERSION 1, 0, 19, 186 // change this to your version 
    FILEOS VOS__WINDOWS32 
    FILETYPE VFT_APP { 
     BLOCK "StringFileInfo" { 
      BLOCK "040904B0" { // 0x409 = U.S. English, 0x04B0 = dec 1200 = Unicode 
       VALUE "CompanyName",  "Joe Blow, Inc.\0" 
       VALUE "FileDescription", "Joe Blow's App\0" 
       VALUE "FileVersion",  "1.0.19.186\0" // change this to your version 
       VALUE "InternalName",  "JoeBlow\0" 
       VALUE "LegalCopyright", "Copyright © 2008-2009 Joe Blow Incorporated\0" 
       VALUE "OriginalFilename", "JoeBlow.exe\0" 
       VALUE "ProductName",  "Joe Blow\0" 
       VALUE "ProductVersion", "1.0.19.189\0" // change this to your version 
      } 
     } 
     BLOCK "VarFileInfo" { 
      VALUE "Translation", 0x409 /*U.S. English*/, 1200 /*Unicode*/ 
     } 
    } 

Le plus grand inconvénient à faire est que vous devez ajouter les informations de version manuellement à votre script de ressources (sauf si vous souhaitez renoncer à tout les informations de version tout à fait).Dans mes applications, j'ajoute une étape de construction personnalisée qui exécute un programme que j'ai écrit qui met à jour les informations de version directement dans l'exécutable afin que je n'ai pas à mettre à jour manuellement le numéro de version dans le script de ressources. diffusion publique et est autrement au-delà de la portée de ce poste.

Vous devez maintenant appeler le compilateur de ressources pour générer ce script de ressources dans un fichier de ressources binaires. Enregistrez ce script en tant que JoeBlow.rc, puis démarrez une invite de commandes Visual Studio. C'est sous Outils dans le dossier du menu Démarrer de Visual Studio. Si vous n'avez pas Visual Studio installé, je crois que vous obtenez rc.exe dans le cadre du SDK. Microsoft semble également offrir la dernière version here.

Une fois à une VS cmd invite (ou avoir rc.exe dans votre chemin), il suffit de taper:

rc JoeBlow.rc

simple que cela. Le script de ressources ci-dessus doit compiler sans erreur, étant donné que les icônes que j'ai incluses existent. Cela créera un nouveau fichier dans le même répertoire appelé JoeBlow.res. Maintenant, en supposant que sont en utilisant Visual Studio, tout ce que vous avez à faire est de modifier les propriétés du projet pour inclure ce fichier de ressources.

Ces instructions sont pour Visual Studio 2005 ou 2008. Je ne me souviens pas comment le faire, ou même si vous le pouvez, dans les anciennes versions, et je n'ai pas encore essayé 2010, mais c'est probablement similaire. Cliquez avec le bouton droit sur le projet dans l'Explorateur de solutions et sélectionnez Propriétés (ou sélectionnez Propriétés dans le menu Projet de la barre de menus principale). Dans l'onglet Application, qui est le premier onglet que vous devriez voir, en bas se trouve une zone de groupe Ressources. Ici, vous avez deux options: "Icône et manifeste", ou "Fichier de ressources". Sélectionnez la dernière option. Cela activera la zone de texte dans laquelle vous pouvez taper (ou parcourir) votre nouveau fichier de ressources, JoeBlow.res. Enfin, construisez simplement votre projet, et hop, vous disposez d'icônes intégrées au format PE natif accessible au shell lors de la navigation dans les fichiers associés à votre application. Maintenant, si vous définissez la valeur HKEY_CLASSES_ROOT\JoeBlowFile\DefaultIcon sur C:\Program Files\JoeBlow\JoeBlow.exe,1 (en utilisant le numéro d'index base zéro), ou C:\Program Files\JoeBlow\JoeBlow.exe,-200 (en utilisant le négatif de l'identificateur de ressource, # défini ci-dessus comme IDI_FILE), votre icône apparaîtra dans l'Explorateur pour les fichiers .jbf .

Pour que vos nouvelles icônes s'affichent immédiatement après l'installation, vous devrez peut-être actualiser le cache des icônes du shell. J'ai trouvé des instructions sur la façon de le faire here. L'essentiel consiste à changer la taille de l'icône de la coquille (à HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics) de sa valeur actuelle à une valeur différente et à revenir, en diffusant un message WM_SETTINGCHANGE après chaque modification.

Bonne chance. Fait moi savoir si tu as besoin de quoique ce soit d'autre.

+0

Salut, merci pour cela, cela me permet de mieux comprendre comment il est enregistré dans le Registre. Le seul problème que j'ai maintenant est d'essayer de faire fonctionner l'icône. – Patrick

+0

Quels problèmes avez-vous avec l'icône? Comment fournissez-vous l'icône? L'avez-vous dans un fichier séparé (.ico), ou essayez-vous de le compiler avec votre fichier .exe ou .dll? Voir ma note dans cette réponse sur l'inclusion des ressources natives dans un assemblage C#. Vous devez créer un script de ressource (.rc) et le compiler avec le compilateur de ressources (démarrer l'invite cmd VS et utiliser rc.exe), puis définir le fichier .res résultant comme fichier de ressources de votre application dans l'onglet Application du projet Propriétés. Je vais essayer de mettre à jour ma réponse avec un peu plus de détails. –

+0

Je l'ai inclus dans les ressources du projet, je ne sais pas où il est livré, je suppose dans l'un des fichiers manifeste, mais je ne suis pas certain. J'ai une classe qui liera le type de fichier quand l'application se charge, c'est juste l'icône que je ne peux pas afficher. – Patrick

Questions connexes