Программируем для Windows 7. Индикатор прогресса на панели задач

    Официальный выход Windows 7 не за горами, поэтому изучение новых возможностей операционной системы для программистов на C# становится актуальной. Новые веяния и правила для программистов появились уже при выходе Windows Vista с появлением UAC. Но Vista не получила широкого распространения у пользователей, поэтому программисты не очень активно изучали новое. С выходом Windows 7 ситуация может измениться в лучшую сторону. Я решил создать на своем сайте отдельный раздел, посвященный именно программированию под Window 7.

    На Хабре уже был цикл примеров, посвященных программированию под Windows 7. Но эти примеры выходили в то время, когда Win7 была еще в бета-версии. Поэтому я заносил статьи в закладки, чтобы вернуться к ним позже. Мне не хотелось ставить бета-версию на рабочую машину. Но недавно я все-таки поставил себе Windows 7 и очень ею доволен.

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

    А начнем мы с примера создания индикатора прогресса (ProgressBar) на панели задач. Старый топик на эту тему можно найти здесь.

    Но, сначала нужно подготовиться. Скачиваем Windows API Code Pack для Microsoft .NET Framework. Это мощный пакет, призванный помочь разработчикам создавать приложения для Windows 7 (и частистно Windows Vista) с помощью .NET. Пакет представляет собой библиотеку исходных кодов, используемых для доступа к некоторым новым функциям Windows через управляемый код.

    Распакуйте архив с файлами и запустите решение WindowsAPICodePack.sln. По умолчанию в качестве StartUp-проекта будет использоваться проект Shell. Нас это вполне устраивает, так как именно здесь находятся необходимые нам классы для работы с панелью задач. Выбираем в меню Build | Build Shell и получаем в папке ..\WindowsAPICodePack\Shell\bin\Debug файл Microsoft.WindowsAPICodePack.Shell.dll. Это и есть наша библиотека, которую мы будем использовать в своих проектах.
    Теперь запускаем Visual Studio и создаем новый проект Windows7TaskBarProgressBarDemo. В Solution Explorer щелкаем правой кнопкой на папке References и выбираем пункт Add Reference. В диалоговом окне переключаемся на вкладку Browse и находим созданную нами библиотеку Microsoft.WindowsAPICodePack.Shell.dll. Переключаемся в режим редактирования кода и прописываем строчку
    using Microsoft.WindowsAPICodePack.Taskbar;

    На этом первые приготовления закончены.

    Добавляем на форму таймер и кнопку, которая будет запускать таймер. Пора рассказать о цели нашего приложения. Предположим, мы поставили на плиту молоко для подогрева. Но нам не хочется стоять у плиты, а хочется почитать новую статью на Хабре. Вы убеждаете себя, что за минуту ничего страшного не произойдет и молоко не убежит. Но, читая интересную статью, время не замечаешь. Результат плачевен. Попытаемся установить контроль над временем.
    Итак, устанавливем у таймера интервал, равный 1000 (1 секунда) и пишем код:
    TaskbarManager instanceTaskBar = TaskbarManager.Instance;
    static int counter = 0;

    private void butStartTimer_Click(object sender, EventArgs e)
    {
      instanceTaskBar.SetOverlayIcon(null, "");
      timerCook.Enabled = true;
    }

    private void timerCook_Tick(object sender, EventArgs e)
    {
      counter += 1;
      instanceTaskBar.SetProgressValue(counter, 60);

      if (counter >= 60)
      {
        timerCook.Enabled = false;
        
        counter = 0;
        instanceTaskBar.SetProgressValue(0, 60);
        instanceTaskBar.SetOverlayIcon(Windows7TaskBarProgressBarDemo.Properties.Resources.Ready, "Готово");
      }
    }

    * This source code was highlighted with Source Code Highlighter.


    Теперь пояснения к коду. За раскраску кнопки приложения на панели задач в виде индикатора прогресса отвечает метод SetProgressValue. Запуская таймер, мы увеличиваем значение счетчика каждую секунду и доводим его до максимального значения (в нашем случае до 60). Когда счетчик достигнет своего потолка, нужно как-то визуально показать пользователю, что операция завершена. Для этой цели я решил воспользоваться методом SetOverlayIcon, о котором расскажу в другой раз.
    Итак, как это выглядит на практике. Ты ставишь молоко на плиту, садишься за компьютер и нажимаешь кнопку, запускающую таймер. Теперь можешь переключиться на браузер и читать статью на Хабре. Краем глаза по индикатору ты всегда можешь контроллировать, сколько времени осталось для чтения.

    После окончании минуты на панели задач появляется значок, сигнализирующий об окончании процесса.

    Как видите, все очень просто.
    В нашем примере использовался стандартный индикатор прогресса зеленого цвета (режим Normal). Существуют и другие варианты: NoProgress, Indeterminate, Error, Paused. Посмотреть, как они выглядят, можно на уже упоминавшейся странице Программируем Windows 7: Taskbar. Часть 1 — Progress Bar / Windows 7 / Хабрахабр

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

    Если у кого-то возникнут трудности с примером, то чуть позже я выложу исходники на сайте в разделе Windows 7. Удачи в освоении Window 7!

    Поддержать автора
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 18

      +9
      Мне одному кажется что подоных статей на хабре уже многовато?
        +1
        Да нет, просто эта статья не самая удачная.
          +4
          это зависит от степени заинтересованности. Если мне не интересен, к примеру, PHP, то будет казаться, что статей про пхп слишком много, а про нет .NET слишком мало. И наоборот. И почему бы просто не читать неинтересную вам статью. Или вы читаете все подряд?
          –1
          Читал раньше про эти возможности, но как то не сильно догоняю.
          Получается, эта возможность будет работать только в Windows 7? А как это отработает в XP — нужно будет какие то проверки на версию Windows в код вставлять? Будет ли при этом этот код работать на XP?
            0
            Судя по всему — это только для Vista и Win7. Ну а учитывая что подавляющее большинство коммерческих приложений будет работать под винХР(меньше требования к железу), что-то я сомневаюсь что кто-то будет особо заморачиваться этими финтифлюшками
              +2
              это работает только под Win 7
                –1
                Вот и у меня сложилось такое же впечатление. Что это все хорошо, но не для реального использования сейчас в приложениях.
                Пока просто понаблюдаем за шествием семерки.
                  0
                  >>Что это все хорошо, но не для реального использования сейчас в приложениях.
                  Вполне себе используемо.
                  Проверка версии ос занимает всего несколько строк, а фишечка хорошая и даже полезная…
                    +1
                    Total Commander — утилита которая куда уже шире в плане распространения на разных версиях windows и то уже поддерживает фичу win7, которая тут описана (прогресс-бар). Это только один пример из самого распространенного ПО. Так что «реальное использование в приложениях» уже реально.
                    0
                    Нет. это только для Win7. Vista частично поддерживает некоторые вещи из библиотеки, например новые диалоговые окна. Но описывемые здесь примеры только для семерки. Проверка на версию в библиотеке есть — свойство IsPlatformSupported.
                    Насчет большинства — в XP например появились темы LUNA и Silver (вроде так), которые в Win98 не поддерживались. И народ быстро научился подстраиваться под новый интерфейс XP при помощи манифестов. Думаю, так будет и для Win7. Разработчики будут использовать новые фичи. Например, в Chrome, Total Commander, Far, CDBurning это уже реализовано. И число программ только растет.
                      0
                      Не путайте темы и новые возможности.
                      1. Поддержка тем в ХР не требует от программиста ничего, кроме подключения манифеста(если компоненты стандартные), причем никаких проверок на версию оси делать не надо.
                      2. Использование новых фич требует написания кода для них, причем фичи будут работать только вод вин7, которая не особо распространена. А самое главное — полезность многих фич весьма и весьма сомнительна для того чтобы тратить на их реализацию время

                        +2
                        ну насчет полезности — это будет решать пользователь. Лично мне фичи нравятся, не понимаю в чем их сомнительность. И тратить время на них не нужно — все достаточно просто и прозрачно.
                        Впрочем, время покажет.
                    0
                    Скажу как программист, пишущий на С++ и иногда сталкивающийся с WinAPI.
                    Работа c новомодными штучками Seven идёт с помощью технологии COM.
                    Я создаю экземляр объекта:

                    CoCreateInstance(СLSID_TaskbarList, NULL, CLSCTX_ALL,IID_ITaskbarList3, (void**)&ptl);

                    Если результат работы этой функции S_OK, значит фичи доступны и можно смело использовать функции SetProgressValue, SetProgressState и т.д.
                    Т.е. формально никакой проверки версии операционной системы делать не приходится.

                      0
                      Если использовать по максимуму Shell API из Windows Vista, то многие фичи Windows 7 достанутся просто так. Например, если использовать диалоговое окно IOperationsProgressDialog в Vista (пример такого окна — стандартное окно копирования файлов), то в Windows 7 индикация прогресса операции появится автоматически. Если использовать интерфейсы IFileDialog, IFileOpenDialog и IFileSaveDialog, то в Windows 7 Jump List приложения будет заполняться автоматически.

                      Проблема в том, что многие разработчики ими не пользуются и пишут свои велосипеды, либо используют морально устаревшие API.
                      +1
                      Окончание процесса не должно сигнализироваться иконкой. Довольно подробно все интерфейсные фичи в том числе и Win7 описаны в UX Guideline:
                      msdn.microsoft.com/en-us/library/aa511258.aspx
                        0
                        Спасибо за ссылку. Но не нашел, почему нельзя сигнализировать иконкой.
                        0
                        интересная статейка, хороший и наглядный пример :)
                          0
                          спасибо. доброе слово и кошке приятно )))

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

                        Самое читаемое