Я меняю тег папки, создавая или изменяя файл desktop.ini в Windows 10.
Без уведомления ОС о том, что ей необходимо каким-либо образом обновиться, тегу требуется неопределенное количество времени, чтобы отразить изменение в проводнике Windows.
Я пытаюсь использовать функцию Windows API, чтобы уведомить ОС об изменении атрибута в папке, но это не приводит к обновлению проводника Windows. Были опробованы следующие комбинации:
[DllImport("shell32.dll")]
static extern void SHChangeNotify(HChangeNotifyEventID wEventId,
HChangeNotifyFlags uFlags,
IntPtr dwItem1,
IntPtr dwItem2);
public static void Refresh1()
{
var ptr = Marshal.StringToHGlobalUni(@"C:\tmp\test");
SHChangeNotify(HChangeNotifyEventID.SHCNE_ATTRIBUTES, HChangeNotifyFlags.SHCNF_PATHW, ptr, IntPtr.Zero);
Marshal.FreeHGlobal(ptr);
}
public static void Refresh2()
{
var ptr = Marshal.StringToHGlobalUni(@"C:\tmp\test\desktop.ini");
SHChangeNotify(HChangeNotifyEventID.SHCNE_DELETE, HChangeNotifyFlags.SHCNF_PATHW, ptr, IntPtr.Zero);
Marshal.FreeHGlobal(ptr);
}
public static void Refresh3()
{
var ptr = Marshal.StringToHGlobalUni(@"C:\tmp\test\desktop.ini");
SHChangeNotify(HChangeNotifyEventID.SHCNE_UPDATEITEM, HChangeNotifyFlags.SHCNF_PATHW, ptr, IntPtr.Zero);
Marshal.FreeHGlobal(ptr);
}
public static void Refresh4()
{
var ptr = Marshal.StringToHGlobalUni(@"C:\tmp\test");
SHChangeNotify(HChangeNotifyEventID.SHCNE_UPDATEITEM, HChangeNotifyFlags.SHCNF_PATHW, ptr, IntPtr.Zero);
Marshal.FreeHGlobal(ptr);
}
public static void Refresh5()
{
var ptr = Marshal.StringToHGlobalUni(@"C:\tmp\test");
SHChangeNotify(HChangeNotifyEventID.SHCNE_RENAMEFOLDER, HChangeNotifyFlags.SHCNF_PATHW, ptr, IntPtr.Zero);
Marshal.FreeHGlobal(ptr);
}
public static void Refresh6()
{
var ptr = Marshal.StringToHGlobalUni(@"C:\tmp\test");
SHChangeNotify(HChangeNotifyEventID.SHCNE_RENAMEFOLDER, HChangeNotifyFlags.SHCNF_PATHW, ptr, ptr);
Marshal.FreeHGlobal(ptr);
}
Основываясь на комментариях ниже, я попробовал другой подход к маршалингу и множеству перестановок...
[DllImport("shell32.dll")]
static extern void SHChangeNotify(HChangeNotifyEventID wEventId, HChangeNotifyFlags uFlags, [MarshalAs(UnmanagedType.LPWStr)] string dwItem1, [MarshalAs(UnmanagedType.LPWStr)] string dwItem2);
public static void Refresh1()
{
var str = @"C:\tmp\test";
SHChangeNotify(HChangeNotifyEventID.SHCNE_ATTRIBUTES, HChangeNotifyFlags.SHCNF_PATHW, str, str);
}
public static void Refresh2()
{
var str = @"C:\tmp\test";
SHChangeNotify(HChangeNotifyEventID.SHCNE_UPDATEITEM, HChangeNotifyFlags.SHCNF_PATHW, str, "");
}
public static void Refresh3()
{
var str = @"C:\tmp\test";
SHChangeNotify(HChangeNotifyEventID.SHCNE_UPDATEITEM, HChangeNotifyFlags.SHCNF_PATHW, str, str);
}
public static void Refresh4()
{
var str = @"C:\tmp\test";
SHChangeNotify(HChangeNotifyEventID.SHCNE_ATTRIBUTES, HChangeNotifyFlags.SHCNF_PATHW, str, "");
}
Я также пробовал HChangeNotifyEventID.SHCNE_UPDATEDIR
в качестве опции для первого параметра, но это также не помогло обновить проводник Windows.
Как изменить тег папки таким образом, чтобы он автоматически обновлялся в проводнике Windows?
- Это способ изменить код выше, чтобы сделать это?
- Является ли их другой функцией Windows API, которую я должен вызывать для обновления Windows Explorer после изменения desktop.ini (хотя название этого подразумевает, что он должен выполнять эту работу...)?
- Должен ли я использовать определенный вызов API Windows только для того, чтобы напрямую изменить тег, который имеет встроенное уведомление для ОС?
SHCNF_PATHA
(0x0001) вместоSHCNF_PATHW
(0x0005)? - person Remy Lebeau   schedule 15.04.2021SHGetSetFolderCustomSettings()
вместо прямого измененияdesktop.ini
: Эта функция... отправляет все необходимые уведомления сама по себе. Хотя я не думаю, что это поддерживает теги. - person Remy Lebeau   schedule 15.04.2021SHCNE_DELETE
, указав путь к самому файлуdesktop.ini
. - person Remy Lebeau   schedule 15.04.2021SHCNE_RENAMEFOLDER
с обоими путями, установленными на один и тот же путь к папке - person Remy Lebeau   schedule 15.04.2021SHCNE_UPDATEITEM
с путем к папке. - person Remy Lebeau   schedule 15.04.2021void SHChangeNotify(SHCNE wEventId, SHCNF uFlags, [MarshalAs(UnmanagedType.LPWStr)] string dwItem1, [MarshalAs(UnmanagedType.LPWStr)] string dwItem2)
Я бы использовал SHCNE_UPDATEITEM и SHCNF_PATHW в файле desktop.ini - person Simon Mourier   schedule 15.04.2021SHCNE_UPDATEITEM
иSHCNF_PATHW
в файле desktop.ini, но это не привело к обновлению - добавлено к моему вопросу о попытках - person Sam   schedule 15.04.2021SHCNE_UPDATEITEM
с путем к папке также не требует обновления - person Sam   schedule 15.04.2021SHCNE_RENAMEFOLDER
также не форсировал обновление. Вопрос обновлен. - person Sam   schedule 15.04.2021SHCNE_RENAMEFOLDER
, попробуйте указать путь к папке для обоих входных путей, как я упоминал ранее:SHChangeNotify(SHCNE_RENAMEFOLDER, SHCNF_PATHW, ptr, ptr)
А вы пытались удалитьMarshal.StringToHGlobalUni()
, как предложил Саймон? - person Remy Lebeau   schedule 15.04.2021SHCNF_IDLIST
вместоSHCNF_PATHW
? Вы можете использоватьSHParseDisplayName()
или аналогичную функцию для преобразования строки пути вITEMIDLIST
. - person Remy Lebeau   schedule 15.04.2021SHGetSetFolderCustomSettings
API. Ссылка: Пользовательские значки папок с desktop.ini и мгновенным обновлением - person Song Zhu   schedule 15.04.2021SHFOLDERCUSTOMSETTINGS
(2) даже тогда мне, вероятно, понадобится небольшой пример C #, чтобы помочь мне начать работу - я никогда не понимал всех этих C ++ указатели - person Sam   schedule 15.04.2021SHGetSetFolderCustomSettings
в C#. - person Song Zhu   schedule 15.04.2021SHGetSetFolderCustomSetting
работает как в примере, но я не знаю, какая комбинация настроек изменит тег папки - наибольший интерес и примеры относятся к значку файла - person Sam   schedule 15.04.2021string
тега, который мне нужен для папки, в структуре данныхSHFOLDERCUSTOMSETTINGS
- person Sam   schedule 15.04.2021desktop.ini
. - person Song Zhu   schedule 16.04.2021