Quantcast
Channel: Панель управления — Winreview.ru
Viewing all articles
Browse latest Browse all 10

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

$
0
0

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

Пользователям 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 сподвигли меня вернуть материал, уверяя, что он найдет своего читателя. Надеюсь, что тебя, мой уважаемый читатель, я не разочаровал, потратив твое время на прочтение этой публикации.


Viewing all articles
Browse latest Browse all 10

Latest Images

Trending Articles





Latest Images