Получить истинное имя выбранного в данный момент файла в диалоговом окне "Общий файл"?

StackOverflow https://stackoverflow.com/questions/1757093

Вопрос

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

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

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

Раньше мы полагались на тот факт, что версии диалогового окна common file для Windows 9x, 2000 и XP сохраняли PIDL каждого элемента в данных LVITEM (оригинал предоставлен Полом Дилашиа).:

LPCITEMIDLIST pidlItem = (LPCITEMIDLIST)pListCtrl->Получить данные (nItem);

Однако, начиная с общих элементов управления Vista и выше, этот метод дает сбой : (

Есть какие-нибудь мысли?

Редактировать:Мне нужно иметь возможность получать эту информацию не только для текущего выбранного элемента в виде списка, но и для всех элементов в виде списка.

РЕДАКТИРОВАТЬ 2:Причина, по которой мне нужно копать так глубоко:

В предыдущих версиях нашего приложения мы предоставляли возможность:(1) Нажмите пользовательскую кнопку "Предварительный просмотр", которая закрывает диалоговое окно, но передает приложению список элементов, отображаемых в данный момент в представлении, в их видимом порядке, вместе с индексом того, который в данный момент выделен.Этот список должен быть указан полностью - просмотр 3 файлов, которые все являются "J1329192" (когда на самом деле есть 3 файла "J1329192.xyz", "J1329192.xzy" и "J1329192.zyx" [в таком порядке), бесполезен.

Пользователям разрешается вводить фильтр частичного имени файла в поле "имя файла:", и в общем диалоговом окне будут показаны только файлы, соответствующие данному частичному фильтру, в порядке сортировки, выбранном пользователем.Таким образом, чтобы сообщить приложению именно то, что пользователь хотел просмотреть, требуется, чтобы мы могли запросить эту информацию из элемента управления просмотром списка (или из самого общего диалогового окна).

Мы также вносим другие улучшения в диалоговое окно файла, включая встроенную панель предварительного просмотра, которая показывает текущий выбор пользователя в виде миниатюры, а также пользовательский интерфейс недавних размещений и т.д.Все это было возможно (с большим трудом) до появления Vista.Post Vista, я натыкался стеной на стену.В настоящее время мы используем стандартное диалоговое окно файла с очень небольшим количеством собственных функций, что не нравится клиентам (что случилось с функцией X?!).

Есть и другие улучшения, но это хороший приблизительный обзор.И все они сводятся к требованию знания вопроса "действительно, честно говоря, какой конкретно файл находится в представлении с индексом X?" И по неизвестным причинам - Microsoft, похоже, не чувствует необходимости предоставлять такой интерфейс.На самом деле они никогда этого не делали.Только благодаря некоторому взлому и обратному проектированию мы смогли выяснить, как все работает под капотом, и получить необходимую информацию.И да, это не поддерживается, и да, MS неизбежно нарушила наш код.Я на самом деле не виню их за это - что я действительно нахожу неприятным, так это то, что их новый, более изящный интерфейс гораздо более закрыт, чем их старый, и они не предоставили более продвинутых интерфейсов - поддерживаемых интерфейсов - для выполнения этих улучшений диалогового окна.Как будто они сделали пару больших шагов назад - и ни одного вперед (во имя прогресса).

Это было полезно?

Решение

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top