Спецвыпуск Xakep, номер #028, стр. 028-098-1
--------------------------------------------------------------------------------
Так уж устроен наш пытливый хаксорский ум, что не можем мы мириться с мыслью о том, что кто-то может думать за нас. И пускай высокооплачиваемые дяди-программисты и тети-дизайнеры месяцами бьются над интерфейсом того или иного приложения (чтобы сделать жизнь простого юзера максимально удобной) - мы все равно залезем ручками в настройки и перелопатим там все что только можно. И сделаем не как удобно, а как нужно :). Вот, к примеру, стандартное виндявое окошко. Тебя не сильно бесят облачка и цветные квадратики в левом верхнем углу, ламерские подсказки и никому не нужные линки? Или ты просто отключил опцию "Показывать web-содержимое" в настройках вида и наслаждаешься девственно чистой папкой с разбросанными по ней иконками файлов? В любом случае - бежать от проблемы нехорошо, с проблемами надо бороться. Что мы, собственно, и попытаемся сейчас сделать...
КОРЕНЬ ЗЛА
Думаю, для тебя не будет открытием, что интересующая нас собака окажется зарытой в папке "C:\Windows\Web". Здесь валяется куча файлов с расширением "*.htt", которые отвечают за оформление и функциональность практически всех папок и компонентов Windows. Нас пока будет интересовать только файл "folder.htt", где хранятся дефолтовые настройки обычных несистемных папок. Здесь я проявил малодушие и решил, что к глобальному изменению интерфейса я пока не готов. А посему мною была создана специальная "Подопытная папка", на примере которой мы и будем во всем разбираться. И тебе тоже рекомендую настраивать фолдеры индивидуально, ведь это гораздо прикольнее, когда каждая папка имеет уникальную внешность и живет своей собственной жизнью.
ПРИСТУПИМ
Итак, лезь в меню "Вид->Настроить вид папки...". Попадешь в мастер настройки, который предложит тебе изменить HTML-шаблон для папки, выбрать рисунок фона, добавить комментарий к папке (это в винтукее) или же сбросить все настройки. Ставь галку в первом пункте и жми "Далее". Перед тобой откроется текстовик со скриптами (если у тебя w2k, то надо еще предварительно выбрать один из четырех стандартных шаблонов). Собственно говоря, на этом дружественный виндуозовский интерфейс заканчивается - начинается суровая программерская реальность. Так вот Анкл Билл утер нос всем ламерюгам: мол, не знаешь скриптов - так и нехрен выпендриваться. Оно и правильно - защита от дураков еще никому не мешала. Мы-то не дураки поди, сами во всем разберемся. Ладно, закрывай пока текстовик и жми "Готово" в мастере. Что изменилось? В твоей папке появились еще две иконки (если не появились, значит, у тебя отключена опция "Показывать системные файлы" - включи ее скорей). Это файл "desktop.ini" (нам он еще пригодится) и папка "folder settings", где будет храниться личный "folder.htt", куда ты можешь в любой момент залезть и нагадить по своему усмотрению.
МОРДА
Начнем с простого - добавим в нашу папку фоновый рисунок. Здесь нет ничего сложного: просто лезешь в мастер настройки и выбираешь нужную bmp-шку. Разумеется, она должна быть достаточно большой, чтобы у тебя вместо окна папки не получился коврик из одинаковых квадратных картинок. Идеально подойдут какие-нибудь десктопные обои. Да, и не забудь отрегулировать представление имен файлов - цвет подписей к иконкам должен быть контрастным по отношению к бэкграунду.
Еще один нюанс. Многие додельники ограничиваются сменой фона только в правой части окна, а слева остаются облачка-квадратики на белом фоне. Смотрится это, мягко говоря, тошнотворно. Поэтому я поступил так. Взял понравившуюся картинку, в Фотошопе отрезал слева полоску шириной в 200 пикселей и сохранил в отдельный файл. Назвал его "wvleft.bmp" и положил в папку "folder settings", заменив одноименный дефолтовый файлик. Теперь обе половинки состыковались, образовав единое целое. Одна приятность... Сам посмотри на скриншоте.
Иконка
Поскольку папка у нас должна получиться в своем роде уникальная, то и значок ей нужен особенный. Нет проблем! Рисуй любую иконку (размером 32х32, кстати, прикольно будет, если в качестве иконки использовать репродукцию настоящей церковной иконы :)), лезь в файл "desktop.ini" и дописывай в разделе [.ShellClassInfo] такую строчку: IconFile=Folder Settings\icon.bmp (указывай соответствующий путь к своему значку). Если нужная иконка хранится в dll-ке, то допиши еще одну строку: IconIndex=N, где N - порядковый номер иконки в библиотеке. Готово. Новый значок виден как в открытой папке, так и снаружи. Если у тебя 98-е Винды, то снаружи папка будет представлена все тем же стандартным желтым значком, а чтобы устранить этот непорядок, придется сделать папку системной (Выполнить -> attrib +s C:\Подопытная папка). Какая от этого всего польза? Ну, например, ты хочешь спрятать от посторонних глаз папку с любимой порнухой. Пропиши ей какой-нибудь скучный системный значок (или вообще укажи несуществующий путь к иконке - тогда у папки будет значок нераспознанного файла), обзови как-нибудь типа "param_65b8.bin", и о твоих маленьких слабостях никто не узнает - ни начальник, ни родители :).
ЛЕЗЕМ ГЛУБЖЕ
Ладно, все это было присказкой. Давай же, наконец, поковыряемся в скриптах. Открывай "folder.htt". Как видишь, раздел <body> занимает лишь небольшую его часть. Остальное - это коды процедур на яве, которые занимаются тем, что выдают и форматируют информацию о выделенных файлах, генерируют их превьюхи в левой части окна и выполняют разные вспомогательные действия. Что здесь можно изменить в лучшую сторону? Ну, скажем, в функции ShowInfo() порезать часть кода, отвечающую за вывод ненужных нам сведений. В идеале - из свойств оставить только размер файла. Здесь все снабжено комментариями ("// type", "// name", "// size"), так что не запутаешься. Не удержался я и от соблазна поиграться со строковыми константами, поменяв "Размер:" на "Весит:", "Атрибуты:" на "Фичесы:" и тому подобное...
Едем дальше. В этой же функции ищи условные операторы if (IsMovieFile(ext)) и else if (IsSoundFile(ext)). Они проверяют, является ли файл звуковым или видеофрагментом, и, в зависимости от этого, вставляют в левую часть окна компонент ActiveX (в данном случае - Windows Media Player), который, по идее, здесь же должен и проигрывать эти файлы. В строке "<param name="AutoPlay" value="false">" меняй false на true - и все! Теперь mp3-шки, avi-шки и иже с ними будут начинать пригрываться сразу при выделении. В 98-х Форточках были проблемы с удалением медиа-файлов, поскольку при выделении иконки файл сразу начинал проигрываться и становился недоступен. В винтукее такой проблемы нет - все удаляется без претензий и скандалов.
МЫ ПОЙДЕМ ДРУГИМ ПУТЕМ
Автоматическое проигрывание - это хорошо, но не всегда нужно, да и притормаживает работу системы к тому же. Давай лучше напишем скрипт, который будет проверять расширение файла и в зависимости от этого выводить на левую панель тематический флеш-мувик. Mp3-шке у нас будет соответствовать мувик с колбасящимся под музыку Клявиным (мифическим героем таджиков), а avi-шке - порнушный мультик в стиле xiaoxiao (исходя из соображения, что если видео - значит, порнуха :)). Как сделать мувики во флеше, я подробно рассказывать не буду - все более менее понятно из скриншотов.
Итак, swf-ки готовы и лежат в папке "folder settings". Ищи строку, где определяется расширение файла (ext = GetFileExtension(item.Path);) и сразу после нее пиши следующее:
if (ext=='avi')
{
Preview.innerHTML = '<p>' +
'<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="150" height="150">' +
'<param name=movie value="file:///C|/Подопытная папка-2/Folder settings/porevo.swf">' +
'<param name=quality value=high>' +
'</object>';
}
Путь к флешкам, естественно, ставь свой, а параметры мувика - по вкусу. Чтобы не мучиться с прописыванием флеш-объекта, просто опубликуй его в отдельный html-документ, скопируй код и вставь его в текст нашего файла. А можно открыть folder.htt в Macromedia Dreamweaver'e и, особенно не напрягаясь, импортировать туда флешку (честно говоря, я так и делал). Точно таким же образом зарегистрируй и второй мувик. Теперь ищи тела функций IsMovieFile(ext) и IsSoundFile(ext), где удали из списков расширений соответственно расширения avi и mp3. Для всех остальных типов файлов будет по-прежнему работать дефолтный ActiveX.
Идентификацией файла по расширению занимается функция GetFileExtension(name), которая ищет в имени файла последнюю точку и присваивает текстовой переменной ext строку, стоящую после этой точки. По аналогии с этой процедурой можно написать свои функции обработки имени, чтобы выполнять определенные действия в зависимости, например, от длины или первой буквы имени файла. Или вообще автоматически переименовывать файлы с нецензурными названиями :).
ЛИНКИ
Ну и, наконец, давай добавим в нашу папку несколько ссылочек. Допустим, в корни всех доступных дисков. Иди в раздел <body> и прописывай линки. Сделать это можно двумя способами: вставить обычный гипертекст или импортировать флеш-ролик, состоящий из одной кнопки (ссылка программируется средствами Flash).
Последний вариант мне нравится больше. Флеш-кнопку можно анимировать (в html тоже, конечно, можно создать ролловер, но это долго, нудно и эффект не тот). Кстати, в свойствах кнопки можно указать, будут ли ссылки открываться в одном и том же или в отдельном окне. Просто в опциях процедуры getURL() выбираешь опцию Window: _blank (в новом окне) или Window: _self (в этом же окне). Потом импортируешь кнопку - и готово. В результате всех махинаций у тебя должна получиться примерно такая картинка.
НА СЕГОДНЯ ХВАТИТ
Думаю, мы вдоволь поиздевались над нашей несчастной папкой. Нет? Хочешь еще? Ладно, я умываю руки и оставляю тебя с нею наедине :). Осваивай javascript, фантазируй, креативь. А в следующий раз мы с тобой полезем копаться во внутренности системных папок. Договорились? Лады. Как там Ильич говорит?
Да пребудет с тобой великий... ну, частично Flash :).