У меня есть приложение, которое иногда динамически добавляет и удаляет записи из меню «Пуск» (и рабочего стола), помещая ярлыки (созданные с помощью WshShellClass
) в папку меню «Пуск» (Environment.SpecialFolder.StartMenu
). Если происходят такие изменения, я уже уведомляю оболочку об изменениях, используя SHChangeNotify
, как описано здесь . В частности:
private static void _RefreshWindowsDesktop()
{
// http://stackoverflow.com/a/647286/1600
NativeMethods.SHChangeNotify(NativeMethods.HChangeNotifyEventID.SHCNE_ASSOCCHANGED,
NativeMethods.HChangeNotifyFlags.SHCNF_FLUSH,
IntPtr.Zero, IntPtr.Zero);
}
Однако в Windows 10 поиск в меню «Пуск» часто прерывается (я никогда не видел такого поведения в Windows Vista или 7), где новый ярлык часто не отображается в течение нескольких дней, и в В свою очередь, старый ярлык, который был удален несколько дней назад, все еще отображается как «результат поиска». Вероятно, это связано с изменениями, заставляющими современные приложения появляться в меню «Пуск» вместе с классическими настольными приложениями, но я не уверен; онлайн руководства по этому вопросу откровенно поразят меня как вуду.
Хуже того, при вызове этого ярлыка Windows 10 просто не делает ничего - нет ошибки, указывающей, что ярлык нигде (потому что он не существует), а также Windows не изучает и не удаляет его впоследствии.
Итак, я надеюсь, что есть метод, похожий на SHChangeNotify
, чтобы явно указать Windows 10, что нужно сделать недействительным или перестроить кэш меню «Пуск», например, попросить его переиндексировать эту конкретную папку или попросить вручную добавить / удалить элемент из индекс.
Мое приложение - WPF, но если существует собственный метод, я могу определить версию ОС и затем условно вызвать ее. (Или даже написать внешнее фоновое приложение UWP для Windows 10 для запуска при необходимости.)