Получить истинное имя текущего выбранного файла в диалоговом окне общих файлов? - PullRequest
3 голосов
/ 18 ноября 2009

Можно получить текст выбранного элемента в виде списка в обычном диалоге. Но нельзя получить его PIDL, и если пользователь решил скрыть известные расширения (по умолчанию), то невозможно точно сказать, какой файл был выбран без его расширения или его PIDL.

Итак, возможные пути решения этой проблемы:

  1. Получить IShellView из стандартный диалог открытия файла. лежащий в основе IShellView может сказать, что PIDL для текущего выбор. Так что, если бы я мог просто получить У меня есть IShellView золотой. К сожалению не вижу CDM_xxx, который бы это сделал. И я не могу думать с макушкой всего, что могло бы достичь этого !!! :(
  2. Какая-то другая идея?!

Мы привыкли полагаться на тот факт, что версия диалогового окна общего файла для 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 ]

2 голосов
/ 18 ноября 2009

Отправить WM_USER + 7 , чтобы получить браузер, а затем получить интерфейс IShellView его активной оболочки.

Вы знаете обычные последствия использования недокументированного поведения, верно?

1 голос
/ 10 мая 2012

Я знаю, что это старый поток, но в Vista + диалоги старого стиля все еще поддерживаются. Вы можете отключить стиль Vista и сохранить все свои пользовательские элементы управления, как и раньше. Вот что мы делаем: у нас есть пользовательское окно предварительного просмотра в шаблоне, подключенное к CFileDialog, которое невозможно воспроизвести в IFileDialog.

Я считаю, что вам нужно передать FALSE в параметре BOOL в конструкторе, чтобы отключить диалоги в стиле Vista.

1 голос
/ 19 ноября 2009

Ах, я нашел это. Вы захотите использовать IFileOpenDialog для Vista, которая должна явно поддерживать все те операции, которые вы упомянули.

...