Главная > Уголок гика > Вся правда о меню Win+X в Windows 8

Вся правда о меню Win+X в Windows 8

Одной из самых невзрачных, но чрезвычайно полезных функций Windows 8 Consumer Preview (в отсутствие-то меню Пуск, да) является меню Win+X. Имя своё оно получило благодаря сочетанию клавиш, которыми оно вызывается, и ещё известно под сценическим псевдонимом "Power User Menu". Несмотря на амбициозное позиционирование, ни "повер", ни какой-либо ещё юзер не сможет в это меню ничего добавить. Система упорно игнорирует пользовательские ярлыки. Давайте разберемся, откуда растут корни такой вопиющей несправедливости, и попробуем изменить ситуацию.

Предыстория

Установив Windows 8, я сразу обнаружил пресловутое меню, применив свои уже хорошо известные читателю приёмы поиска секретов Windows. И сразу же выяснил, что в этом меню невозможно добавить свои ярлыки.

SysInternals Procmon показывал вроде бы очевидные вещи - процесс Explorer.exe мирно шерстит папку %LOCALAPPDATA%\Microsoft\Windows\WinX, перечитывая папку за папкой на предмет файлов с расширением *.lnk. Я пробовал подложить туда свой ярлык, и Проводник, весело шурша не совсем свежим"ВД" 4хлетней давности, заглотил наживку. Но нажав Win+X, в списке программ я своего ярлыка не обнаружил. При этом Procmon не показывал ничего специфического или необычного.

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

Час "Х" для меню Win+X

4го апреля широко известный в определенных кругах блогер и хакер Рафаэль Ривера сорвал покровы тайны с принципов построения злосчастного меню. В своём блоге Рафаэль пишет:

Пункты меню представляют собой обычные ярлыки (.lnk-файлы), находящиеся в папках вида Group<Цифра>. Вы не сможете добавить сюда собственные ярлыки, потому что система отображает только "одобренные" ярлыки. Почему? Да потому что Microsoft всячески препятствует появлению подобия меню "Пуск", которое так тщательно удалялось из Windows 8, или использованию этого меню в качестве аналога панели Quick Launch по тем же соображениям.

"Одобренный" ярлык, получивший это прозвище с легкой руки Рафаэля, - это обычный lnk-файл, содержащий в себе пометку в виде 4-хбайтного хеша, полученного по нескольким строковым значениям:

1. Полный путь к файлу, на который ссылается ярлык (например, с:\games\quake3\qauke3.exe)

2. Аргументы запуска программы (в теме предыдущего примера - +connect q3.playground.ru)

3. Третья строка - это жестко прошитый текст, буквальное содержимое которого - "Do not prehash links. This should only be done by the user."

Соединяя эти три строки воедино, Windows приводит их к нижнему регистру и считает по ним хэш при помощи функции HashData. Этот хеш записывается непосредственно в сам .lnk-файл.

Большинство из нас воспринимает эти файлы как "обычные ярлычки", но на деле - это сложные объекты, описанные в MSDN как Shell Links. Эти объекты позволяют сохранять массу дополнительной информации. В частности, они поддерживают хранение структур данных вида "Ключ - значение", известных как PropertyStoreDataBlock.

Именно здесь и хранится хэш ярлыка:

DEFINE_PROPERTYKEY(PKEY_WINX_HASH,
0xFB8D2D7B, 0x90D1, 0x4E34, 0xBF, 0?60, 0x6E, 0xAC, 0?09, 0?92, 0x2B, 0xBF, 0?02);

Располагая этой информацией, можно формализовать следующий алгоритм построения меню Win+X:

  1. Проводник последовательно перебирает папки %LOCALAPPDATA%\Microsoft\Windows\WinX\Group1-GroupN
  2. В каждой папке он находит файлы .lnk
  3. Если файлы найдены, для каждого файла считается хэш.
  4. Считывается значение хэша из самого lnk-файла и сравнивается с подсчитанным в п.3. Если они совпадают - ярлык считается одобренным и отображается в меню Win+X.

Так как же добавить собственный ярлык в меню Win+X

Совершенно очевидно, что нужно

  1. создать ярлык или взять готовый с рабочего стола, например;
  2. поместить его в папку %LOCALAPPDATA%\Microsoft\Windows\WinX\Group1 (или создать свою папку/папки, к примеру Group4);
  3. записать хэш в этот ярлык.

Вот только последнее средствами Windows выполнить нельзя.

Рафаэль для этих целей реализовал консольную утилиту hashlnk (исходники), которая записывает хэш в .lnk файл. Пользоваться ей так:

 hashlnk.exe "полный\путь\к файлу.lnk"

После этого следует перезапустить Проводник. Вуаля:

Внимание! Под Windows 8 x64 замечен глюк - иногда требуется применить hashlnk дважды, чтобы добавленный вами ярлык начал отображаться в меню Win+X. Просто запустите утилиту два раза.

Создание новых групп программ в меню Win+X

Это очень просто. По умолчанию папка %LOCALAPPDATA%\Microsoft\Windows\WinX содержит три поддиректории - Group1, Group2 и Group3. Эти папки, как вы уже догадались, и отображаются как группы в меню Win+X. Создайте папку Group4, чтобы добавить в него новую группу. Создавая папки по принципу Group<Максимальная цифра+1>, вы можете добавить столько групп, сколько вам нужно. После этого в них можно размещать ярлыки, не забывая применить hashlink.

Несколько слов об именах пунктов меню Win+X

Внимательный читатель наверняка уже отметил, что существует некоторая разница в отображении программ в меню Win+X и в физическом названии файлов. На картинке выше мы видим, что вторая группа содержит ярлыки "Run", "Search" и т.п., но физически файлы имеют совершенно иные имена!

Мне известно два способа задания имени пункта меню Win+X.

Переименование пункта меню Win+X с использованием файла Desktop.ini

Это - классика жанра. Создадим в меню Win+X новую группу, и поместим туда мой любимый Far Manager.

Теперь создадим в этой же папке файл Desktop.ini с таким содержимым:

[LocalizedFileNames]
Far Manager 2 x64.lnk=Файловый менеджер

Т.е. в секции [LocalizedFileNames] нужно прописать каждый ярлык в виде Имя файла.lnk=Отображаемое имя.

Внимание! Чтобы файл desktop.ini вступил в действие, нужно установить папке Group4 атрибут "Read only". Причем, средствами Проводника Windows 8 у вас этого сделать не получится. Флажок в "Свойствах папки" отрабатывает некорректно, вы можете в этом убедиться сами. Поэтому я установил пресловутый атрибут из Far Manager.

После этого следует опять перезапустить Проводник. Результат:

Подобным образом вы можете переименовать любой из присутствующих ярлыков в меню Win+X.

Переименование пункта меню Win+X с использованием комментария ярлыка

Этот способ предполагает, что в файле Desktop.ini нет записи для текущего ярлыка, потому что desktop.ini имеет приоритет над комментарием ярлыка. Поэтому в демонстрационных целях я удалю созданный ранее desktop.ini, и продолжу эксперименты над ярлыком Far Manager.

Если у ярлыка, фигурирующего в меню Win+X, присутствует комментарий (и для него нет записи в desktop.ini, я подчеркиваю это), то в меню появится не имя ярлыка, а именно его комментарий.

Перезапустив Проводник, получаем следующий результат:

Выделка овчинки

"Столько возни из-за какого-то ярлыка! Да овчинка выделки не стоит!" - возмутится читатель, и будет прав. Я тоже счел такое количество телодвижений неоправданным, и поэтому создал программу, позволяющую управлять составом ярлыков меню Win+X.

Это Win+X Menu Editor:

Программа позволяет

  • Добавлять и удалять группы
  • Добавлять и удалять ярлыки
  • Сортировать порядок отображения ярлыков
  • Можно вернуть состав меню по умолчанию.

С этой программой вы можете настроить меню Win+X просто и быстро. Программа использует утилиту hashlnk Рафаеля Риверы для генерации хэша ярлыков.

Скачать Win+X Menu Editor можно с форума о Windows или c Winaero(страница на английском языке).


Что ж, корпорация Майкрософт активно борется со всем, что функционально схоже с классическим меню "Пуск" и старается минимизировать возможности тонкой (да и "толстой", в общем-то, тоже) настройки грядущей версии Windows. Подобно Windows Phone, в Windows 8 присутствуют механизмы, предотвращающие несанкционированные модификации системных файлов и даже добавление ярлыков, способные загнать в ступор даже бывалого любителя твиков и хаков.

Мне бы хотелось услышать мнение читателя относительно политики настройки системы. Считаете ли вы реализацию подобных ограничений правильным шагом со стороны Майкрософт? И ещё, пользуетесь ли вы меню Win+X?

Winreview.ru можно найти в Вконтакте, Facebook и Twitter. Присоединяйтесь!

Комментарии

  1. Вадим Стеркин

    Сергей, большое спасибо за интересный материал! Срыв покровов засчитан )

    Я бы поставил способ с комментарием ярлыка на первое место, т.к. это интересная находка, да и меньше телодвижений требуется. Кстати, атрибут "Только для чтения" папке можно задать командой

    attrib +r c\folder

    Ололо на эту тему мне доставили в блоге не далее чем вчера, и в связи с этим я расширил раздел Почему у папок флажок «Только для чтения» имеет три состояния в статье про атрибуты. Там как раз объясняется, почему флажок в GUI работает так, а не иначе.

    Если же говорить о новой фиче, то очевидно, что Microsoft не хочет разрастания меню, это ты верно подметил. Вопрос лишь в том, не начнут ли производители ПО использовать hashlinks для пропихивания своих программ в меню. Так, в Windows 7 не было предусмотрено стандартного механизма для закрепеления ярлыков в меню "Пуск", иначе все бы это делали сразу.

    Впрочем, у Win+X есть и недостаток - оно может расти только в высоту. В меню рабочего стола и компьютера можно создать раскрывающиеся меню со своими программами.

  2. Анатолий

    Считаю отказ MS от "Пуск" просто неразумным. Это не заставит нас щелкать "мышью" по "кафельным" плиткам на настольных компьютерах.

  3. Вадим Стеркин

    Анатолий, ничто не мешает вам сделать свое меню, например, в Pstart.

  4. Сергей Ткаченко

    @Анатолий

    В настоящий момент существует масса способов, как вернуть практические родное меню Пуск. Вот тут есть подборка рецептов "Как включить меню "Пуск" в Windows 8 Consumer Preview", в частности "Stardock Start8" выглядит довольно интересным решением.

    Но я согласен с вами, мне отказ от меню Пуск откровенно претит.

  5. Сергей Ткаченко

    @Вадим Стеркин

    Рад, что статья понравилась. Уточнение про команду attrib мне стоит добавить в статью, так как Far или что-то подобное другое может быть не у всех.

    По поводу выпадающего меню рабочего стола, на мой взгляд, опять слишком много возни.

    Я эту проблему для себя решил так

    1 .создал символическую ссылку на общее меню "Пуск"

    mklink /j "C\Users\sergei\desktop\Start Menu" "c\ProgramData\Start Menu" 
    

    2. Включил в свойствах панели задач стола тулбар "Desktop"

    3. Теперь у меня на панели задач есть "общее для всех меню", что меня устраивает, так как лишь за редким исключением тот софт, которым я пользуюсь, не помещает сюда своих ярлыков.

    Ты мне сейчас подал идею можно создать утилиту, которая будет читать меню Пуск, и помещать его в контекстое меню рабочего стола Автоматически, дублируя структуру папок )

  6. Mphs

    Сергей, спасибо! Познавательно.

    Давно интересует один вопрос. Если из панели управления перетащить какой-нибудь пункт, получается довольно необычный ярлык. Там нет привычного пути и нельзя его менять http//s47.radikal.ru/i116/1204/cc/da1a52eba066.jpg

    Не пытались разобраться, как такой получается и как создать самому?

  7. Сергей Ткаченко

    Как такой получается, я не скажу.

    Но можно посмотреть, что у него внутри, и это даст ответ, как его создать.

    Сейчас попробую

  8. Вадим Стеркин

    @Сергей Ткаченко , да, я обычно в форуме и советую создавать панель, когда вижу очередное нытье на тему отсутствия в 7 меню пуск "как в ХР".

    Но, кстати, в общее меню могут попасть не все ярлыки, если инсталлятор уныл или юзер сам себе режиссер при установке.

    Насчет утилиты, там в комментах кто-то писал, что общее кол-во пунктов одного родительского меню ограничено 16 элементами.

  9. Сергей Ткаченко

    @Вадим Стеркин
    Раньше здесь, на винревью, была статья про то, как это ограничение обойти. Доработаю её применительно к Win+X и опубликую, если, конечно, это ограничение действительно имеет место быть, и если старые трюки ещё работают.

  10. Сергей Ткаченко

    @Mphs

    Вобщем, ничего сложного. Там используется shell-объект в качестве места, куда ссылается ярлык.

    То, что вы спрашивали, т.е. Центр обновления, вызывается вот этим объектом

    Win+R ->

    {26EE0668-A00A-44D7-9371-BEB064C98683}\5\{36EEF7DB-88AD-4E81-AD49-0E313F0C35F8}
    - >Enter

    Или, например, Центр поддержки

    Win+R ->

    {26EE0668-A00A-44D7-9371-BEB064C98683}\5\{BB64F8A7-BEE7-4E1A-AB8D-7D8273F7FDB6}
    - >Enter

    Список этих команд можно найти в реестре, они описаны как ActiveX со свойством Shell Folder.

    Пример с Центром обновлений

    HKEY_CLASSES_ROOT\CLSID\{36eef7db-88ad-4e81-ad49-0e313f0c35f8}

    HKEY_CLASSES_ROOT\CLSID\{36eef7db-88ad-4e81-ad49-0e313f0c35f8}\ShellFolder

    В своей статье Панель навигации Проводника изнутри функционирование и состав я их описывал, принцип, я полагаю, понятен.

    Именно вот такие "Ярлыки только для чтения" я, к сожалению, не подскажу как создать.

  11. Mphs

    @Сергей Ткаченко

    Ага, принцип понятен. Спасибо!

    Если разгадка про создание таких найдётся, будет очень интересно узнать.

  12. Сергей Ткаченко

    Средствами операционной системы их никак не создать.

    Программно они создаются вызовом IShellLinkSetIDList (via MSDN)

    Пример на до-диез

  13. Дмитрий

    Как по мне никакой обрезок Вин+Х не заменит пуска с 7ки с поиском. Если уже МС приняло такое решение его убрать, то надо или привыкать или искать решения от сторонних разработчиков. Ситуация аналогичная с интерфейсом офиса начиная с 2007. Назад дороги нету. На западе по другому растравлены приоритеты чем у нас. МС знает что на 8ку не перейдет корпоративная среда, с десктопов заработка немного, а от планшеты рынок сладок. А для них пуск не катит никак - попробуйте пальцем попадать в тьму маленьких ярлыков. Палец не **й однАка. От пусть каждый и сделает для себя вывод.

  14. Mphs

    @Сергей Ткаченко

    Всё понятно, спасибо! Наверное, я надеялся на нечто более готовое )

  15. Анатолий

    @Вадим Стеркин

    Да я то сделал. Но нет, нет полного функционала а ля Vista/7.

  16. Aleksey

    @Вадим Стеркин
    Добрый день, мне понравилось решение от компании iObit "Start Menu 8" которое возвращает меню «Пуск» в Windows 8. Этот умный инструмент возвращает и кнопку «Пуск», и меню «Пуск» ОС Windows, и предоставляет возможность пропустить стартовую страницу «Metro», позволяя пользователям, работающим только на рабочем столе, загружаться непосредственно на рабочий стол Windows 8. Это — лучшая замена меню «Пуск» для Windows 8. Скачать можно по данной ссылке http//ru.iobit.com/iobitstartmenu8/ P/S www.digi-mas.ru Скорая компьютерная помощь в Советской Гавани.

  17. Сергей Ткаченко

    @Aleksey
    Я не жадный, потому одобряю рекламу.

    А иобит этот на любителя. Уж лучше пользоваться программой Classic Shell.

Написать комментарий