Пользователь
0,0
рейтинг
18 мая 2009 в 15:45

Программируем 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
Сергей Звездин @Sergun
карма
72,2
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

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

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

Комментарии (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/
          • 0
            Извините, невзначай сломал вашу ссылку [x]
            • 0
              Больше ничего не ломайте! :)
  • +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 обертку.

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