Windows

индекс
168,47

Программируем 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
+88
18 мая 2009, 15:45
57

комментарии (75)

–57
Avanti #
«Для разработчиков ПО на платформе Windows новая ОС также представляет интерес, т.к. в ней содержатся элементы, на которые можно воздействовать программно.»

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

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

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

Т.е. пока вирус у вас не поселился – эта фича ему не поможет.
Защита от вирусов на флешках в Windows7 есть… но пока, если честно не проверял насколько на эффективна… на недельке поставлю себе VirtualBox, потыкаюсь флэшкой в больные компы и протестирую защиту без антивируса :)
+3
mcm69 #
Так это и в ХР можно реализовать, WM_DEVICECHANGE никто не отменял.
0
naum #
Господи, хоть один толковый мужчина отписался.
0
naum #
Жизнь немного облегчит (в теории), но некиддисам это не нужно. Вы хоть раз встречали достойную малвару, которая, допустим, юзает WMI?
+2
nsk_qwerty #
аха… появится такой вирь, который сядет в таскбар и будет показывать юзверю красивой зеленой полосочкой насколько сильно он заразил систему…
+3
corristo #
не, он будет моргать разноцветными прогресс-барами и вызывать эпилепсию.
–2
Avanti #
На самом деле в таскбар можно встроить какой-нибудь поисковик по варезу, порнокартинку с последующим требованиям отправить СМС, чтобы она убралась… Я не считаю, что у создателей вирусов плохая фантазия.
0
nuxdie #
тогда это уже не вирусы а AdWare
+1
torkve #
… а еще будет запускаться экранная лупа, чтобы пользователь мог на таскбаре разглядеть порнокартинку и номер для отправки смс.
0
Baks #
Кстати, на старый таскбар добавить порнокартинку все кнопки было куда проще, чем на новый :)
0
Aldekein #
О! Порнокартинки на таскбаре? И их не нужно отдельно догружать из и-нета? Подробнее? ;)
0
corristo #
epic fail
+16
Vladek #
Полезные ресурсы, чтобы начать разработку для 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
non7top #
Да, эта фича мне понравилась. единственное что пока видел ее использование только проводником, даже ИЕ не рисовал прогрессбар. Не говоря уже о стороннем софте.
0
Sergun #
вопрос времени :)
+4
mixen #
IE рисует процесс загрузки файлов. Progress bar.
0
Yeah #
TortoiseSVN при экспорте рисует прогресс-бар. Это точно.
+2
Colobock #
Эта фича уже используется в IMGBurn последней версии.
www.imgburn.com/
0
Vitus #
И CDBurnerXP тоже прогресс записи диска показывает.
cdburnerxp.se/
+1
kvf77 #
А мне нравится еще в новом VMP (не помню версию текущую) при наведении на иконку в таск баре появляется маленькое окно с превью и там полностью работают кнопки управления воспроизведением — крайне удобно когда музыку слушаешь.
+1
Sergun #
Я чуть позже напишу о том, как можно ту же функциональность сделать для своего приложения.
+3
Frag #
Виндоус с буквы «W» начинается.
0
kvf77 #
ой да :-) ну главное, что вы поняли WMP имел ввиду конечно же
0
Baks #
0
kottt #
О да, это оно самое! Спасибо
0
Baks #
У меня тут из-за этой ссылки начался молчаливый холивар

baks.habrahabr.ru/blog/59892/

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

привольно так наблюдать :) похоже на азартную игру, где ставка – карма :)
0
homm #
Судя по заголовку этой статьи (часть 1) вы сейчас очень огорчили Sergun.
0
NemeZZiZZ #
В foobar2000 тоже
0
Colobock #
Это в какой версии?
0
NemeZZiZZ #
У меня 0.9.6.5. Плюс ещё плагин есть, который заменяет стандартные фубаровские кнопки, а также в предпросмотр выносит обложку и ползунок трека.
0
burivuh #
Спасибо, может пригодится когда-нибудь )
0
MobyDick #
Как можно сделать прозрачное окно с навигационными кнопками, как в проводнике или ие7/8?
0
Sergun #
Если интересно, напишу про это отдельно
0
MobyDick #
Да интересно!
Если можно в 2х словах сейчас как? :)
0
Sergun #
Я начинал про это писать давненько, в draft лежит. Сейчас точно не вспомню, исходники в другом месте. К сожалению.
0
sse #
Вот тут есть похожее — habrahabr.ru/sandbox/2227/
0
Devgru #
Извините, невзначай сломал вашу ссылку [x]
0
sse #
Больше ничего не ломайте! :)
0
Centro #
вот этот топик — centro.habrahabr.ru/blog/59899/
0
sse #
Ок, спасибо
+2
kottt #
Да-да, как раз только вчера увидел эту фичу. Узнать бы еще, как можно раскладывать вкладки браузера на разные окошки в превью (как это делает IE, если открыто больше одной вкладки)
+1
JustERR #
Для разработчика браузера количество вносимых в код изменений для реализации этого функционала будет минимальным:
msdn.microsoft.com/en-us/library/dd391692(VS.85).aspx
0
Gospodin #
Жду не дождусь когда для оперы реализуют такой функционал
0
danilissimus #
полезная вещь если работаешь с большим количеством окон, который закрыты друг-другом.
0
trak #
Еще бы Хром нормально с этим работал. В смысле мне действительно этого не хватает.
+5
Antikiller #
Спасибо, клёво!
Буду долбить Гислера, чтобы Total Commander это начал поддерживать.
0
gaidar #
Было бы здорово очень. У Вас с ним хороший контакт?
0
Antikiller #
Как у разработчика с разработчиком.
+1
gaidar #
Если задолбите, будет здорово. Редко сейчас TC пользуюсь, но раньше он был моим самым любимым инструментом :)
0
workless #
Он на письма отвечает. По крайней мере мне ответил на письмо по расширению функционала, правда через месяц, но ответил.
+1
Goodkat #
лучше долбите, чтобы Total Commander начал поддерживать юникод
0
borisko #
А можно сделать то, что делает ие8? Хочется свои вкладки тоже вынести в таскбар.
+1
kottt #
Уже ответили — можно: habrahabr.ru/blogs/windows7/59856/#comment_1627905
0
Popik #
А что будет, если программу, в которой подключена данная сборка для работы с таскбаром, запустить на предыдущих версиях винды?
0
Colobock #
Просто будет отсутствовать прогрессбар. Проверено на том же IMG Burn.
0
homm #
А он разве на дотенете?
0
Vladek #
Это всего лишь Windows Shell API, обычные COM-интерфейсы. В предыдущих версиях Windows они попросту не будут инстанцироваться.
0
mcm69 #
А это уже от разработчика зависит, если он будет проверять версию системы и не вызывать отсутствующих функций, то всё будет хорошо.
0
ch0mb0r #
выглядит красиво, удобно и функционально, скорей бы весь софт «подогнали» к новым возможностям ОС

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

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

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