В контекстных меню рабочего стола и компьютера очень удобно иметь различные программы и инструменты для быстрого доступа. Проблема лишь в том, что по мере добавления новых пунктов в меню, оно разрастается, и ориентироваться в нем становится все труднее.
В этой статье я расскажу, как создать в контекстных меню раскрывающиеся (каскадные) меню, которые будут содержать собственные наборы программ и административных средств.
Каждый пункт меню будет снабжен значком, чтобы можно было легко найти нужное приложение.
На этой странице:
- Обзор
- Регистрация команд в реестре
- Создание раскрывающегося меню и добавление в него пунктов
- Создание раскрывающегося меню с несколькими уровнями вложенности
- Упорядочивание пунктов контекстного меню рабочего стола и компьютера
- Готовые наборы раскрывающихся меню
Обзор
Для работы раскрывающегося меню нужны две составляющих:
- команды, которые выполняются при щелчке по пункту меню
- меню, раскрывающее список пунктов
Сначала я расскажу, как зарегистрировать в реестре собственные команды. По сравнению со способом добавления отдельных пунктов меню, о котором я рассказывал здесь, такой подход имеет два преимущества:
- Единожды зарегистрировав команду, ее можно вызывать из любого меню, если их несколько.
- Управление пунктами меню значительно упрощается.
Следуя простым пошаговым инструкциям, через 10 минут вы создадите собственное раскрывающееся меню, которое показано на рисунке ниже.
В конце статьи вы также найдете готовые наборы раскрывающихся меню.
Регистрация команд в реестре
Сначала мы зарегистрируем команды, которые будут выполняться при щелчке по пункту меню. Откройте редактор реестра и приступим!
- Перейдите в раздел
- В этом разделе создайте подразделы для каждой программы или команды, которую вы хотите видеть в меню. Названия подразделов могут быть любыми, но обязательно латинскими и без пробелов. В моем примере создается три подраздела:
- regedit
- taskmgr
- devmgmt
- В каждом из созданных подразделов дважды щелкните параметр (По умолчанию) и в качестве значения задайте имя ярлыка, которое вы хотите видеть в меню. Например, для подраздела regedit я задал имя Редактор реестра.
- Если вы хотите, чтобы рядом с названием отображался значок, создайте там же строковый параметр Icon и в качестве значения укажите исполняемый файл или библиотеку с номером ресурса. Я указал regedit.exe, чтобы использовать стандартный значок редактора реестра.
- Теперь задайте команду для пункта меню. В каждом разделе, который вы создали на шаге 2, создайте подраздел с именем command. Затем дважды щелкните параметр (По умолчанию) и в качестве значения укажите путь к программе. Например, для редактора реестра я указал regedit.exe (полный путь не нужен, поскольку исполняемый файл находится в системной папке).
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\Shell
В реестре должна получиться такая картина:
Создание раскрывающегося меню и добавление в него пунктов
Теперь нужно в реестре создать меню и добавить в него пункты, которые будут служить для вызова команд.
- В зависимости от того, где вы хотите создать раскрывающееся меню, выберите раздел.
- для меню «Компьютер» перейдите в раздел:
HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell
- для меню рабочего стола перейдите в раздел:
HKEY_CLASSES_ROOT\DesktopBackground\Shell
- для меню «Компьютер» перейдите в раздел:
- Щелкните правой кнопкой мыши по разделу shell и выберите пункт Создать – Новый раздел. Имя для раздела можно выбрать любое, но оно обязательно должно быть латинское. Назовите его, например, Menu1. В этом разделе будут созданы следующие строковые параметры.
- Параметр MUIVerb (обязательно) отвечает за название раскрывающегося меню, поэтому значение можете выбирать любое. Я назвал свое Система.
- Параметр SubCommands (обязательно) содержит список указателей для команд, которые будут выполняться из меню. Названия указателей должны соответствовать названиям подразделов реестра, которые вы создали на шаге 2 в предыдущем разделе статьи. Разделяйте указатели точкой с запятой (;) и перечисляйте их в том порядке, в котором вы хотите видеть пункты в меню. Чтобы вам было проще понять, я приведу свой список:
- Параметр Icon (необязательно) задает значок для раскрывающегося меню. Можно задать путь к библиотеке (dll) и номер ресурса (значка), либо полный путь к исполняемому файлу (если он в системной папке, достаточно указать только имя). Для своего меню «Система» я задал значок imageres.dll,104 (сначала начала имя файла, а через запятую – номер ресурса).
- Параметр Position (необязательно) отвечает за расположение раскрывающегося меню в контекстном меню. Вы можете задать ему значение Top (вверху) или Bottom (внизу). Если значение не задавать, раскрывающееся меню окажется в середине контекстного меню. Я расположил свое меню внизу.
- Параметр Extended (необязательно) отвечает за отображение пункта в меню. Когда параметр присутствует, чтобы увидеть созданный пункт, нужно вызывать контекстное меню, удерживая нажатой клавишей SHIFT. Этому параметру не требуются значения.
regedit;taskmgr;devmgmt
Таким образом, у меня в меню будут редактор реестра, диспетчер задач и диспетчер устройств.
Если вы хотите создать два меню, создайте раздел Menu2 и повторите шаги 3 – 7. Таких меню можно сделать сколько угодно.
Давайте посмотрим, что получилось в реестре.
Кстати, уже все готово! В контекстном меню компьютера появилось раскрывающееся меню «Система» со списком пунктов.
Если вы запутались или у вас что-то не получается, удалите созданные разделы и параметры, а затем импортируйте приведенный ниже REG-файл (он добавляет раскрывающееся меню в контекстное меню компьютера).
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Menu1] "MUIVerb"="Система" "SubCommands"="regedit;taskmgr;devmgr" "Icon"="imageres.dll,104" "Position"="Bottom" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\regedit] @="Редактор реестра" "Icon"="regedit.exe" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\regedit\command] @="regedit.exe" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\taskmgr] @="Диспетчер задач" "Icon"="taskmgr.exe" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\taskmgr\command] @="taskmgr.exe" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\devmgr] @="Диспетчер устройств" "Icon"="devmgr.dll,4" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\devmgr\command] @=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\ 00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,6d,00,6d,00,\ 63,00,2e,00,65,00,78,00,65,00,20,00,2f,00,73,00,20,00,25,00,53,00,79,00,73,\ 00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,00,5c,00,73,00,79,00,73,00,\ 74,00,65,00,6d,00,33,00,32,00,5c,00,64,00,65,00,76,00,6d,00,67,00,6d,00,74,\ 00,2e,00,6d,00,73,00,63,00,00,00
Теперь вы можете увидеть, какая структура должна быть в реестре.
Создание раскрывающегося меню с несколькими уровнями вложенности
Выше я продемонстрировал, как создать раскрывающееся меню со списком пунктов. Эти пункты тоже можно сделать раскрывающимися, т.е. возможно создание вложенных меню, как показано на рисунке ниже.
Как видите, в меню есть пункт «Диск», который в свою очередь раскрывает меню с утилитами для обслуживания диска. Он отделен от остальных пунктов разделителем, хотя это не очень хорошо видно на рисунке, поскольку пункт выделен. Дальше я расскажу, как создать такое меню на основе уже изложенного выше материала.
- В разделе реестра
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\Shell
создайте ярлыки для двух новых пунктов (Дефрагментация диска и Очистка диска), следуя инструкциям в разделе статьи «Регистрация команд в реестре». Я назвал подразделы defrag и cleanmgr.
- В том же разделе реестра создайте подраздел disk-menu (название может быть любым). Дальше все будет очень похоже на то, что вы проходили в первом разделе статьи.
- В подразделе disk-menu создайте строковые параметры:
- MUIVerb для названия меню, например, со значением Диск
- Icon для значка меню, например со значением imageres.dll,31
- SubCommands для ярлыков этого меню (в данном случае со значением defrag;cleanmgr)
- Если вы хотите использовать разделитель, создайте параметр REG_DWORD с именем CommandFlags и шестнадцатеричным значением:
- 20 для размещения разделителя над пунктом меню
- 40 для размещения разделителя под пунктом меню
Я задал значение 40, поскольку планирую сделать меню первым пунктом и отделить его от остальных.
В реестре должна получиться такая картина:
Вложенное меню готово, и осталось лишь указать на него ссылку в родительском меню, как было описано в разделе статьи «Создание раскрывающегося меню и добавление в него пунктов». Следуя моему примеру, в разделе
HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Menu1
параметр SubCommands должен принять следующий вид:
disk-menu;regedit;taskmgr;devmgmt
Таким образом, раскрывающееся меню будет содержать вложенное меню disk-menu (Диск) первым пунктом, а также три отдельных пункта: Редактор реестра, Диспетчер задач и Диспетчер устройств.
Если вы запутались или у вас что-то не получается, удалите созданные разделы и параметры, а затем импортируйте приведенный ниже REG-файл.
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Menu1] "MUIVerb"="Система" "SubCommands"="disk-menu;regedit;taskmgr;devmgr" "Icon"="imageres.dll,104" "Position"="Bottom" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\regedit] @="Редактор реестра" "Icon"="regedit.exe" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\regedit\command] @="regedit.exe" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\taskmgr] @="Диспетчер задач" "Icon"="taskmgr.exe" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\taskmgr\command] @="taskmgr.exe" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\devmgr] @="Диспетчер устройств" "Icon"="devmgr.dll,4" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\devmgr\command] @=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\ 00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,6d,00,6d,00,\ 63,00,2e,00,65,00,78,00,65,00,20,00,2f,00,73,00,20,00,25,00,53,00,79,00,73,\ 00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,00,5c,00,73,00,79,00,73,00,\ 74,00,65,00,6d,00,33,00,32,00,5c,00,64,00,65,00,76,00,6d,00,67,00,6d,00,74,\ 00,2e,00,6d,00,73,00,63,00,00,00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\cleanmgr] @="Очистка диска" "Icon"="cleanmgr.exe" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\cleanmgr\command] @="cleanmgr.exe" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\defrag] @="Дефрагментация диска" "Icon"="dfrgui.exe" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\defrag\command] @="dfrgui.exe" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\disk-menu] "MUIVerb"="Диск" "Icon"="imageres.dll,31" "CommandFlags"=dword:00000040 "SubCommands"="defrag;cleanmgr"
Более глубокий уровень вложенности достигается аналогичным образом. В параметре SubCommands для вложенного меню указывается ссылка на команду в разделе CommandStore, содержащую параметры следующего уровня вложенности.
Упорядочивание пунктов контекстного меню рабочего стола и компьютера
Если вы добавите в контекстное меню рабочего стола или компьютера несколько отдельных пунктов и/или раскрывающихся меню, то, возможно, у вас возникнет идея расположить их в определенном порядке. Выше я рассказывал, как задать расположение пункта в меню с помощью параметра Position. Но он влияет на позицию вашего пункта относительно стандартных (встроенных) пунктов контекстного меню, т.е. позволяет поместить пункт под ними, над ними или где-то в середине меню. Я также рассказывал, что порядок отдельных пунктов раскрывающегося меню можно задать с помощью параметра SubCommands, перечислив их там в желаемом порядке. Можно сортировать пункты раскрывающихся меню, и я покажу, как это сделать двумя различными способами.
Перечисление пунктов меню в параметре реестра
На примере меню рабочего стола я разберу самый сложный случай сортировки, внизу меню, где помимо своих пунктов играют роль встроенные. В меню рабочего стола у меня созданы три меню (Система, Администрирование и Стандартные программы).
У всех них задано одинаковое расположение внизу контекстного меню с помощью параметра Position.
Примечание. В меню рабочего стола упорядочивание работает только внизу (Position=Bottom) и в середине (Position отсутствует).
Однако мои меню перемежаются со стандартными пунктами (Разрешение экрана, Гаджеты и Персонализация), что не очень удобно. Это происходит потому, что пункты выстраиваются в алфавитном порядке соответствующих им подразделов реестра.
Чтобы изменить порядок меню, нужно прописать его в качестве значения для параметра (По умолчанию) в разделе
HKEY_CLASSES_ROOT\DesktopBackground\Shell
Дважды щелкните параметр (По умолчанию) и введите названия разделов меню в реестре в желаемом порядке через запятую:
Display,Gadgets,Personalize,WinApps,Admin,System
Если вы хотите убрать стандартные пункты из меню, придется удалить соответствующие им разделы, но я не рекомендую этого делать, конечно.
Алфавитный порядок разделов реестра, соответствующих пунктам меню
Описанным выше способом можно изменить порядок отдельных пунктов и раскрывающихся меню в контекстном меню компьютера. С той лишь разницей, что параметр (По умолчанию) изменяется в разделе
HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell
Однако при этом в меню компьютера стандартный пункт Открыть смещается вниз и не выделяется жирным, поскольку нарушается встроенный в систему порядок пунктов меню.
Если вас это не устраивает, просто удалите параметр (По умолчанию). Он будет восстановлен без значения, и пункт Открыть вернется на свое место.
Можно отсортировать пункты иначе, используя алфавитный порядок названий разделов собственных меню. Достаточно начать названия, например, с последней буквы латинского алфавита (z) и цифры, определяющей порядок пункта.
В принципе, этот же способ можно использовать и для сортировки меню рабочего стола.
Готовые наборы раскрывающихся меню
Я подготовил наборы REG-файлов, с помощью которых вы сможете создать любое из трех раскрывающихся меню (или все сразу) в контекстных меню рабочего стола и компьютера. Раскрывающиеся меню имеют один уровень вложенности.
Для управления меню используется оболочка BS Post Installer.
Вы можете:
- создать раскрывающиеся меню в контекстном меню рабочего стола или компьютера
- выбрать, где будет располагаться каждое раскрывающееся меню: вверху, внизу или посередине контекстного меню.
- удалить любое меню, если оно вас чем-то не устроит
Скачать наборы меню (примечание для владельцев 64-разрядных систем)
Я также создал архив с REG-файлами, которые использовались в статье в качестве образцов, включая и дополнительный уровень вложенности.
Vlad Anisimov
Вадим, спасибо Вам за очередную полезную статью.
Пытаюсь воспользоваться для создания вложенного меню для exe-файла, но… с вложенностью как-то не складывается. результат на скринах
это в реестре — https://yadi.sk/i/ymkM8-EGjxotQ
это в контекстном меню — https://yadi.sk/i/7cepsTOHjxp7K
что я делаю неправильно?
Vadim Sterkin
Влад, вся информация в статье. Возьмите пример > убедитесь в его работоспособности > замените значения.
Саша
Здравствуйте, Вадим! Огромное спасибо за статью. Реестр правил сам, в наборах много лишнего для меня, добавил только необходимое на рабочий стол. Помогите разделители вставить только, не получается никак. Их места я указал на скриншоте.Заранее спасибо. Win7x64
http://savepic.su/6620609m.htm
Vadim Sterkin
Саша, про разделители все написано в статье, мне нечего добавить.
ruslan
сделал все как в инструкции меню не раскрывается
ruslan
http://rghost.ru/69drKnQFy/image.png
Благояр Тишина
Position ещё бывает «Last».
Как отсортировать сами пункты меню (то бишь по алфавиту)?
Vadim Sterkin
1-Пункт
2-Пункт
БлагоѨръ
Это мне ответ?
Если да, то http://savepic.ru/8165847.png
Vadim Sterkin
Это мне вопрос? Если да, то алфавитному порядку посвящен отдельный раздел статьи.
Это мне скриншот? Если да, то на нем ничего не понятно, даже название раздела не видно.
И так далее…
БлагоѨръ
А можно ли ссылку на данную статью?
Vadim Sterkin
Вы же ее комментируете!
Не, сегодня точно особенный день…
БлагоѨръ
Наверно да, особый.
Где этот «отдельный раздел статьи»? Я что-то в упор не вижу. Особенно, если брать во внимание, что у вас на скриншотах все пункты выпадающего меню явно не по алфавиту.
Vadim Sterkin
https://www.outsidethebox.ms/10891/#alpha
БлагоѨръ
Не, ну это я читал, но, мне нужна сортировка программ, которые находятся внутри меню, а не сами меню.
Пробовал по аналогии с меню сортировать — результат нулевой.
Vadim Sterkin
В Subcommands перечисляйте в нужном порядке.
БлагоѨръ
Благодарю.
ПС. Ещё вопрос — можно ли эти меню спрятать под Shift и чтобы они были везде (и контекстном меню файла и папки и т.д.)
Vadim Sterkin
1. Корневые — можно, наверное, параметром Extended
2. Меню файлов и папок — HKEY_CLASSES_ROOT\AllFilesystemObjects, а «и т.д» — в статье.
БлагоѨръ
Как туда добавить? По аналогии, как в
HKEY_CLASSES_ROOT\DesktopBackground\Shell ?
Dao Keffer
Сделал так:
1) Создал общий Раскрывающийся пункт #1 (Программы)
2) В нем — раскрывающиеся подменю #2 и #3 (Графика, Видео) В каждом из этих подменю — по 10-12 отдельных элементов-программ.
3) При попытке добавить еще одно аналогичное раскрывающееся подменю #3 (Аудио) в дополнение к первым двум — в нем отображается лишь первый подпункт, который обозначен в SubCommands. Остальные не дает показать. Более того, если делаешь в SubCommands повторно ссылку на меню #1 (чтобы было как #1;#2;#1) — опять же отображается только 1 подпункт из #1. Это ограничение или что то не правильно сделано?
Vadim Sterkin
Не знаю, но чувство меры — полезная вещь :)
Dao Keffer
Конечно полезная, но все же хотелось бы выяснить почему так происходит. Где то заложено ограничение на 2 подменю видимо?
Vadim Sterkin
Я не буду разбираться, давно неинтересно. Почитайте комментарии.