2016-08-17 3 views
0

Windows possède un indicateur dans les enregistrements de fichiers appelé "IsShortcut". Lorsque cet indicateur est défini, le fichier reçoit automatiquement l'icône de raccourci et est traité comme un raccourci d'autres manières (par exemple, lorsque vous cliquez avec le bouton droit de la souris et sélectionnez "Créer un raccourci", il copie simplement le fichier .lnk fichier). Microsoft utilise cette fonctionnalité pour les références d'application ClickOnce (extension .appref-ms). Nous utilisons cette fonctionnalité pour un type de fichier de raccourci personnalisé pour notre propre logiciel, et ce que nous avons trouvé est que depuis Windows 10 (ou éventuellement Windows 8), nos raccourcis personnalisés n'apparaissent pas dans le menu Démarrer. Le menu Démarrer répertorie bien sûr les fichiers .lnk et également les fichiers .appref-ms, mais notre propre format de fichier, dont l'enregistrement ne semble pas sensiblement différent de celui des fichiers .appref-ms, est exclu du menu Démarrer. Les fichiers de raccourci sont physiquement présents dans la structure du dossier Menu Démarrer (%APPDATA%\Microsoft\Windows\Start Menu\Programs) mais sont ignorés par l'Explorateur Windows. D'autres types de raccourcis (.lnk et .appref-ms) apparaissent dans le même répertoire. Ce que je cherche, c'est une indication de la façon dont Windows Explorer détermine les formats de fichiers qu'il inclura dans le menu Démarrer, afin que lors du développement d'un format personnalisé, il puisse être indiqué de la même manière. Notre format personnalisé a bien fonctionné sous Windows XP, Windows Vista et Windows 7, mais la nouvelle version du menu Démarrer exclut notre format de fichier, même s'il est marqué IsShortcut de la même manière que les fichiers .appref-ms.Windows Explorer et types de fichiers de raccourcis personnalisés

Est-ce possible? :-)

+0

Implémentez-vous l'extension shell IShellLink associée à votre extension de fichier? –

+0

Nous ne le faisons pas. La majorité des membres de IShellLink ne peuvent pas être implémentés avec nos raccourcis. Par exemple, nos raccourcis stockent une ou plusieurs valeurs Nom de l'application qui sont ensuite transmises à un lanceur. Le chemin exact du fichier programme n'est pas connu, et même s'il l'était, il pourrait y en avoir plus d'un. Cela rend impossible l'implémentation correcte de 'GetPath' /' SetPath'. Cela ne peut pas être la façon dont Explorer détermine quels raccourcis afficher, cependant, sinon il devrait charger et tester chaque fichier de raccourci unique afin d'afficher la liste pour un dossier donné. Cela fonctionnerait mal. –

+0

Bien que ... je suppose qu'il charge et teste chaque raccourci qu'il affiche, sinon les gestionnaires d'icônes ne fonctionneraient pas. Je suppose qu'il ne peut pas être exclu qu'Explorer puisse utiliser 'IShellLink' comme sémaphore pour afficher ou non un raccourci donné ... –

Répondre

1

(Ce n'est pas la réponse, mais peut vous aider dans vos recherches.)

J'ai créé et INSCRITS ma propre extension de lien shell. Après le redémarrage d'Explorer, il utilise mon extension et demande différentes propriétés via l'interface IPropertyStore. journal complet:

TMyLinkExtension.07BA12F0 is created 
    TMyLinkExtension.07BA12F0.QueryInterface IID_IShellLinkW out Result=S_OK 
    TMyLinkExtension.07BA12F0.QueryInterface IID_IInitializeWithFile out Result=S_OK 
    TMyLinkExtension.07BA12F0.IInitializeWithFile.Initialize started 
    TMyLinkExtension.07BA12F0.IInitializeWithFile.Initialize in AFileName=C:\Users\Dec\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Total Commander\1.mylnk 
    TMyLinkExtension.07BA12F0.IInitializeWithFile.Initialize in AOpenMode=STGM_READ 
    TMyLinkExtension.07BA12F0.IInitializeWithFile.Initialize out Result=S_OK 
    TMyLinkExtension.07BA12F0.IInitializeWithFile.Initialize finished 
    TMyLinkExtension.07BA12F0.QueryInterface IID_IShellLinkW out Result=S_OK 
    TMyLinkExtension.07BA12F0.QueryInterface IID_IShellLinkDataList out Result=S_OK 
    TMyLinkExtension.07BA12F0.IShellLinkDataList.GetFlags started 
    TMyLinkExtension.07BA12F0.IShellLinkDataList.GetFlags out Result=E_NOTIMPL 
    TMyLinkExtension.07BA12F0.IShellLinkDataList.GetFlags finished 
    TMyLinkExtension.07BA12F0.IShellLinkW.GetPath started 
    TMyLinkExtension.07BA12F0.IShellLinkW.GetPath in AFileName=0C1FF058 
    TMyLinkExtension.07BA12F0.IShellLinkW.GetPath in AFileNameLength=260 
    TMyLinkExtension.07BA12F0.IShellLinkW.GetPath in @AFindData=0C1FEE08 
    TMyLinkExtension.07BA12F0.IShellLinkW.GetPath in AFlags=SLGP_RAWPATH 
    TMyLinkExtension.07BA12F0.IShellLinkW.GetPath out Result=E_NOTIMPL 
    TMyLinkExtension.07BA12F0.IShellLinkW.GetPath finished 
    TMyLinkExtension.07BA12F0.QueryInterface IID_IPropertyStore out Result=S_OK 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue started 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue in AKey=PKEY_AppUserModel_ID (Caption: AppUserModelId, CanonicalName: System.AppUserModel.ID, Type: VT_LPWSTR) 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue out Result=E_INVALIDARG 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue finished 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue started 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue in AKey=PKEY_AppUserModel_PreventPinning (Caption: Prevent pinning, CanonicalName: System.AppUserModel.PreventPinning, Type: VT_BOOL) 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue out AData.vt=VT_BOOL 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue out AData=0 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue out Result=S_OK 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue finished 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue started 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue in AKey={9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}, 23 (Caption: System.AppUserModel.ExcludedFromLauncher, CanonicalName: System.AppUserModel.ExcludedFromLauncher, Type: VT_BOOL) 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue out AData.vt=VT_BOOL 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue out AData=0 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue out Result=S_OK 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue finished 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue started 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue in AKey={9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}, 14 (Caption: Host environment, CanonicalName: System.AppUserModel.HostEnvironment, Type: VT_UI4) 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue out Result=E_INVALIDARG 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue finished 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue started 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue in AKey=PKEY_AppUserModel_StartPinOption (Caption: Start pin option, CanonicalName: System.AppUserModel.StartPinOption, Type: VT_UI4) 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue out Result=E_INVALIDARG 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue finished 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue started 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue in AKey={9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}, 18 (Caption: Installed by, CanonicalName: System.AppUserModel.InstalledBy, Type: VT_UI4) 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue out Result=E_INVALIDARG 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue finished 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue started 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue in AKey=PKEY_AppUserModel_IsDualMode (Caption: Is dual mode, CanonicalName: System.AppUserModel.IsDualMode, Type: VT_BOOL) 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue out Result=E_INVALIDARG 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue finished 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue started 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue in AKey=PKEY_Link_Arguments (Caption: Arguments, CanonicalName: System.Link.Arguments, Type: VT_LPWSTR) 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue out Result=E_INVALIDARG 
    TMyLinkExtension.07BA12F0.IPropertyStore.GetValue finished 
TMyLinkExtension.07BA12F0 is destroyed 

J'ai essayé de jouer avec des valeurs différentes mais ne peux pas trouver le moyen de montrer mon fichier 1.mylnk dans le menu de démarrage, mais peut-être ce journal vous aidera.

+0

Donc ce journal est généré en ouvrant le menu Démarrer? Il collecte des détails sur votre raccourci, mais décide finalement de ne pas l'afficher? –

+0

Oui. Oui. Peut-être que je dois traiter plus de PropertyKeys dans mon échantillon (tous?) Pour forcer Explorer à afficher mon lien. –

+0

J'ai donc appelé le support client de Microsoft à ce sujet, et après des mois de délibération (littéralement), ils m'ont finalement rappelé c'était hors de portée. Ils ont recommandé d'afficher sur les forums de support client, donc je l'ai fait: https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/7c88d220-2363-4cfb-8ae1-87be143d85b7/custom-shortcut-filetypes? forum = windowsgeneraldevelopmentissues Les dernières informations suggèrent qu'il s'agit en fait d'un bug dans Windows Explorer. Recherchez deux commentaires récents avec le texte «un commentaire désinvolte» et «un autre moyen très concis de reproduire ce problème». –