Здравствуйте, S_V_B, Вы писали:
S_V>Мне нужно кастомизировать контекстное меню explorer-a в зависимости от элемента, который выбран в данный момент.
S_V>Если выбран файл или папка (и я по ним кликаю правой кнопкой), я узнаю его(ее) полный путь с помощью функции DragQueryFile.
А если выбраны и файл и папка?
S_V>Как узнать, какая папка выбрана, если я кликаю правой кнопкой в пустом месте explorer-a?
Для того чтобы обрабатывать клик на пустом месте, нужно регистрировать соответствующим образом свою компоненту. Конкретно здесь — Directory\Background\shellex\YourShellExHandler
Re[2]: Как узнать выбранную папку в IContextMenu.QueryContex
Если выбран и файл, и папка или несколько файлов, то DragQueryFile возвращает весь список выбранных файлов (папок).
S_V>>Как узнать, какая папка выбрана, если я кликаю правой кнопкой в пустом месте explorer-a?
AF>Для того чтобы обрабатывать клик на пустом месте, нужно регистрировать соответствующим образом свою компоненту. Конкретно здесь — Directory\Background\shellex\YourShellExHandler
Да, я так и делаю (регистрирую компоненту в смысле), и правый клик у меня обрабатывается, событие в QueryContextMenu приходит и здесь я могу добавить нужные мне команды, но мне их нужно добавлять в зависимости от выбранного каталога (в левом дереве в эксплоере). А как его узнать, я пока не понял.
В данном сценарии DragQueryFile не возвращает выбранный каталог.
Re[3]: Как узнать выбранную папку в IContextMenu.QueryContex
Здравствуйте, S_V_B, Вы писали:
S_V>Да, я так и делаю (регистрирую компоненту в смысле), и правый клик у меня обрабатывается, событие в QueryContextMenu приходит и здесь я могу добавить нужные мне команды, но мне их нужно добавлять в зависимости от выбранного каталога (в левом дереве в эксплоере). А как его узнать, я пока не понял. S_V>В данном сценарии DragQueryFile не возвращает выбранный каталог.
В метод IShellExtInit::Initialize Вам передаются два параметра: LPCITEMIDLIST pidlFolder и IDataObject *pdtobj, причём один из них равен нулю. Если кликнули по файлу или папке, то нулю равен первый, а если по подложке — второй. В этом случае получить путь к папке можно с помощью SHGetPathFromIDList.
"Нормальные герои всегда идут в обход!"
Re[4]: Как узнать выбранную папку в IContextMenu.QueryContex
Здравствуйте, Jolly Roger, Вы писали:
JR>Здравствуйте, S_V_B, Вы писали:
S_V>>Да, я так и делаю (регистрирую компоненту в смысле), и правый клик у меня обрабатывается, событие в QueryContextMenu приходит и здесь я могу добавить нужные мне команды, но мне их нужно добавлять в зависимости от выбранного каталога (в левом дереве в эксплоере). А как его узнать, я пока не понял. S_V>>В данном сценарии DragQueryFile не возвращает выбранный каталог.
JR>В метод IShellExtInit::Initialize Вам передаются два параметра: LPCITEMIDLIST pidlFolder и IDataObject *pdtobj, причём один из них равен нулю. Если кликнули по файлу или папке, то нулю равен первый, а если по подложке — второй. В этом случае получить путь к папке можно с помощью SHGetPathFromIDList.
Огромное спасибо! Все получилось.
Re[4]: Как узнать выбранную папку в IContextMenu.QueryContex
Здравствуйте, Jolly Roger, Вы писали:
JR>Здравствуйте, S_V_B, Вы писали:
S_V>>Да, я так и делаю (регистрирую компоненту в смысле), и правый клик у меня обрабатывается, событие в QueryContextMenu приходит и здесь я могу добавить нужные мне команды, но мне их нужно добавлять в зависимости от выбранного каталога (в левом дереве в эксплоере). А как его узнать, я пока не понял. S_V>>В данном сценарии DragQueryFile не возвращает выбранный каталог.
JR>В метод IShellExtInit::Initialize Вам передаются два параметра: LPCITEMIDLIST pidlFolder и IDataObject *pdtobj, причём один из них равен нулю. Если кликнули по файлу или папке, то нулю равен первый, а если по подложке — второй. В этом случае получить путь к папке можно с помощью SHGetPathFromIDList.
Столкнулся с еще одной проблемой:
Если я кликаю по файлу или папке, то путь я пытаюсь получить следующим образом:
JR>>Попробуйте тип hDrop поменять на IntPtr.
S_V>Попробовал, к сожалению, не помогло. S_V>На x86 продолжает работать, а на x64 — нет :(
На х64 в DragQueryFile может передаваться пустой hDrop. Причина в том, что hDrop неправильно получается. А получается он неправльно из-за неверно определённых структур для x64. В System.Runtime.InteropServices.ComTypes есть нужные структуры для получения hDrop.
int IShellExtInit.Initialize (IntPtr pidlFolder, IntPtr lpdobj, uint hKeyProgID)
{
try
{
m_dataObject = null;
if (lpdobj != (IntPtr)0)
{
m_dataObject = (System.Runtime.InteropServices.ComTypes.IDataObject)Marshal.GetObjectForIUnknown(lpdobj);
System.Runtime.InteropServices.ComTypes.FORMATETC format = new System.Runtime.InteropServices.ComTypes.FORMATETC();
format.tymed = System.Runtime.InteropServices.ComTypes.TYMED.TYMED_HGLOBAL;
format.lindex = -1;
format.ptd = (IntPtr)0;
format.dwAspect = System.Runtime.InteropServices.ComTypes.DVASPECT.DVASPECT_CONTENT;
format.cfFormat = 15;
System.Runtime.InteropServices.ComTypes.STGMEDIUM med = new System.Runtime.InteropServices.ComTypes.STGMEDIUM();
m_dataObject.GetData(ref format, out med);
m_hDrop = (uint)med.unionmember;
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
return 0;
}