SHChangeNotify в Windows 10 не обновляет элементы быстрого доступа - PullRequest
0 голосов
/ 30 апреля 2019

Похоже, что вызов SHChangeNotify в Windows не вызывает обновления элементов на панели QuickAccess (или любых папок настраиваемого пространства имен, расположенных в левой части Проводника).Похоже, что расширение дерева слева до папки работает нормально, как и все в главном представлении справа.

Мы вызываем SHChangeNotify из приложения ac # WPF, хотя SHChangeNotify кажется, чтовызовите нашу DLL-ловушку в проводнике просто для чего-либо в правильном представлении.В конечном итоге это вызовет именованный канал, который вернется в наш код на c #, чтобы вызвать обновление значка файла или папки.

Это то, что мы вызываем из c #:

[DllImport("shell32.dll", CharSet = CharSet.Auto)]
private static extern void SHChangeNotify(
    int wEventId,
    uint uFlags,
    IntPtr dwItem1,
    IntPtr dwItem2);

var ptr = Marshal.StringToHGlobalUni(fullPath);
SHChangeNotify((int)SHCNE.SHCNE_UPDATEITEM, (int)(SHCNF.SHCNF_PATHW | SHCNF.SHCNF_FLUSHNOWAIT), ptr, IntPtr.Zero);
Marshal.FreeHGlobal(ptr);

Можно предположить, что все константы и перечисления определены правильно.

Вот так выглядят значки: Example of mismatched icons

Обратите внимание, что серый значокзначок по умолчанию.Зеленый значок в главном окне был вызван вызовом функции выше с путем C:\Users\Test User\Pocket Test.Я думаю, что это должно вызвать обновление для обеих папок.

Я также пытался заменить SHCNF_FLUSHNOWAIT на SHCNF_FLUSH.Я в недоумении о том, как действовать здесь.Любые идеи о том, как принудительно обновить папки на левой панели в Проводнике?

1 Ответ

2 голосов
/ 01 мая 2019

Путь к виртуальной папке Quick Access в виде строки: shell:::{679f85cb-0220-4080-b29b-5540cc05aab6} (это имя guid CLSID_HomeFolder ).

Таким образом, вы можете принудительно обновить все элементы в этой виртуальной папке с помощью вызова:

SHChangeNotify(SHCNE_UPDATEDIR, SHCNF_PATHW, L"shell:::{679f85cb-0220-4080-b29b-5540cc05aab6}", NULL);

Если вы хотите обновить только определенный набор дочерних элементов, просто получите PIDL или путь к этим элементам и вызовите SHChangeNotify (SHCNE_UPDATEITEM, ...) для каждого.

...