我有一个当前正在运行的代码(C#,但并不重要),它通过创建快捷方式文件[{{来向 Windows 8 开始屏幕添加磁贴1}}]在.lnk
和%APPDATA%\Microsoft\Windows\Start Menu\Programs
等特殊目录中。我搜索并找到了一些有用的工具,如lnk-parser
和OblyTile,它们有助于清除所涉及的怪癖的几个方面。我还发现了许多与该主题相关的文章和问题,但没有一个完全满足我的具体需求。
我正在使用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
课程是一个普通的课程。围绕ShellLink
和IShellLink
COM 界面的无聊包装。它运作得很好,我完全确定问题不存在。
IPropertyStore
答案 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;