2010-06-23 2 views
7

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

HKCR \ .txt @ = Acme .Text.1

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

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

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

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

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

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

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

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

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

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

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

ответ

9

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

Вот пример файла реестра, показывающего структуру. Если сохранить это как файл .reg и импортировать его, то вы получите команду «Импорт в АБВ Редактор» добавлен ко всем файлам с расширением .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, который появится для всех типов «изображений».

+0

Это выглядит чрезвычайно интригующим. Если это работает для XP +, тогда я золотой! Waaaaay лучше любого из предыдущих решений! Бонус для «воспринимаемого типа»! – Mordachai

+0

@Mordachai: он работает для XP +; не уверен, работает ли он до XP или если XP был, когда он был добавлен. – Boann

+0

Этот ответ был очень полезен, спасибо! :) – CptRobby

5

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

1. добавить глагол ProgID Acme в (например HKCR \ Acme.Text.1 \ оболочки \ мой глагола)

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

2. создать новый ProgID на обоих наших behalfs и скопировать данные ACME на что, и объединить глаголы XyzCorp в в этом

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

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

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

4. ???

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

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

+0

Контекстное меню оболочки по-прежнему основано на регистрации ключей и значений в реестре под ProgID, связанных с расширением файла. Итак, я не понимаю, как можно создать параметр контекстного меню, который появляется для данного расширения без изменения чужой ProgID? – Mordachai

+0

Мое голосование за изменение существующего прогей-кода, если оно присутствует - первый вариант. Возможно, я смутил проблему, отметив, что это не всегда progID - просто идентификатор типа файла. (Например, .txt имеет 'txtfile' как идентификатор типа файла.) Но, как бы мы это ни называли, это существующая регистрация, и это важная часть! :) – mdma

+0

@Mordachai - Я просто перечитаю ваш комментарий - я неправильно понял первый раз. Вы можете зарегистрировать обработчик контекстного меню для всех типов файлов и затем программно управлять, когда отображаются глаголы (например, путем проверки расширения файла.) См. Http://msdn.microsoft.com/en-us/library/cc144175%28v= VS.85% 29.aspx – mdma

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

  • Нет связанных вопросов^_^