Можно получить текст выбранного элемента в виде списка в обычном диалоге. Но нельзя получить его 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 неизбежно нарушает наш код. Я на самом деле не виню их за это - я нахожу неприятным то, что их новый, более элегантный интерфейс гораздо более закрыт, чем их старый - и они не предоставили больше открытых интерфейсов - поддерживаемых интерфейсов - для выполнения этих улучшений диалога , Как будто они сделали пару больших шагов назад - и ни одного шага вперед (во имя прогресса).