Создать записи контекстного меню для данного расширения - PullRequest
0 голосов
/ 22 мая 2019

Можно создать пункты контекстного меню для проводника Windows для всех файлов, создав записи реестра, такие как

[HKEY_CLASSES_ROOT\*\shell\kdb-test]
@="Test (*,kdb-test)"
[HKEY_CLASSES_ROOT\*\shell\kdb-test\command]
@="cmd.exe /c type %1 & pause"

Также возможно создать их для заданного расширения.заменив \* \ на \.extension\.

Однако я обнаружил, что последний не работает надежно.Например,

[HKEY_CLASSES_ROOT\.regshelltest\shell\kdb-test]
@="Test (.regshelltest,kdb-test)"
[HKEY_CLASSES_ROOT\.regshelltest\shell\kdb-test\command]
@="cmd.exe /c type %1 & pause"

переопределит различие для *, как и предполагалось, но выполнение того же для .pdf или .txt не будет работать в моей системе.

Документация предлагает в качестве чистого решения использовать косвенную структуру вместо

[HKEY_CLASSES_ROOT\.txt]
@="PlainTextFile"
[HKEY_CLASSES_ROOT\PlainTextFile\shell\kdb-test]
@="Test (PlainTextFile,kdb-test)"
[HKEY_CLASSES_ROOT\PlainTextFile\shell\kdb-test\command]
@="cmd.exe /c type %1 & pause"

, но это тоже не работает.Кроме того, это снижает совместимость, поскольку настоятельно предполагает, что каждый, определяющий такие записи реестра, использует одно и то же имя типа файла для расширения (например, couter-example: .pdf устанавливается на PDFXChangeEdit.PDF), поэтому определение действий на основе расширения будетпредпочтительнее - особенно для созданных пользователем расширений оболочки.

Аналогичная проблема обсуждалась в « Ключи реестра для записей контекстного меню, но без записей контекстного меню », но там предлагается решениезапросить «ProgID» (т. е. тип имени файла, указанный ключом HKEY_CLASSES_ROOT\.extension), который у меня не работал.

Есть ли надежный способ создания этих записей контекстного меню на основефайловые расширения, которые не зависят от набора ProgID?

В качестве обходного пути, в « Добавьте пункт контекстного меню оболочки Windows для определенного расширения (не для типа файла) »Было предложено использовать клавишу \*\ с фильтром AppliesTo.Однако это скорее обходной путь, чем чистое решение, поэтому я ищу возможность чисто и надежно использовать интерфейс HKEY_CLASSES_ROOT\.extension\shell.

1 Ответ

1 голос
/ 22 мая 2019

В Windows XP добавлен метод добавления дополнительных глаголов к расширению файла без использования идентификатора программы; клавиша HKEY_CLASSES_ROOT\SystemFileAssociations .Вы можете зарегистрироваться для определенного расширения или предполагаемого типа файла (текст, видео и т. Д.).

Ненадежное размещение вашей регистрации непосредственно в ключе .extension, оно работает неправильно, если расширение работаетprog-id.

Размещение регистрации в prog-id является правильным способом сделать это, когда вы хотите изменить действие по умолчанию, и оно работало так, по крайней мере, с Windows 95. Что изменилось со временемОднако, как определяется идентификатор программы.В какой-то момент недокументированный ключ, связанный с проводником, начал контролировать, что такое расширение .exg для идентификатора прог-идентификатора, и чтобы приложения не могли изменять значения пользователей по умолчанию, теперь эта информация «зашифрована».

В настоящее время руководстворасширение, где вы хотите быть глаголом по умолчанию, вы регистрируете prog-id обычным способом и указываете расширение на этот prog-id.Если это расширение уже было запрошено другим prog-id, то пользователь должен вручную изменить значение по умолчанию, вы не можете сделать это программно.Возможно, вы захотите зарегистрироваться в Программы по умолчанию , чтобы ваше приложение появилось в пользовательском интерфейсе программ по умолчанию на панели управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...