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
Выглядит хорошо заземленный, спасибо. Я попытаюсь реализовать, когда я заполнил пробелы. –