SHGetPropertyStoreForWindow - 如何在现有System.AppUserModel.ID上设置属性

时间:2015-01-30 01:55:24

标签: winapi ipropertystorage

所以我通过IPropertyStore通过SHGetPropertyStoreForWindow将我的窗口从主标签组拆分为:

IPropertyStore_SetValue(pps, PKEY_AppUserModel_ID.address(), 'Contoso.Scratch');
pps->Commit();

然后,用户稍后决定要重命名,以便使用我的功能:

IPropertyStore_SetValue(pps, PKEY_AppUserModel_RelaunchCommand, customLaunchPath);
IPropertyStore_SetValue(pps, PKEY_AppUserModel_RelaunchDisplayNameResource, 'my first name');
pps->Commit();

这是第一次成功运作。但如果他想再次更改RelaunchCommandRelaunchDisplayNameResource,除非我同时更改ID,否则它将无法正常工作。

我在此提供了RelaunchCommandRelaunchDisplayNameResource,在我的实际案例中,用户还希望更改图标但同样的问题,它每次ID首次使用。无论如何要多次运行而不必每次都更改ID

由于

PS: 这个解决方案的另一个重要原因是我的一个窗口已经有一个System.AppUserModel.ID并且已经固定。我想只更改icon / relaunchCommand / etc,如果我更改了System.AppUserModel.ID,那么它将有效地取消它。 :(

1 个答案:

答案 0 :(得分:2)

此主题的解决方案是我正在使用的解决方法:

Detecting Application Pin State

在设置属性之前,我通过查看以下文件夹来测试它是否被固定:

  • %AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\ImplicitAppShortcuts
  • %AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar

我在所有快捷方式上做了IPropertyStore::getValue,如果它与我的AppUserModelID匹配,那么我就更改了图标,标签等,立即在任务栏中更新它。

这样可行,但我会不接受这个解决方案,因为它没有记录,所以可能不是正确的方法。

如果在快捷方式中找不到AppUserModel.ID,我只是在我的应用程序的窗口上IPropertyStore::setValue(我必须在每个窗口上做,我无法找到一种方法来完成整个过程应用程序)