Windows资源管理器和自定义快捷方式文件

时间:2016-08-17 17:09:01

标签: windows explorer file-type startmenu

Windows在文件注册中有一个名为“IsShortcut”的标志。设置此标志后,文件将自动获得快捷图标覆盖,并以其他方式视为快捷方式(例如,当您右键单击并选择“创建快捷方式”时,它只是复制文件而不是生成.lnk文件)。 Microsoft将此功能用于ClickOnce应用程序引用(扩展名.appref-ms)。

我们将此功能用于我们自己的软件的自定义快捷方式文件类型,我们发现自Windows 10(或可能是Windows 8)以来,我们的自定义快捷方式不会显示在“开始”菜单中。当然,“开始”菜单列出了.lnk个文件,而 也包含了.appref-ms个文件,但是我们自己的文件格式,其注册与{{1}没有明显不同从“开始”菜单中排除文件。快捷方式文件实际存在于“开始”菜单文件夹结构(.appref-ms)中,但Windows资源管理器将忽略这些文件。其他快捷方式类型(%APPDATA%\Microsoft\Windows\Start Menu\Programs.lnk)会显示在同一目录中。

我正在寻找的是Windows资源管理器如何确定它将包含在开始菜单中的文件格式的一些指示,以便在开发自定义格式时,可以以相同的方式指示。我们的自定义格式在Windows XP,Windows Vista和Windows 7中运行良好,但由于某种原因,较新的“开始”菜单设计排除了我们的文件格式,即使它以与.appref-ms文件相同的方式标记为IsShortcut

这可能吗? : - )

2 个答案:

答案 0 :(得分:2)

要在Windows 10开始菜单中显示链接,必须实现IPropertyStore.GetValue并为PKEY_AppUserModel_ID属性返回一些唯一的字符串。

要在Windows 10开始菜单中显示图标,必须实现IExtractIconW.GetIconLocation,并且具有CLSID类(即HKEY_CLASSES_ROOT \ CLSID {42465C3A-83D3-4310-B27D-F271DE372764})的注册表项的所有者必须为“ NT Service \ TrustedInstaller”

以下是示例实现(增强的Jonathan Gilbert代码): https://github.com/publee/CustomShortcutFileType

答案 1 :(得分:1)

(这不是答案,但可以帮助您进行调查。)

我创建并注册了自己的shell链接扩展。资源管理器重新启动后,它使用我的扩展并通过IPropertyStore接口询问不同的属性。完整日志:

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

我尝试使用不同的值,但仍无法找到在开始菜单中显示我的1.mylnk文件的方法,但也许此日志可以帮助您。