Windows 8启动屏幕磁贴,基于桌面快捷方式

时间:2014-06-04 15:20:16

标签: c# windows-8 shortcut windows-shell tile

我有一个当前正在运行的代码(C#,但并不重要),它通过创建快捷方式文件[{{来向 Windows 8 开始屏幕添加磁贴1}}]在.lnk%APPDATA%\Microsoft\Windows\Start Menu\Programs等特殊目录中。我搜索并找到了一些有用的工具,如lnk-parserOblyTile,它们有助于清除所涉及的怪癖的几个方面。我还发现了许多与该主题相关的文章和问题,但没有一个完全满足我的具体需求。

我正在使用IShellLink (COM互操作)来创建快捷方式,并IPropertyStore (相同的对象实例)添加一些显然需要的链接文件的属性。我的具体问题和疑问是:

创建的图块几乎在每个方面都按预期工作。它运行预期的命令,具有预期的背景和前景色,并显示自定义关联图标 %LOCALAPPDATA%\Microsoft\Windows\Application Shortcuts 图像144x144)。问题是,即使它在链接文件[.png]中嵌入了自定义标签字符串,它也只显示物理文件的名称减去扩展名。这并不是那么可怕,但我更希望Windows能够通过文件名尊重嵌入式属性。

导致此类行为的链接文件中可能缺少什么而不是所需的行为?


加成

通过使用System.ItemTypeText,我遇到了几个所谓的“属性集”,它们只是按GUID分组的属性。我对集合 IPropertyStore {b725f130-47ef-101a-a5f1-02608c9eebac}{86d40b4d-9069-443c-819a-2a54090dccec}(后者包含无处不在的 {9f4c2855-9f79-4b39-a8d0-e1d42de1d5f3} )特别感兴趣。

额外问题:您能否指出任何记录这两个属性集中任何一个(或两个)的资源?我的意思是,每个属性意味着什么以及它们如何被Windows解释。这可能比主要问题更有帮助。无论是官方的还是非官方的。

注意

根据要求,使用System.AppUserModel.ID通过命令行调用它不是一个选项。根据我观察到的情况,我可能需要在链接的目标文件父目录中添加自定义OblyTile文件。如果可能的话,最好避免这种情况,因为格式没有记录。

示例代码

resources.pri课程是一个普通的课程。围绕ShellLinkIShellLink COM 界面的无聊包装。它运作得很好,我完全确定问题不存在。

IPropertyStore

1 个答案:

答案 0 :(得分:1)

function GetPropertyKeyCanonicalName(const AKey: TPropertyKey): UnicodeString;
var
  PropertySystem: IPropertySystem;
  PropertyDescription: IPropertyDescription;
  N: PWideChar;
begin
  Result := '';
  if Succeeded(CoCreateInstance(CLSID_IPropertySystem, nil, CLSCTX_INPROC_SERVER, IPropertySystem, PropertySystem)) then
    try
      if Succeeded(PropertySystem.GetPropertyDescription(AKey, IPropertyDescription, PropertyDescription)) then
        try
          if Succeeded(PropertyDescription.GetCanonicalName(N)) then
            try
              Result := N
            finally
              CoTaskMemFree(N);
            end;
        finally
          PropertyDescription := nil;
        end;
    finally
      PropertySystem := nil;
    end;
end;