Как добавить вторичный глагол к типу файла в оболочке Windows? - PullRequest
9 голосов
/ 23 июня 2010

Основная идея программирования оболочки Windows заключается в том, что вы можете связать данный тип файла (расширение) с тем, что MS в настоящее время называет progid (например, Company.Type.Ver):

HKCR \ .txt @= Acme.Text.1

HKCR \ Acme.Text.1 @ = Это программа для ассоциаций текстовых файлов для Acme

И затем Acme Corp может поместить столько глаголов оболочки, сколько они захотяткак подразделы HKCR \ Acme.Text.1 \ shell, такие как HKCR \ Acme.Text.1 \ shell \ open.

Но если я XyzCorp, как мне добавить дополнительный глагол в текстовые файлы?

Я не хочу узурпировать основную ассоциацию файлов - я рад, что она ассоциирована с Acme.Text.1, но я хочу добавить «Импорт в Xyz Editor».

Я мог бы:
1. добавить глагол в progid Acme (например, HKCR \ Acme.Text.1 \ shell \ my-verb)
2. создать новый progid от нашего имени и скопировать данные Acme ви объединить глаголы XyzCorp в
3. добавить глаголы непосредственно к расширению файла (по крайней мере, один из них раньше)
4. ???

Кто-нибудь знает «правильный» ответ на этот вопрос?

РЕДАКТИРОВАТЬ: Я действительно не в восторге от любого решения, которое включает в себя необходимость изменить чужой PROGID.Я действительно предпочел бы добавить что-то - IContextMenu или что-то еще, кроме соответствующего PROGID для добавления дополнительных глаголов / опций к данному типу файла.

Кажется, что такая сумасшедшая система имеет ext->progid, если progid принадлежит отдельным разработчикам и может быть удален или изменен таким образом по желанию.Это кажется мне хрупким (удалить что-то и poof, расширение вашего файла перестает работать должным образом, или установить что-то и аналогично ваш вторичный глагол исчезает, потому что ext теперь сопоставлен с другим проприетарным PROGID, к которому я не добавлял наш глагол, когда мы былиустановлен (не, в то время, ничего не зная об этом другом пока еще не существующем progid)), и просто тупой.По прошествии всего этого времени все эти версии Windows и Microsoft так и не нашли способ иметь слои обработчиков для данного типа файлов?Действительно?!?

Я просто нахожу это изумление!Младшее программирование 101 включает в себя изучение шаблонов команд или других многоуровневых / каскадных систем.Сами Windows WinProcs организованы в виде шаблонов команд - так, что от внутреннего контекста окна до внешнего, многие возможные обработчики получают трещину в данном MSG.

Конечно, есть способ добавить глаголэто относится к нескольким расширениям без переопределения первичной ассоциации progid расширений, которая сама по себе полностью независима от первичного расширения-> progid mapping (так что пользователь может устанавливать несколько программ со временем и при этом иметь доступ к вторичному глаголу для этого файла).type).

Полагаю, я могу посмотреть на HKCR. * ... Я понимаю, что там можно добавлять глаголы, которые применяются ко всем типам файлов.Но тогда мне нужно найти какой-нибудь способ фильтрации, чтобы наш глагол действительно присутствовал только для тех типов файлов, к которым мы должны обратиться ...

Ответы [ 2 ]

12 голосов
/ 20 мая 2012

Это возможно, и это очень легко сделать (если вы знаете, где искать).Магия заключается в ключе HKEY_CLASSES_ROOT\SystemFileAssociations.Здесь вы найдете много подразделов, названных в честь расширений файлов.Просто создайте желаемые ключи оболочки / открытия / команды под ними.

Вот пример файла реестра, показывающий структуру.Если вы сохраните его как файл .reg и импортируете его, то вы получите команду «Импорт в Xyz Editor», добавленную ко всем файлам .txt, без влияния на основную ассоциацию файлов:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt]

[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt\shell]

[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt\shell\xyz-import]
@="Import into Xyz Editor"

[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt\shell\xyz-import\command]
@="notepad.exe \"%1\""

Также в HKCR\SystemFileAssociatons есть несколько ключей, не названных в честь расширений: «текст», «изображение», «видео» и т. Д. Они соответствуют записям PerceivedType для расширений в HKCR.Например, HKCR\.png\PerceivedType установлен на «изображение», как и HKCR\.jpg\PerceivedType, поэтому вы можете добавить обработчики в HKCR\SystemFileAssociations\image, которые будут отображаться для всех типов «изображения».

5 голосов
/ 25 июня 2010

Безымянное значение (по умолчанию или стандартное значение) под ключом расширения файла может быть progID, но не обязательно. Это действительно просто идентификатор. Это нормально, если вы добавляете свои глаголы под идентификатором типа файла, даже если похоже, что там есть имя другого человека. В следующих параграфах рассматривается каждый из вариантов.

1. добавить глагол к проге Acme (например, HKCR \ Acme.Text.1 \ shell \ my-verb)

Этот получает мой голос. Это просто и эффективно. Обновление / переустановка программного обеспечения ACME не повлияет на глаголы, которые вы добавили в тип / progid файла ACME. Удаление программного обеспечения Acme обычно не удаляет ваши глаголы, так как деинсталляторы обычно не удаляют разделы реестра, содержащие подключи, которые они не создавали.

2. создайте новый progid от нашего имени и скопируйте в него данные Acme и объедините глаголы XyzCorp в этот

Это будет работать во время изменения, но перестанет работать, когда программа Acme будет обновлена ​​/ переустановлена ​​- программа установки не будет знать, как обновить общий тип файла. Точно так же, когда деинсталлятор Acme запущен, он не удалит глаголы, поэтому они будут повесить команды на несуществующий путь.

3. добавить глаголы непосредственно к расширению файла (по крайней мере, один из них раньше)

Я только что попробовал это на Win XP SP3, и, к сожалению, это не сработало. Глаголы должны быть установлены под ключом типа файла, а не ключом расширения файла.

4. ???

Вы можете создать обработчик ContextMenu - это расширение оболочки и требует реализации интерфейсов COM. Обзор отличий и преимуществ обработчиков контекстного меню от простых глаголов, настроенных в реестре, описан в Контекстное меню оболочки .

Краткое описание Для простоты я бы пошел с # 1. Установщик XYZCorp может проверить, существует ли тип файла для расширения файла, и, если это так, добавляет глаголы под существующим типом, или он создает новый тип файла, если он не существует, и регистрирует глаголы под этим.

...