Win7 Jump List — II

В прошлый раз мы остановились на том, что у нас есть программа, которая может «группировать» иконки из таскбара. Если вы ее запускали и разбирались, то заметили, что у программы есть один неприятный юзабилити недостаток. Когда вы задали программу для запуска по умолчанию – это никак не видно. Требуется полагаться на свою память и привычки. Так что будем исправлять данный недостаток.

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

Overlay

Самый простой способ, который позволит вам нарисовать дополнительную иконку поверх существующей – использовать оверлей из Win API Codec Pack. Для этого надо только знать путь до объекта, где будет содержаться иконка. Путь мы по прежнему берем из нашего класса для хранения элементов списка LinkInfo

Итак, код для оверлея будет выглядеть так:

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

Это можно использовать для работающей программы и оверлей будет смотреться очень хорошо. Мне лично нравится. Но при закрытии программы все тут же исчезнет =( И это, конечно, не радует, потому что не будет известно, что за программа по умолчанию запустится.

Самостоятельное создание иконок

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

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

Я думаю, что имеет смысл здесь задавать не абсолютные размеры, а относительные, т.е. чтобы можно было сказать: уменьши мне иконку-картинку на 50%. Оказывается это не так уж и сложно. Надо вычислить, сколько эти 50% будут в пикселях и заказать перерисовку с вычисленными значениями.

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

Далее надо наложить мини изображение на текущее. Для лучшего вида я сделал отступ на 2 пикселя снизу и справа.

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

Взяли указатель для создания иконки, создали иконку  и сохранили на диск. Да, иконка будет создана, но ужаснейшего качества, всего в 16 цветов. Это явно не то, что я хотел. Пришлось шерстить интернеты на предмет новых знаний и библиотек ) И такая библиотека нашлась — IconLib

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

Иконка получается гораздо лучше! На этом решено было остановиться, хотя иконки и получались чуть хуже чем оригинал. Теперь осталось только заменить иконку у ярлыка!

Создание ярлыков

В .Net нет никаких средств для создания и редактирования ярлыков.

Да, вот такое упущение. Уж не знаю почему, но факт. Долгое время я пользовался библиотекой Interop.IWshRuntimeLibrary.dll и создание ярлыков меня в целом устраивало. Но способ перестал работать при использовании .Net 4.0, так что даже не буду и рассказывать о нем. Пришлось опять искать новые способы создания ярлыков. Если бы это только был какой-нито банальный xml или еще какой-нибудь понятный человеку формат, но нет.

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

По-моему тут все понятно без слов. С Interop.IWshRuntimeLibrary.dll ярлыки создавались так:

О программе

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

Когда вы закрепляете программу на таскбаре, ярлык создается по адресу %USER_DIR%\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar, и соответственно там надо искать ярлык и обновлять его.

Сейчас программа может работать только с одним листом программ и программу по умолчанию можно задать только одну. Последнее ограничение очень легко снимается, а вот для того, чтобы один исполняемый файл работал с несколькими листами и прикреплялся к таскбару придется наверно посложнее. Дело в том, что jump list создается в привязке к окну/программе. И есть предположение, что можно создавать дочерние окна и для них создавать списки и прикреплять их к таскбару. Пока что я просто скопипастил программу в другую папку и переназвал исполняемый файл, после чего настроил еще один jump list ))  Мне программа помогает и пока что не хочется заморачиваться с доп.окнами и прочим, так как легче настроить все руками. Ленивый программист – хороший программист! =P

Исходный код, программа, файлы для создания ярлыков

Hard’n’heavy!

Один комментарий на “Win7 Jump List — II

Оставить комментарий