Программируем Windows 7: Taskbar. Часть 1 — Progress Bar

    Новая операционная система Windows 7 содержит большое количество нововведений и улучшений. Эти улучшения касаются безопасности, производительности, надежности и т.д. Серьезное внимание также уделено и пользовательскому интерфейсу. Для разработчиков ПО на платформе Windows новая ОС также представляет интерес, т.к. в ней содержатся элементы, на которые можно воздействовать программно. В течении нескольких постов мы поговорим об основных нововведениях и программной модели для них.



    Первое что бросается в глаза при работе с Windows 7 – это, конечно, обновленный task bar. В новом taskbar’е действительно много концептуальных изменений. Одно из таких изменений – возможность отображения прогресса выполнения задачи (progress bar).

    На этом рисунке хорошо видно, что прямо на панели задач отображается информация о процессе копирования. Такая функциональность реализована в Windows 7 для копирования файлов на диске, загрузке данных из сети (IE8). Однако, важно, что эту функциональность мы можем использовать и для своих приложений. Сценариев может быть огромное количество – отображение процесса преобразования, копирования, формирования данных, построение отчетов, генерация изображений, и т.д.

    С точки зрения разработчика клиентских приложений для Windows, процесс использования данной функциональности представляется достаточно просто. Взаимодействие с ОС происходит на unmanaged уровне, поэтому для .NET приложений необходима реализация управляемых оберток. Всю эту работу уже проделали разработчики из Microsoft и поместили это в библиотеку .NET Interop Sample Library.

    Библиотека .NET Interop Sample Library состоит из множества компонентов и демонстрационных приложений. Мы не будем подробно останавливаться на каждом из них. Для нас важно, что в ее состав входит Vista Bridge Sample Library, Windows7.DesktopIntegration и Windows7.DesktopIntegration.Registration.

    Проект “Windows7.DesktopIntegration” содержит те классы, которые необходимы нам для работы с taskbar’ом. В составе этого проекта есть класс WindowsFormsExtensions, который содержит набор методов расширения (extension methods) для класса Form (Windows Forms). В нашем случае нас интересуют сдледующие методы:

    • SetTaskbarProgress(float percent)
    • SetTaskbarProgressState(ThumbnailProgressState state)


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

    // процесс выполнения = 35%
    // вызов метода расширения
    WindowsFormsExtensions.SetTaskbarProgress(this, 35);
    // или так
    (this = Form)this.SetTaskbarProgress(35);


    У нас также имеется возможность указать состояние прогресс-бара. Доступные состояния:

    • NoProgress – прогресс не отображается
    • Indeterminate – прогресс бар постоянно мерцает
    • Normal – обычное отображение прогресса
    • Error – отображение ошибки
    • Paused – отображение паузы
    • Задание состояние прогресс-бара осуществляется при помощи второго метода.


    WindowsFormsExtensions.SetTaskbarProgressState(this, Windows7Taskbar.ThumbnailProgressState.Normal);

    // или так

    this.SetTaskbarProgressState(Windows7Taskbar.ThumbnailProgressState.Normal);


    К сожалению, методы расширения существуют только для WinForms приложений. Однако, несложно построить подобный класс и для WPF приложений (см. демо-приложение).

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



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

    • Режим “Normal”
      image
    • Режим “Indeterminate”
      image
    • Режим “Error”
      image
    • Режим “Paused”
      image


    Удачи вам в разработке ваших приложений для Windows 7!

    Демонстрационное приложение:
    Taskbar-Progress.zip
    Метки:
    Поделиться публикацией
    Комментарии 75
    • –57
      «Для разработчиков ПО на платформе Windows новая ОС также представляет интерес, т.к. в ней содержатся элементы, на которые можно воздействовать программно.»

      К сожалению, новые функции будут представлять интерес и для разработчиков вирусов и прочей нечисти
      • –9
        верно.
        этому подвержены любые инновационные разработки в той или иной степени
        • –27
          Мне очень любопытно, как разовьется создание вирусов в связи с выходом нового Виндовс.
          Как говорится, страшно, но интересно :)
          • –9
            Грабь! Убивай!
            • 0
              Ужос как разовьется, ибо после такой оптимизации вистового ядра вирусы наконец перестанут тормозить:)
          • +17
            А зачем разработчиков вирусов и прочей нечисти прогрессбар на панели задач?
            Показывать процент зараженных файлов? :)

            Не думаю, что таскбар станет объектом нападений… ну разве что jump-list
            • 0
              Самое главное нововведение в Windows7 для вирусописателей — службы по триггерам. На семинарах например писали службу, копирующую файлы, которая запускается при вставлении флешки.
              • 0
                хм… т.е. вы вставляете флэшку и служба (которая уже запущена на компе) об этом узнает и начинает свою работу?

                Ну это не так страшно как если бы, вы вставляете флэшку и что-то плохое запускается с неё.

                Т.е. пока вирус у вас не поселился – эта фича ему не поможет.
                Защита от вирусов на флешках в Windows7 есть… но пока, если честно не проверял насколько на эффективна… на недельке поставлю себе VirtualBox, потыкаюсь флэшкой в больные компы и протестирую защиту без антивируса :)
                • +3
                  Так это и в ХР можно реализовать, WM_DEVICECHANGE никто не отменял.
                  • 0
                    Господи, хоть один толковый мужчина отписался.
                  • 0
                    Жизнь немного облегчит (в теории), но некиддисам это не нужно. Вы хоть раз встречали достойную малвару, которая, допустим, юзает WMI?
                • +2
                  аха… появится такой вирь, который сядет в таскбар и будет показывать юзверю красивой зеленой полосочкой насколько сильно он заразил систему…
                  • +3
                    не, он будет моргать разноцветными прогресс-барами и вызывать эпилепсию.
                    • –2
                      На самом деле в таскбар можно встроить какой-нибудь поисковик по варезу, порнокартинку с последующим требованиям отправить СМС, чтобы она убралась… Я не считаю, что у создателей вирусов плохая фантазия.
                      • 0
                        тогда это уже не вирусы а AdWare
                        • +1
                          … а еще будет запускаться экранная лупа, чтобы пользователь мог на таскбаре разглядеть порнокартинку и номер для отправки смс.
                          • 0
                            Кстати, на старый таскбар добавить порнокартинку все кнопки было куда проще, чем на новый :)
                            • 0
                              О! Порнокартинки на таскбаре? И их не нужно отдельно догружать из и-нета? Подробнее? ;)
                          • 0
                            epic fail
                          • +16
                            Полезные ресурсы, чтобы начать разработку для Windows 7 на .NET:

                            Windows 7 .NET Interop Sample Libraries
                            Windows API Code Pack for .NET
                            A Developer’s Guide to Preparing for Windows 7

                            и далее по ссылкам в постах.
                            • 0
                              Да, эта фича мне понравилась. единственное что пока видел ее использование только проводником, даже ИЕ не рисовал прогрессбар. Не говоря уже о стороннем софте.
                              • 0
                                вопрос времени :)
                                • +4
                                  IE рисует процесс загрузки файлов. Progress bar.
                                  • 0
                                    TortoiseSVN при экспорте рисует прогресс-бар. Это точно.
                                    • +2
                                      Эта фича уже используется в IMGBurn последней версии.
                                      www.imgburn.com/
                                      • 0
                                        И CDBurnerXP тоже прогресс записи диска показывает.
                                        cdburnerxp.se/
                                      • +1
                                        А мне нравится еще в новом VMP (не помню версию текущую) при наведении на иконку в таск баре появляется маленькое окно с превью и там полностью работают кнопки управления воспроизведением — крайне удобно когда музыку слушаешь.
                                        • +1
                                          Я чуть позже напишу о том, как можно ту же функциональность сделать для своего приложения.
                                          • +3
                                            Виндоус с буквы «W» начинается.
                                            • 0
                                              ой да :-) ну главное, что вы поняли WMP имел ввиду конечно же
                                              • 0
                                                О да, это оно самое! Спасибо
                                                • 0
                                                  У меня тут из-за этой ссылки начался молчаливый холивар

                                                  baks.habrahabr.ru/blog/59892/

                                                  голоса за топик пока держится на нуле, периодический уходя в минус и вновь поднимаясь :)

                                                  привольно так наблюдать :) похоже на азартную игру, где ставка – карма :)
                                                • 0
                                                  Судя по заголовку этой статьи (часть 1) вы сейчас очень огорчили Sergun.
                                                • 0
                                                  В foobar2000 тоже
                                                  • 0
                                                    Это в какой версии?
                                                    • 0
                                                      У меня 0.9.6.5. Плюс ещё плагин есть, который заменяет стандартные фубаровские кнопки, а также в предпросмотр выносит обложку и ползунок трека.
                                                • 0
                                                  Спасибо, может пригодится когда-нибудь )
                                                  • 0
                                                    Как можно сделать прозрачное окно с навигационными кнопками, как в проводнике или ие7/8?
                                                    • 0
                                                      Если интересно, напишу про это отдельно
                                                      • 0
                                                        Да интересно!
                                                        Если можно в 2х словах сейчас как? :)
                                                        • 0
                                                          Я начинал про это писать давненько, в draft лежит. Сейчас точно не вспомню, исходники в другом месте. К сожалению.
                                                          • 0
                                                            Вот тут есть похожее — habrahabr.ru/sandbox/2227/
                                                    • +2
                                                      Да-да, как раз только вчера увидел эту фичу. Узнать бы еще, как можно раскладывать вкладки браузера на разные окошки в превью (как это делает IE, если открыто больше одной вкладки)
                                                      • +1
                                                        Для разработчика браузера количество вносимых в код изменений для реализации этого функционала будет минимальным:
                                                        msdn.microsoft.com/en-us/library/dd391692(VS.85).aspx
                                                        • 0
                                                          Жду не дождусь когда для оперы реализуют такой функционал
                                                        • 0
                                                          полезная вещь если работаешь с большим количеством окон, который закрыты друг-другом.
                                                          • 0
                                                            Еще бы Хром нормально с этим работал. В смысле мне действительно этого не хватает.
                                                            • +5
                                                              Спасибо, клёво!
                                                              Буду долбить Гислера, чтобы Total Commander это начал поддерживать.
                                                              • 0
                                                                Было бы здорово очень. У Вас с ним хороший контакт?
                                                                • 0
                                                                  Как у разработчика с разработчиком.
                                                                  • +1
                                                                    Если задолбите, будет здорово. Редко сейчас TC пользуюсь, но раньше он был моим самым любимым инструментом :)
                                                                  • 0
                                                                    Он на письма отвечает. По крайней мере мне ответил на письмо по расширению функционала, правда через месяц, но ответил.
                                                                  • +1
                                                                    лучше долбите, чтобы Total Commander начал поддерживать юникод
                                                                  • 0
                                                                    А можно сделать то, что делает ие8? Хочется свои вкладки тоже вынести в таскбар.
                                                                  • 0
                                                                    А что будет, если программу, в которой подключена данная сборка для работы с таскбаром, запустить на предыдущих версиях винды?
                                                                    • 0
                                                                      Просто будет отсутствовать прогрессбар. Проверено на том же IMG Burn.
                                                                      • 0
                                                                        А он разве на дотенете?
                                                                        • 0
                                                                          Это всего лишь Windows Shell API, обычные COM-интерфейсы. В предыдущих версиях Windows они попросту не будут инстанцироваться.
                                                                      • 0
                                                                        А это уже от разработчика зависит, если он будет проверять версию системы и не вызывать отсутствующих функций, то всё будет хорошо.
                                                                      • 0
                                                                        выглядит красиво, удобно и функционально, скорей бы весь софт «подогнали» к новым возможностям ОС

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

                                                                        еще помимо прогресс бара, есть дополнительные пункты в контекстном меню их бы тоже «включить»
                                                                        • +1
                                                                          Пользоваться вин плеером стало дествительно в определенной степени удобно. И плюс, я заметил что он кушает намного меньше процессорного времени для HDTV и более качественного видео чем другие плееры, но и памяти кушает на столько же больше, чем скажем BS Player.
                                                                          • –1
                                                                            все стало более интегрированным и по дефолту удобным, вот если бы опера(хотя опера для меня бесполезный браузер уж лучше хром) и мозила(и все остальные компании) добились бы своего и сразу включали бы браузеры в ОС, а самое главное не просто включали(тогда получиться страшный дистрибутив под десяток Гб, лучше заранее все «совместить», но не включать и при инстале какой то софтины все функции сразу начинают работать), но и интегрировали, то было бы просто прекрасно
                                                                            • –1
                                                                              что касается плеера, то я им не пользуюсь, если фильмец какой поглядеть AVI так на это WMP Classiс пойдет, если нужна каталогизация и порядок так это iTunes, ежели DVD так PowerDVD есть. Дефолтный WMP как бы в пролете + он запутан, я попытался с наскока выйти на страницу с визуализатором (при плохом знании языка англицкого) и у меня не получилось =) я улыбнулся и больше не заходил в плеер
                                                                              • 0
                                                                                это вы о 12й версии WMP?
                                                                                • 0
                                                                                  Ага, набежали Опера ловеры и тунцо ненавистники и отминусили меня))))Падонки
                                                                            • 0
                                                                              Он у них там в семерке, кстати, поддерживает аппаратное декодирование HD? В MPC-HC зело удобно нынче стало, с нвидиевской видюшкой на далеко не новом компе плавненько 1080p играет и даже проматывается. Красота.
                                                                          • 0
                                                                            WindowsFormsExtensions.SetTaskbarProgress(this,…
                                                                            Вроде же в посте написано что это extension method?
                                                                            • 0
                                                                              Подскажите пожалуйста, возможно ли это для unmanaged кода? Если да, то где читать?
                                                                              • +1
                                                                                В .NET Interop Sample Library все managed-библиотеки — это обертки над unmanaged кодом, которые интеропится через COM. Можно посмотреть какие вызовы за что отвечают и по аналогии сделать unmanaged обертку.

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