Управление папками с фоновыми рисунками рабочего стола

Вам знаком вот такой диалог, не правда ли?

Пользователям Windows 7 и Windows 8 хорошо известна опция "Фоны рабочего стола Windows", содержащая в себе рисунки из нескольких папок, и упорядоченная по имени папки, в которой лежат картинки. Участник конференции Oszone EvolMate озадачился вопросом, как добавить в этот список собственную группу папок, и как повлиять на порядок группировки картинок. Ваш покорный слуга взялся ответить - в конце концов, здесь, на Winreview.ru, когда-то была статья как раз про это. Сообщество выразило интерес к теме и рекомендовало вернуть статью. Сейчас я попробую устранить недостатки прошлых лет и открою читателю "тайное знание", как говорит мой коллега Вадим Стеркин.

Сегодня в эфире:

Если заинтересовало - приглашаю под капот Windows.


В процессе чтения этой статьи вам, возможно, придется часто обращаться в различные разделы реестра. Чтобы ускорить этот процесс и сделать его удобным, узнайте, как можно выполнить переход в раздел реестра одним щелчком мышки.

Как формируется список фоновых рисунков Windows 7 и Windows 8

Знаете, что мне нравится в операционной системе Windows? Образно говоря, в ней есть гайки, которые можно крутить, но гайки эти накрыты крышкой "Обслуживается авторизованной мастерской". Многие пользователи засчитывают подобное как минус Microsoft и общей гибкости системы, но на самом деле это правильный подход: всё необходимое для комфортной эксплуатации ОС есть под рукой, всё остальное рядовому пользователю ни к чему. Веселая картинка как раз на эту тему.

Наш случай - это пример как раз таких "гаек". Список папок, из которых формируется список обоев рабочего стола, - динамический. В каких папках искать изображения, система узнает при помощи записей в системном реестре. Алгоритм следующий:

  • Система обращается к разделу
    [code]HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Wallpapers\KnownFolders[/code]
    Здесь могут быть подразделы вида 0, 1,2,...,N.
  • Разделы 0..N представляют собой непосредственно элементы выпадающего списка, которые видит пользователь при выборе источника обоев рабочего стола. Элемент "Фоны рабочего стола Windows" соответствует разделу
    [code]HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Wallpapers\KnownFolders\0[/code]
    Здесь, в списке разделах 0..N может присутствовать  параметр Name, задающий имя, которое увидит пользователь в выпадающем списке. По умолчанию это ссылка на строковый ресурс в DLL, файле, но допускается использование и обычной текстовой строки.
    Здесь же может присутствовать параметр GROUPBY, отвечающий за порядок группировки изображений в диалоге выбора фона рабочего стола. По умолчанию он имеет значение System.ItemFolderNameDisplay и соответствует группировке по имени папки. Мы его рассмотрим подробнее чуть позже.
  • В каждом из подразделов 0..N должен присутствовать подраздел с произвольным именем, назначение которого окутано мраком тайны. Как можно видеть на рисунке выше, для стандартных обоев он носит название "Windows Wallpapers". Однако, совершенно точно известно, что он должен содержать подраздел MergeFolders. Это краеугольный камень всего механизма представления фоновых рисунков в диалоге выбора обоев рабочего стола, именно здесь задаются папки, в которых система будет искать изображения. В общем случае пути к этим папкам задаются в виде имен параметров (а не их значений). Давайте посмотрим на стандартные "Фоны рабочего стола":

    Система работает с именами параметров, строя список картинок из перечисленных в MergeFolders папках.
  • Если система не обнаружила раздела
    [code]HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Wallpapers\KnownFolders
    [/code]
    То она обращается к разделу
    [code]HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\Wallpapers\KnownFolders
    [/code]
    В этом разделе порядок действий системы полностью повторяется.

Интересные факты

  • Раздел HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Wallpapers\KnownFolders имеет приоритет над аналогичным разделом HKEY_LOCAL_MACHINE. Если был обработан HKEY_CURRENT_USER, его брат-близнец будет полностью проигнорирован. Как оказалось, это поведение проявилось однократно только в Windows 8. Вероятно, это был какой-то сбой. Я тщательно изучил вопрос, правильное поведение систем Windows 7 и Windows 8 является таким:
    в диалоге выбора фонового рисунка появляются изображения из элементов 0, 1,.. N, которые прописаны как в HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Wallpapers\KnownFolders, так и в таком же разделе в HKEY_LOCAL_MACHINE.
    Например, касательно стандартной опции "Фоны рабочего стола", при её выборе вы увидите в диалоге все картинки из папок, прописанных в разделе
    [code]HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Wallpapers\KnownFolders\0[/code]
    и в разделе
    [code] HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\Wallpapers\KnownFolders\0[/code]
    Система объединяет содержимое папок, прописанных  в KnownFolders-подразделах в HKCU и HKLM с одинаковыми именами, то есть KnownFolders\0, KnownFolders\1 и так далее.
  • Это очевидно, но всё же - раздел в HKEY_CURRENT_USER служит для задания настроек для текущего пользователя, в то время как раздел в HKEY_LOCAL_MACHINE задает настройки для тех пользователей, у которых параметры в HKEY_CURRENT_USER могут вообще отсутствовать.
  • В Windows 8 в HKEY_CURRENT_USER вообще нет никаких записей касательно папок с обоями, а в Windows 7 здесь прописаны папки для региональных тем, если выпуск их поддерживает. Все настройки в Windows 8 берутся из ветки HKEY_LOCAL_MACHINE, но при этом, если создать раздел в HKEY_CURRENT_USER самостоятельно, он по-прежнему будет корректно работать!
    К слову, я все свои изыскания произвожу на ветке HKCU, созданной в Windows 8.

Как добавить собственные папки в группу изображений "Фоны рабочего стола Windows"

Наверяка вы уже догадались, что для выполнения этой задачи достаточно прописать собственную папку в соответствующих разделах:

  • если вы - пользователь Windows 7, или же  создаете параметры только для текущего пользователя в Windows 8, то в разделе
    [code]HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Wallpapers\KnownFolders\0\Windows Wallpapers\MergeFolders
    [/code]
  • если вы - пользователь Windows 8, или же управляете общесистемными настройками,  то в разделе
    [code]HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\Wallpapers\KnownFolders\0\Windows Wallpapers\MergeFolders
    [/code]

Прописывая в любой из этих систем что-либо в разделе HKEY_LOCAL_MACHINE, стоит лишний раз убедиться, что раздел в HKEY_CURRENT_USER у вас действительно отсутствует. В противном случае ничего не получится.

Порядок действий

  1. Закройте диалог выбора фонового рисунка.
  2. Создайте новый параметр строкового типа в соответствующем разделе MergeFolders, в качестве имени задав полный путь к папке с вашими изображениями. Пример:

    Примечание: если вы планируете использовать переменные окружения в пути к обоям (%USERPROFILE%, например), согласно спецификации на параметры реестра вам нужно создать параметр не просто строкового типа,а Expandable String Value, REG_EXPAND_SZ. Пожалуйста, соблюдайте требования к типу параметров во избежание непредвиденных проблем с ОС.
  3. Откройте диалог выбора фонового рисунка. Результат не заставит себя ждать:

 Как задать добавленной папке имя в диалоге выбора обоев, отличное от имени в файловой системе

Внимательный читатель уже заметил, что только что добавленная папка C:\Wallpapers отображается у меня в диалоге выше под именем Wallpapers, т.е. в точности также, как она называется на жестком диске. При этом мы видим, что системные папки отображаются с произвольными именами! Почему?

Ответ здесь кроется в системном файле desktop.ini. При формировании пресловутого диалога Windows считывает параметр [.ShellClassInfo]\LocalizedResourceName из этого файла, и использует его в качестве отображаемого имени папки с рисунками. Таким образом, если создать собственный файл desktop.ini, можно определить имя добавленной папки в диалоге выбора фонового рисунка.

Как вы, вероятно, можете знать, чтобы система "обращала внимание" на файл desktop.ini, у папки, в которой он находится, должен быть установлен либо атрибут "Только чтение", либо "Системная". Я предпочитаю использовать атрибут "Только чтение", и именно его я намерен поставить папке из моего примера. Средствами интерфейса Проводника установить этот атрибут для папки не получится, и здесь нам на помощь придет командная строка. Команда выглядит следующим образом:

[code]attrib +r c:\wallpapers[/code]

Теперь я создаю в папке c:\wallpapers при помощи обычного Блокнота файл desktop.ini вот с таким содержимым:

[code][.ShellClassInfo]
LocalizedResourceName=Windows 7 Beta Wallpapers[/code]

Результат:

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

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


Это проще простого. Вам достаточно создать в реестре новый раздел в ветке HKEY_CURRENT_USER или HKEY_LOCAL_MACHINE вида (напомню, в рамках этой статьи я работаю с веткой HKEY_CURRENT_USER)[code]HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Wallpapers\KnownFolders\N+1[/code]

Значение N определяется как максимальный уже имеющийся номер в названии раздел. В качестве примера я создам новую группу в выпадающем списке "Мои обои", и добавлю туда две папки.  У меня N - это ноль, значит, я создаю раздел 1, в нем создаю подраздел My Wallpapers\MergeFolders. Далее можно действовать согласно описанному выше, повторяя для новоиспеченного раздела все параметры и ключи, рассмотренные ранее. Напоминаю, вместо My Wallpapers может быть любая другая, произвольная строка. Это имя ничем не регламентируется. У меня получится так:

[code]Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Wallpapers\KnownFolders\1]
"Name"="Мои обои"
"GROUPBY"="System.ItemFolderNameDisplay"

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Wallpapers\KnownFolders\1\My Wallpapers]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Wallpapers\KnownFolders\1\My Wallpapers\MergeFolders]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Wallpapers\KnownFolders\1\My Wallpapers\MergeFolders]
"c:\\wallpapers\\win7"=""
"c:\\wallpapers\\bing"=""[/code]

Обратите внимание: значение по умолчанию в разделе HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Wallpapers\KnownFolders\1\My Wallpapers\MergeFolders должно быть не просто пустым - оно должно быть не задано.

Просто после создания раздела не трогайте параметр по умолчанию. Если в него вы внесете пустую строку, вы спровоцируете систему рекурсивно считать рабочую папку апплета панели управления, а это системная директория Windows\WinSxS.

После создания раздела 1 я получил вот такой набор опций в диалоге выбора фонового рисунка:

Имена папок берутся из desktop.ini аналогично тому, как я описал выше.

Отдельное внимание мне бы хотелось заострить на группировке изображений в окне выбора фонового рисунка.

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

Помните статью "Тонкая настройка расширений файлов в Windows 7"? Там я затрагивал такой аспект функционирования Проводника, как метаданные, или как они называются в MSDN - система свойств Windows, которые могут быть определены для файлов и папок. Параметр GROUPBY как раз и использует эти свойства в качестве правил группировки изображений в окне выбора фонового рисунка.

По умолчанию GROUPBY имеет значение "System.ItemFolderNameDisplay", что буквально означает "отображаемое имя папки". Это имя может не соответствовать реальному физическому имени файла, как мы с вами уже убедились на примере с файлом desktop.ini.

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

GROUPBY = System.ItemNameDisplay

Группиировка по отображаемому имени файла (т.е. имени, которое может быть также переопределено посредством desktop.ini):

GROUPBY = System.ItemType

Группировка по типу файла.

GROUPBY = System.ItemDate

Группировка по дате файла.

И так далее.

Подводя итог

Я не нахожу этой информации практического применения (и мне подчас всё равно, что там у меня на рабочем столе, я редко меняю стандартные обои). Это стало причиной, по которой статья покинула "новый" Winreview.ru.  Исследование принципов функционирования этого диалога было лично для меня интересным занятием, как впрочем и любое другое исследование, связанное с недокументированными возможностями настройки операционной системы. Не всегда стоит применять подобный материал на практике.
Участники конференции Oszone сподвигли меня вернуть материал, уверяя, что он найдет своего читателя. Надеюсь, что тебя, мой уважаемый читатель, я не разочаровал, потратив твое время на прочтение этой публикации.

💡Узнавайте о новых статьях быстрее. Подпишитесь на наши каналы в Telegram и Twitter.

Судя по тому, что вы читаете этот текст, вы дочитали эту статью до конца. Если она вам понравилась, поделитесь, пожалуйста, с помощью кнопок ниже. Спасибо за вашу поддержку!

Автор: Сергей Ткаченко

Сергей Ткаченко создал этот сайт в далёком 2009 году, и с тех пор продолжает над ним работать, публикуя новые материалы о Windows и её приложениях практически каждый день.

Управление папками с фоновыми рисунками рабочего стола: 24 комментария

  1. Спасибо, Сергей! Тема реестра раскрыта полностью!

    Позволь мне дополнить материал с точки зрения GUI 😉

    1. Самый простой способ добавить свои обои в упорядоченном виде, это создать библиотеку «Обои» и добавить в нее желаемые папки. Затем в панели управления кнопкой обзор (первый рисунок статьи) выбрать новую библиотеку. В картинках описано тут.

    2. Я давно уже пользуюсь динамическими обновляемыми обоями Bing на основе RSS. Можно такие сделать самому и поделиться с друзьями.

    1. Да не за что. Отвечу по пунктам.
      1. В вопросе GUI мне всё показалось очевидным, да и я не ставил перед собой задачи описать, как можно сменить обои средствами интерфейса 🙂
      Фактически же, да, если использовать библиотеку в качестве источника картинок, можно добиться упорядочивания изображений, сходного с эффектами от параметра GroupBy, которые я привел в статье.
      2. Я категорически настроен против RSS-тем. Когда я впервые попробовал эту функцию, у меня обнаружилось вот что. На моем компьютере рабочий стол отказывался появляться до тех пор, пока не подключится Wi-Fi, и система не опросит ленту. Немалую роль в этом сыграла непосредственно сетевая карта, медленно поднимавшая соединение (она и сейчас так делает, судя по Linux 🙂 ). Возможно, со временем в Майкрософт что-то изменили в системе и сейчас ситуация радикально отличается, но тогда мне пришлось искать, где фид-лента прописана в реестре и удалять её оттуда, иначе пауза при появлении рабочего стола была неизбежной. Но, как говорится, «осадочек остался», и я не желаю проверять, как оно работает в Windows 8, стоящей у меня второй системой.
      Да и, как я уже писал, не любитель я обои менять. Пускай маки цветут.

  2. Уже нашел! Спасибо! С интересом прочитал и, наверное, даже применю. Давно пора там порядок навести.

    1. Я рад, что вы нашли применение описанному в статье.

  3. Этот блог всегда читаю с большим интересом, за что спасибо автору. Сергей не останавливайтесь и продолжайте радовать своих читателей дальше.
    Четко… умеете… могете просто 🙂

  4. Я постараюсь не разочаровать ни вас, ни себя.

  5. @Сергей Ткаченко
    У меня не возникало проблем с RSS-обоями. Вообще, они же кэшируются в AppData, так что проверка при загрузке ОС выглядит странновато.

  6. Сергей спасибо за статью!!! Если честно, то для меня лично, также, как и для Вас, абсолютно безразлично какие картинки у меня на рабочем столе. А вот для части клиентов, особенно, для представительниц прекрасной половины, смена красивых картинок на экране часто является одним из главных достоинств системы :)! Теперь буду использовать полученные знания на практике, на радость любителям прекрасного! Еще раз спасибо за статью! И еще, я считаю ваш блог самым интересным и полезным для себя «приобретением»! Так держать!!! 🙂

  7. Спасибо за теплые слова. Я рад, что эта статья произвела на вас такое впечатление.

  8. Привет, Сергей!

    Спасибо за разъяснение некоторых моментов. Сам когда-то давно, после установки семерки, наткнулся в реестре на эти параметры, кое что как-то сам придумал, кое что подсмотрел где-то в интернетах (не помню). Но остальное ты теперь все рассказал.

    Я даже хотел написать программку (или скриптик) который помог бы мне немного автоматизировать сие, так как с памятью у меня плохо и я постоянно забываю то пути, то ключи… Но потом, как и Вадим Стеркин (пользуясь случаем и ему респект), я додумался использовать библиотеки.

    А теперь собственно вопрос — посоветуй какой редактор реестра использовать, чтоб там комментарии были, заметки или закладки, раньше RegWorks юзал, но в семерке он нестабилен, использовать варезные совесть не позволяет, а использовать родной виндовый — память 🙁

  9. Привет.
    Я использую родной редактор реестра.
    У него есть пункт меню «Избранное», которое можно использовать в случае проблем с памятью. Добавив туда раздел, можно задать вменяемое описание.
    Не лишним будет ещё знать недокументированные ключи командной строки редактора реестра.
    Короче говоря, штатный редактор мне по душе.

  10. Полная шняга. Статья — как сделать простое сложным.

    1. Вы просто не являетесь целевой аудиторией этого материала. И повежливей, подобные выражения здесь неуместны.

  11. Сергей, а если я добавляю папку кнопкой «Browse…», она куда прописывается в реестре? Хотел поменять порядок сортировки, но что-то не обнаруживаю где это сделать.

  12. HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Wallpapers\Images
    Выгрузить раздел в рег-файл.
    Опытным путём найти нужный ID[цифра]
    Путь хранится в шифрованном виде, алгоритм шифрования мне неизвестен, увы.
    Порядок сортировки задать не получится — такой возможности нет.

  13. @Сергей Ткаченко
    И накой так сделали? Спасибо, пойдём «стандартным» путём.
    Хм, появляются новые вопросы 🙂
    Можно ли сделать сортировку по дате в обратном порядке?
    Заметил, что включаются пикчи не только из этой папки, но и из её подпапок. Можно ли подпапки не включать?

    1. Если верить этой картинке, то именно сортировку сделать нельзя. Проводник считывает лишь два параметра — имя и группировку. Я подозреваю, что порядок сортировки файлов и групп зависит от сортировки для папки «по умолчанию».

  14. Да, и как исключить подпапки, я тоже не нашел.

Обсуждение закрыто.

css.php