Получить истинное имя выбранного в данный момент файла в диалоге общего файла?
Текст выбранного элемента можно получить в виде списка в обычном диалоге. Но нельзя получить его PIDL, и если пользователь решил скрыть известные расширения (по умолчанию), то невозможно точно сказать, какой файл был выбран без его расширения или его PIDL.
Таким образом, возможные пути решения этой проблемы могут быть:
- Получите IShellView из стандартного диалога открытия файла. Базовый IShellView может сказать, что такое PIDL для текущего выбора. Так что, если бы я мог просто получить IShellView, я был бы золотым. К сожалению, я не вижу CDM_xxx, который бы это сделал. И я не могу думать с головой о чем-либо, что могло бы достигнуть этого!!!:(
- Какая-то другая идея?!
Мы привыкли полагаться на тот факт, что версия диалогового окна общего файла для Windows 9x, 2000 и XP сохраняла PIDL каждого элемента в данных LVITEM (оригинальная благодарность Полу ДиЛасксии):
LPCITEMIDLIST pidlItem = (LPCITEMIDLIST) pListCtrl-> GetItemData (nItem);
Однако, начиная с общих элементов управления Vista и выше, эта техника не работает:(
Какие-нибудь мысли?
РЕДАКТИРОВАТЬ: мне нужно иметь возможность получить эту информацию не только для текущего выбранного элемента в представлении списка, но и для всех элементов в представлении списка.
EDIT2: причина, по которой мне нужно копать так глубоко:
В предыдущих версиях нашего приложения мы предоставляли возможность: (1) Нажать пользовательскую кнопку "Предварительный просмотр", которая закрывает диалоговое окно, но передает приложению список элементов, отображаемых в данный момент в представлении, в их видимом порядке, а также индекс того, который в настоящее время выделен. Этот список должен быть полностью указан - просмотр 3 файлов, которые все являются "J1329192" (когда действительно есть 3 файла "J1329192.xyz", "J1329192.xzy" и "J1329192.zyx" [в этом порядке), не является полезным.
Пользователям разрешено вводить частичный фильтр имени файла в поле "имя файла:", а в общем диалоговом окне будут отображаться только файлы, которые соответствуют заданному частичному фильтру, в порядке сортировки, выбранном пользователем. Таким образом, чтобы сообщить приложению о том, что именно пользователь хотел просмотреть, требуется, чтобы мы могли запрашивать эту информацию из элемента управления представлением списка (или самого общего диалога).
Мы также вносим другие улучшения в диалог файлов - в том числе панель предварительного просмотра на месте, которая отображает текущий выбор пользователя в виде эскиза, а также настраиваемый интерфейс недавних мест и т. Д. Все это было возможно (с большим количеством работы) до Vista. После Vista я врезался в стену за стеной. В настоящее время мы используем стандартный файловый диалог с очень немногими собственными функциями, который не устраивает клиентов (что случилось с функцией X?!)
Есть и другие улучшения, но это хороший примерный обзор. И все они сводятся к требованию знания "действительно, если честно, какой файл конкретно находится в представлении индекса X?" И по неизвестным причинам - Microsoft, похоже, не чувствует необходимости предоставлять такой интерфейс. На самом деле они никогда не делали. Только благодаря некоторому взлому и обратному инжинирингу мы смогли выяснить, как все работает под капотом, и получить необходимую информацию. И да, это не поддерживается, и да, MS неизбежно нарушает наш код. Я на самом деле не виню их за это - я нахожу неприятным то, что их новый, более элегантный интерфейс гораздо более закрыт, чем их старый, - и они не предоставили больше открытых интерфейсов - поддерживаемых интерфейсов - для выполнения этих улучшений диалога, Как будто они сделали большую пару шагов назад - и ни одного шага вперед (во имя прогресса).
3 ответа
Отправьте WM_USER+7, чтобы получить браузер, а затем получите интерфейс IShellView его активной оболочки.
Вы знаете обычные последствия использования недокументированного поведения, верно?
Ах, я нашел это. Вы хотите использовать IFileOpenDialog
для Vista, которая должна явно поддерживать все упомянутые вами операции.
Я знаю, что это старая тема, но в Vista + диалоги в старом стиле все еще поддерживаются. Вы можете отключить стиль Vista и сохранить все свои собственные элементы управления, как и раньше. Вот что мы делаем: у нас есть пользовательское окно предварительного просмотра в шаблоне, подключенное к CFileDialog, которое невозможно воспроизвести в IFileDialog.
Я считаю, что вам нужно передать FALSE в параметре BOOL в конструкторе, чтобы отключить диалоги в стиле Vista.