2014-10-29 2 views
3

Я ищу способ легко скопировать данные файла, которые отображаются в проводнике Windows (просмотреть сведения о подробностях) и вставить его в виде табличного текста.Копирование сведений о файле из Explorer в виде табличного текста

В идеале процедура должна заключаться в том, чтобы выбрать некоторые файлы в проводнике, сделать выбор в контекстном меню (или использовать комбинацию клавиш), и список будет скопирован в буфер обмена. При вставке табличный формат будет сохранен, чтобы Excel распознавал столбцы или вкладки Word keep (или создавал таблицу).

Я хотел бы иметь решение, которое передает доступные столбцы, а не только предопределенные данные, такие как имя + размер + дата.

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

ответ

2

1) Создайте расширение оболочки контекстного меню. Он должен реализовывать IShellExtInit, IContextMenu (2,3) и IObjectWithSite. Зарегистрируйте расширение оболочки на клавише HKCR \ AllFilesystemObjects.

2) Перед тем, как Explorer вызывает IContextMenu.InvokeCommand, он вызывает IObjectWithSite.SetSite. Сохранить значение сайта.

3) Внутри IContextMenu.InvokeCommand:

Site.QueryInterface(IServiceProvider, ServiceProvider) 
ServiceProvider.QueryService(SID_SFolderView, IColumnManager, ColumnManager) 
ColumnManager.GetColumnCount(CM_ENUM_VISIBLE, Count) 
GetMem(Keys, SizeOf(PPropertyKey) * Count) 
ColumnManager.GetColumns(CM_ENUM_VISIBLE, Keys, Count) 

Теперь у вас есть массив всех видимых столбцов.

4) Извлечь IShellFolder текущей папки из объекта IDataObject, переданного вашему обработчику в IShellExtInit.Initialize.

5) Извлечь PItemIDList каждого файла в IDataObject.

6) Для каждого PItemIDList:

6,1) Позвоните ShellFolder.BindToObject (Ребенок, ноль, IPropertyStore, PropertyStore), чтобы получить PropertyStore пункта.

6,2) Для каждого PropertyKey в массиве ключей:

6.2.1) Позвони PropertyStore.GetValue (PropertyKey, Value);

6.2.2) Преобразование значения в строку с помощью функции PropVariantToStringAlloc.

6.2.3) Сохраните представление строки значения в вашем внутреннем хранилище txt.

7) Скопируйте хранилище txt в буфер обмена.

8) Бесплатно все ресурсы.

Update 1

Также вы можете попробовать использовать IShellFolder2.GetDetailsEx вместо использования IPropertyStore.

Update 2

В случае использования IPropertyStore вы можете дополнительно позвонить IPropertySystem.FormatForDisplayAlloc форматировать значение. Например, для PKEY_Size PropertyStore.GetValue возвращает «100000», но PropertySystem.FormatForDisplayAlloc будет форматировать значение до «100 КБ».

Update 3

Это было довольно интересная задачей, поэтому я создал свое собственное расширение оболочки, которая копирует детализирует в буфер обмена. Его можно загрузить по ссылке http://www.shellace.com/bin/CopyDetails.zip

+0

Выглядит хорошо заземленный, спасибо. Я попытаюсь реализовать, когда я заполнил пробелы. –

Смежные вопросы