<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Блог Windows 7 для разработчиков</title><link>http://blogs.msdn.com/windev/default.aspx</link><description>The Windows 7 Blog for Developers - Русская редакция</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Fishbowl для Facebook с использованием новой панели задач Windows 7</title><link>http://blogs.msdn.com/windev/archive/2009/11/26/fishbowl-for-facebook-using-the-windows-7-taskbar-for-extra-spice.aspx</link><pubDate>Thu, 26 Nov 2009 11:09:06 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9929032</guid><dc:creator>Daniel Kornev [MSFT]</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/windev/comments/9929032.aspx</comments><wfw:commentRss>http://blogs.msdn.com/windev/commentrss.aspx?PostID=9929032</wfw:commentRss><description>&lt;p&gt;Во время выступления в прошлую среду на конференции PDC 2009 Брайан Голдфарб (Brian Goldfarb) продемонстрировал отличное клиентское приложение для Facebook на базе Silverlight 4. Помимо своего удивительного внешнего вида, демо-приложение Silverlight 4 представляет собой готовое решение клиент для настольных систем Windows (и Mac). В ходе выступления также был анонсирован SilverFace, который тоже создан на базе Silverlight 4. Если вы захотите получить приятно выглядящее приложение для работы с Facebook прямо на рабочем столе Windows, вам следует взглянуть на &lt;a href="http://www.fishbowlclient.com/"&gt;&lt;b&gt;Fishbowl Preview for Facebook&lt;/b&gt;&lt;/a&gt;. Fishbowl – это отличное WPF-приложение, которое можно установить и использовать, и в то же время – это хороший образец кода, по которому можно научиться создавать WPF-приложения с использованием функций Windows 7. Если эта тема вам интересна, вы можете загрузить &lt;a href="http://fishbowl.codeplex.com/"&gt;&lt;b&gt;исходные коды Fishbowl&lt;/b&gt;&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Сегодня удобство работы является более важным, чем когда-либо. Ваше приложение должно быть не просто забавным и интересным: оно должно быть красивым, отшлифованным и функциональным, а также обеспечивать удобство работы. Как разработчику вам нужно выйти за границы возможного и использовать любой доступный технический инструмент, который предоставляет вам ОС, или любые другие средства (если установка выполнена на мобильном устройстве) для обеспечения максимально удобства работы, в ином случае пользователь может переключиться на что-то другое. В таких сценариях использование панели задач Windows 7 с целью экономии несколько секунд в каждодневных задачах выглядит весьма очевидным выбором.&lt;/p&gt;  &lt;p&gt;И демо-приложение на Silverlight 4, и Fishbowl имеют прекрасных механизм взаимодействия с пользователем и увеличивают производительность. Скотт Гатри (Scott Guthrie) также анонсировал &lt;a href="http://msdn.microsoft.com/windows/ee388574.aspx"&gt;&lt;b&gt;Facebook SDK&lt;/b&gt;&lt;/a&gt; для приложений на управляемом коде, сочетающий в себе последние инновации в веб- и клиентской платформах с ведущими социальными технологиями (службами) с целью помочь разработчикам влиться в Facebook. Кроме того, что Fishbowl является примером использования Facebook SDK и обладает удобным интерфейсом, приложение является отличным примером использования WPF (версии 3.5), который показывает, как нужно создавать приложения, блистающие в Windows 7.&lt;/p&gt;  &lt;p&gt;И как любое WPF-приложение, Fishbowl работает на нескольких версиях Windows, включая Windows XP, Windows Vista и Windows 7, при этом оно интегрируется в панель задач Windows 7 и поддерживает технологию мультисенсорного ввода. Одной из идей, лежащих в основе новой панели задач, является предоставление пользователям быстрого и простого доступа к контенту, помощь в выполнении задач и быстром перемещении между открытыми окнами. Так, к примеру, списки переходов являются отличным инструментом для решения рабочих вопросов и задач. Если у вас есть задача, которая выполняется один или два раза в день, с помощью двух-трех щелчков, ничего страшного. Однако если у вас есть задачи, которые приходится выполнять 10, 20 или даже более раз в день, списки переходов сэкономят массу времени. Пользователи Facebook часто проверяют свои доски, пишут сообщения, просматривают картинки друзей и так далее. Поэтому в некоторых сценариях списки переходов, значки уведомлений, миниатюры и другие функциональные возможности становятся основными инструментами в приложении.&lt;/p&gt;  &lt;p&gt;Fishbowl использует панель задач, чтобы обеспечить быструю, простую и четкую интеграцию с функциональностью Facebook прямо из панели задач. Давайте рассмотрим некоторые функциональные возможности приложения перед тем, как перейти к рассмотрению кода.&lt;/p&gt;  &lt;p&gt;Панель задач Fishbowl позволяет выполнить несколько задач еще до запуска приложения. Вы можете перейти на страницу Facebook.com или сразу прыгнуть к своей доске, просмотреть фотографии друга и многое другое, как показано на следующем изображении:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/FishbowlforFacebookUsingtheWindows7Taskb_C6C0/clip_image002_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/FishbowlforFacebookUsingtheWindows7Taskb_C6C0/clip_image002_thumb.jpg" width="267" height="255" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Одной из удивительных возможностей Fishbowl для Facebook является то, что функциональность изменяется в зависимости от различных режимов приложения. Возможность по-разному использовать панель задач в различных сценариях открывает совершенно новые горизонты.&lt;/p&gt;  &lt;p&gt;Когда Fishbowl работает в обычном режиме, список переходов на панели задач отображает объекты и задачи, которые можно выполнять в рамках запущенного приложения, как, например, просмотр последних уведомлений и сообщений, не открывая приложение:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/FishbowlforFacebookUsingtheWindows7Taskb_C6C0/clip_image004_2.gif"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/FishbowlforFacebookUsingtheWindows7Taskb_C6C0/clip_image004_thumb.gif" width="270" height="434" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;При наведении указателя мыши на иконку Fishbowl вы увидите панель миниатюр, из которой можно просмотреть миниатюру открытого окна и выполнить ряд действий:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/FishbowlforFacebookUsingtheWindows7Taskb_C6C0/clip_image006_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/FishbowlforFacebookUsingtheWindows7Taskb_C6C0/clip_image006_thumb.jpg" width="476" height="449" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;В Fishbowl также предусмотрен мини-режим. В нем приложение показывает в небольшом окне всего одно сообщение. Как вы можете видеть на следующем рисунке, небольшая стрелка позволяет переключаться между сообщениями. При наведении курсора на значок Fishbowl в панели задач вы увидите миниатюру, при этом вы сможете контролировать приложение с помощью панели миниатюр.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/FishbowlforFacebookUsingtheWindows7Taskb_C6C0/clip_image008_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image008" border="0" alt="clip_image008" src="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/FishbowlforFacebookUsingtheWindows7Taskb_C6C0/clip_image008_thumb.jpg" width="549" height="451" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Кроме отличной интеграции в панель задач, Fishbowl оставляет приятные впечатления от наличия мультисенсорного ввода, позволяющего пролистывать сообщения с помощью пальцев. К сожалению, очень непросто проиллюстрировать сенсорные возможности приложения с помощью снимков экрана, поэтому вам придется поверить мне на слово.&lt;/p&gt;  &lt;p&gt;Мы рассмотрели большинство уникальных возможностей Fishbowl для Windows 7, а в следующей статье мы поговорим об API, которые позволили реализовать мультисенсорный интерфейс. Если вас заинтересовало приложение, вы можете загрузить исходные коды для Fishbowl &lt;a href="http://fishbowl.codeplex.com/"&gt;&lt;b&gt;отсюда&lt;/b&gt;&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9929032" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/windev/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/windev/archive/tags/_1F0430043D0435043B044C04_+_37043004340430044704_/default.aspx">Панель задач</category><category domain="http://blogs.msdn.com/windev/archive/tags/Multi-Touch/default.aspx">Multi-Touch</category><category domain="http://blogs.msdn.com/windev/archive/tags/Windows+API+Code+Pack/default.aspx">Windows API Code Pack</category><category domain="http://blogs.msdn.com/windev/archive/tags/_1F04400438043C04350440044B04_+_3A043E0434043004_/default.aspx">Примеры кода</category></item><item><title>Новая версия Windows API Code Pack</title><link>http://blogs.msdn.com/windev/archive/2009/11/20/new-windows-api-code-pack-version.aspx</link><pubDate>Fri, 20 Nov 2009 12:42:09 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9926158</guid><dc:creator>Daniel Kornev [MSFT]</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/windev/comments/9926158.aspx</comments><wfw:commentRss>http://blogs.msdn.com/windev/commentrss.aspx?PostID=9926158</wfw:commentRss><description>&lt;p&gt;С радостью сообщаю, что мы выпустили новую версию &lt;a href="http://code.msdn.microsoft.com/WindowsAPICodePack"&gt;&lt;b&gt;Windows API Code Pack&lt;/b&gt;&lt;/a&gt; – версию 1.0.1. Это не крупное обновление с множеством новых функций, а, скорее, версия, направленная на исправление ошибок, повышение производительности, добавление примеров и обновление нескольких функций (новые оболочки и т.д).&lt;/p&gt;  &lt;p&gt;Но прежде чем углубиться в новую версию Windows Code Pack, давайте рассмотрим, что же он из себя представляет.&lt;/p&gt;  &lt;p&gt;Windows 7 предлагает такие новые функции, как, например, панель задач, библиотеки, платформа Sensor and Location. Эти функции предполагают новые сценарии и предоставляют разработчикам новые возможности, чтобы лучшим образом адаптировать свои приложения для Windows 7. Все эти функции доступны через Win32 API. На данный момент в .NET Framework нет пространства имен «Windows 7», и также нет простого способа использовать эти функции из приложений, написанных на управляемом коде. Чтобы упростить доступ к ним разработчикам, использующим управляемый код, в августе мы выпустили 1.0 версию Windows API Code Pack for .NET Framework (сразу после Windows 7 RTM).&lt;/p&gt;  &lt;p&gt;Windows API Code Pack – это &lt;b&gt;бесплатная библиотека управляемых исходных кодов&lt;/b&gt;, поставляемая Microsoft &lt;b&gt;как есть&lt;/b&gt;. Вы должны относиться к ней, как если бы &lt;b&gt;сами написали ее&lt;/b&gt;, как если бы это был &lt;b&gt;ваш собственный код&lt;/b&gt;. Она охватывает множество новых функций Windows 7, а также некоторые из наиболее важных функций Windows Vista. Можете считать Windows API Code Pack вещью наиболее близкой к «официальному» управляемому API для Windows. Но следует помнить, что служба поддержки Microsoft не обеспечивает этому продукту 24х7 поддержку. Мы верим, что это – замечательное решение и что база кода является очень надежной и высококачественной.&lt;/p&gt;  &lt;p&gt;Наша цель, которую мы ставим, выпуская Code Pack, заключается в том, чтобы позволить разработчикам, использующим управляемый код, использовать преимущества программируемых интерфейсов Windows, не являющихся частью .NET Framework. Нам кажется, что в качестве общедоступного исходного кода Windows API Code Pack, отделенный от библиотек среды исполнения .NET, дает оптимальный компромисс между Microsoft Win32 и управляемой оболочкой. Следует отметить короткий цикл разработки – мы выпустили Windows API Code Pack всего через месяц после Win7 RTM; кроме того, мы выпускаем полные исходные коды библиотеки.&lt;/p&gt;  &lt;p&gt;В состав Windows API Code Pack входит большое число управляемых API для Windows (7). Например:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Тесная интеграция с пространством имен Windows Shell, включая поддержку набора свойств Windows Shell, предоставляющего такие элементы управления, как обозреватель проводника, и доступ к Windows Libraries.&lt;/li&gt;    &lt;li&gt;Полное соответствие функций с неуправляемым Taskbar API (программируемым интерфейсом панели задач), включая (но не ограничиваясь) списки переходов (Jump Lists), дополнительные значки (Icon Overlay), индикатор выполнения (Progress bar), эскизы (Thumbnail), настраиваемый переключатель, кнопка эскизов (Thumbnail Button) и т.д.&lt;/li&gt;    &lt;li&gt;Windows Task Dialog, другие элементы управления&lt;/li&gt;    &lt;li&gt;Поддержка API Direct3D 11.0 и DXGI 1.0/1.1&lt;/li&gt;    &lt;li&gt;Поддержка API Sensor Platform&lt;/li&gt;    &lt;li&gt;API Extended Linguistic Services&lt;/li&gt;    &lt;li&gt;Windows Restart Manager&lt;/li&gt;    &lt;li&gt;API электропитания&lt;/li&gt;    &lt;li&gt;И многие другие функции&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Каждая технология, представленная в Windows API Code Pack, сопровождается рядом демонстраций и примеров (включая исходные коды) на C# и VB. Мы планируем выпускать обновления для Windows API Code Pack приблизительно каждые три месяца. Мы будем работать над стабильностью (то есть исправлением ошибок), ядром пакета, тестированием и документацией, а также над поддержкой новых функций (ориентируясь на обратную связь клиентов).&lt;/p&gt;  &lt;p&gt;Вы можете задаться вопросом: «&lt;b&gt;Почему Windows API Code Pack не входит в состав .NET Framework?&lt;/b&gt;»&lt;/p&gt;  &lt;p&gt;Мы выпускаем открытый код, который можем включить в среду исполнения в будущем, если дальнейший рост ее размера окажется оправданным. Не забывайте, что .NET Framework работает как на Windows Vista, так и на Windows XP. Однако Windows 7 уже здесь, и мы хотим предоставить доступ к этому бесплатному, открытому набору исходных кодов раньше, а не позже. Мы выпускаем библиотеку в том виде, в каком она требуется сообществу и, как можете видеть, намереваемся обновлять ее в дальнейшем. В то время как эта версия (1.0.1) – небольшое обновление, в течение следующих нескольких месяцев мы планируем новый выпуск. Тем временем, вы пользуетесь преимуществами обоих измерений в пакете, который можете использовать целиком или частично без любых ограничений.&lt;/p&gt;  &lt;p&gt;Другой вопрос, который можно задать: &lt;b&gt;«Отпадет&lt;/b&gt; &lt;b&gt;ли с появлением .NET 4 необходимость использования Windows API Code Pack?&lt;/b&gt;»&lt;/p&gt;  &lt;p&gt;Когда выйдет .NET 4, вы сможете использовать его функции, связанные с Windows 7, в таких областях как панель задач, интеграция мультисенсорных устройств с WPF, поддержка DirectWrite и API местоположения посредством пространства имен Devices. Доступ к другим функциям, таким как библиотеки, Restart Manager и Sensors, будет и далее осуществляться посредством Windows API Code Pack.&lt;/p&gt;  &lt;p&gt;Наконец, мы ожидаем откликов от сообщества – от вас, разработчиков на .NET, использующих эту библиотеку для написания на управляемом коде приложений для Windows 7. На &lt;a href="http://code.msdn.microsoft.com/WindowsAPICodePack"&gt;&lt;b&gt;веб-узле Windows API Code Pack&lt;/b&gt;&lt;/a&gt; вы можете задать вопрос, оставить отзыв, сообщить об ошибках и проследить за открытыми ошибками. Ваше участие очень важно для продолжения существования этой библиотеки, так что, пожалуйста, отправляйте нам свои отклики и вопросы.&lt;/p&gt;  &lt;p&gt;Чтобы больше узнать о том, как использовать Windows API Code Pack, ознакомьтесь с &lt;a href="http://channel9.msdn.com/learn/courses/Windows7/"&gt;&lt;b&gt;тренингом по Windows 7 на Channel 9&lt;/b&gt;&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9926158" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/windev/archive/tags/Energy/default.aspx">Energy</category><category domain="http://blogs.msdn.com/windev/archive/tags/Sensor+and+Location/default.aspx">Sensor and Location</category><category domain="http://blogs.msdn.com/windev/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/windev/archive/tags/_1104380431043B0438043E04420435043A043804_/default.aspx">Библиотеки</category><category domain="http://blogs.msdn.com/windev/archive/tags/Multi-Touch/default.aspx">Multi-Touch</category><category domain="http://blogs.msdn.com/windev/archive/tags/Windows+7+Training+Kit/default.aspx">Windows 7 Training Kit</category><category domain="http://blogs.msdn.com/windev/archive/tags/Windows+API+Code+Pack/default.aspx">Windows API Code Pack</category></item><item><title>Программируем для Windows 7 в Visual Studio 2010</title><link>http://blogs.msdn.com/windev/archive/2009/11/19/programming-windows-7-using-visual-studio-2010.aspx</link><pubDate>Wed, 18 Nov 2009 21:21:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9928807</guid><dc:creator>Daniel Kornev [MSFT]</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/windev/comments/9928807.aspx</comments><wfw:commentRss>http://blogs.msdn.com/windev/commentrss.aspx?PostID=9928807</wfw:commentRss><description>&lt;p&gt;Несколько недель назад, всего за два дня до выпуска Windows 7, разработка Visual Studio достигла очередного важного этапа – стала доступна вторая CTP-сборка Visual Studio 2010, также известная как Visual Studio 2010 Beta 2. Мне всегда было интересно наблюдать за тем, как развиваются различные инструменты и инфраструктуры, как они приобретают новые возможности. Кажется, что каждый следующий выпуск этого продукта становится лучше и лучше, предлагая разработчикам поддержку все большего числа языков программирования и позволяя им создавать проекты для постоянно растущего числа областей, таких как web-приложения, клиентские приложения, приложения для мобильных платформ и программы, использующие параллельные вычисления, консоли и другие устройства.&lt;/p&gt;  &lt;p&gt;&lt;img src="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/VSLogo_5F00_4635271E.png" /&gt;&lt;/p&gt;  &lt;p&gt;Несмотря на то, что на данный момент новая версия среды разработки Microsoft находится на стадии «бета», уже сейчас работать с Visual Studio 2010 гораздо проще, чем с VS 2008. Стало намного легче управлять решениями и, что еще более важно, намного проще писать код и документацию к нему. Пользовательский интерфейс VS был значительно улучшен; он использует Windows Presentation Foundation (WPF), чтобы достичь большей упорядоченности и визуальной целостности, к тому же разработчики отказались от использования в интерфейсе устаревших трехмерных фасок у элементов UI. Использование WPF помогает пользователям сконцентрировать внимание на важных элементах интерфейса, корректно распределяя рабочее пространство среды разработки между окнами и выделяя доминантным цветом текущее окно, снижая при этом цветовое выделение фона. Помимо этого, в новой версии есть также маленькие, простые и приятные улучшения, такие как возможность управления размером текста. Вы также можете перетащить отдельное окно из главного приложения Visual Studio на второй монитор, что означает еще и поддержку многомониторных конфигураций клиентскими приложениями VS.&lt;/p&gt;  &lt;p&gt;Улучшения в технологии IntelliSense, наконец-то облегчат процесс создания проектов на C++. Также не стоит забывать о новом окне отладчика, поддерживающего параллельную отладку и позволяющего увидеть параллельные стеки.&lt;/p&gt;  &lt;p&gt;Также в новой версии появилась поддержка языка F# (язык функционального программирования) и многочисленные обновления C#, включая поддержку динамических ключевых слов. Операции над динамическими объектами реализуются в период выполнения приложения (подробнее об этом можно узнать из &lt;a href="http://www.hanselman.com/blog/C4AndTheDynamicKeywordWhirlwindTourAroundNET4AndVisualStudio2010Beta1.aspx"&gt;&lt;b&gt;статьи&lt;/b&gt;&lt;/a&gt; Скотта Хансельмана (Scott Hanselman)). Также появилась поддержка новой версии спецификаций языка C++ – С++X0, включающих в себя, например, лямбда-выражения. Сборка решений C++ осуществляется MSBuild, что должно понравиться многим.&lt;/p&gt;  &lt;p&gt;Как обычно, обратная совместимость чрезвычайно важна, а потому необходимо упомянуть о том, что Visual Studio 2010 обладает свойством &lt;a href="http://termstudio/ViewData.aspx?tid=696698&amp;amp;langCode=ru-RU"&gt;настройки для различных версий&lt;/a&gt; (multi-targeting). Это означает, что Visual Studio 2010 может обеспечить работу с .NET 2.0 через .NET 4.0, что позволяет работать со старыми проектами в VS 2010 и пользоваться всеми улучшениями, о которых мы говорили выше.&lt;/p&gt;  &lt;p&gt;Однако в этой статье я хотел бы сосредоточить свое и ваше внимание на использовании Visual Studio 2010 для создания программ для Windows 7. Visual Studio 2010 содержит в себе несколько технологий и функций, которые могут помочь в написании приложений, использующих некоторые специфические возможности Windows 7. Ниже я расскажу о некоторых функциях Visual Studio 2010, которые подробнее будут освещены в наших следующих публикациях.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;.NET 4 и Windows 7&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Visual Studio 2010 включает в себя законченную новую, четвертую версию CLR. Это не просто очередное расширяющее обновление поверх CLR 2 (.NET Framework 2). Эта версия включает в себя новые расширения для языков программирования, такие как динамические ключевые слова. А новая WPF-версия несет в себе поддержку таких технологий, как оболочки и интеграция с панелью задач, а также мультисенсорный ввод.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;WPF и интеграция с панелью задач&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Как вы уже знаете, для использования в программе списков переходов, потребуется класс JumpList. Он содержит в себе несколько методов и свойств, которые управляют тем, каким образом список будет использоваться приложением. Он также включает в себя присоединяемое свойство, которое можно использовать в классе своего приложения для создания, редактирования или удаления пунктов списка. Если вы работаете с какими-то конкретными файлами, то можете воспользоваться методом JumpList.AddToRecentCategory для их добавления в список последних используемых файлов, управляемый оболочкой.&lt;/p&gt;  &lt;p&gt;Есть два типа категорий в списке – задачи (tasks) и элементы (items); для работы с ними можно использовать JumpTask и JumpPath, соответственно. С ними можно работать с помощью XAML, выделенного (code-behind) кода, или их комбинации. Следующий фрагмент кода демонстрирует простую интеграцию задач в список переходов:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;JumpList.JumpList&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;JumpList&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;JumpTask&lt;/span&gt; &lt;span class="attr"&gt;ApplicationPath&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;notepad.exe&amp;quot;&lt;/span&gt; 
                         &lt;span class="attr"&gt;CustomCategory&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;External Tools&amp;quot;&lt;/span&gt; 
                &lt;span class="attr"&gt;Description&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Take Notes&amp;quot;&lt;/span&gt; 
                &lt;span class="attr"&gt;Title&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Start Notepad&amp;quot;&lt;/span&gt; 
                &lt;span class="attr"&gt;IconResourcePath&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;notepad.exe&amp;quot;&lt;/span&gt; 
                &lt;span class="attr"&gt;IconResourceIndex&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
 
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;JumpTask&lt;/span&gt; &lt;span class="attr"&gt;ApplicationPath&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;calc.exe&amp;quot;&lt;/span&gt;
                         &lt;span class="attr"&gt;CustomCategory&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;External Tools&amp;quot;&lt;/span&gt; 
                         &lt;span class="attr"&gt;Description&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Perform some calculations&amp;quot;&lt;/span&gt; 
                        &lt;span class="attr"&gt;Title&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Start Calculator&amp;quot;&lt;/span&gt;
                        &lt;span class="attr"&gt;IconResourcePath&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;calc.exe&amp;quot;&lt;/span&gt; 
                        &lt;span class="attr"&gt;IconResourceIndex&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;JumpList&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;JumpList.JumpList&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Точно так же вы можете использовать XAML для добавления кнопок к эскизам окон панели задач, как показано в следующем фрагменте кода:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TaskbarItemInfo.ThumbButtonInfos&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ThumbButtonInfo&lt;/span&gt; &lt;span class="attr"&gt;DismissWhenClicked&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;True&amp;quot;&lt;/span&gt; 
                    &lt;span class="attr"&gt;ImageSource&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;images/booktrip.png&amp;quot;&lt;/span&gt;
                    &lt;span class="attr"&gt;Command&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding BookItinerary}&amp;quot;&lt;/span&gt;
                    &lt;span class="attr"&gt;Description&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Book the itinerary now&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;TaskbarItemInfo.ThumbButtonInfos&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Код:&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Основной файловый диалог поддерживает работу с библиотеками&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;По непонятным для меня причинам стандартное диалоговое окно для работы с файлом (Common File Dialog, CFD) WPF версий 3 и 3.5 не поддерживало обновленную версию CFD, представленную в Windows Vista. В Windows 7 диалог был обновлен для поддержки библиотек и обеспечения более удобного интерфейса пользователя. Теперь он поддерживает мгновенный поиск, а также некоторые функции для опытных пользователей. Благодаря новому WPF 4 приложения могут использовать всю мощь нового CFD напрямую из WPF, без необходимости импортировать CFD из пространства имен WinForm (что было единственным возможным вариантом для использования обновленного CFD из WPF 3 и 3.5).&lt;/p&gt;

&lt;p&gt;&lt;b&gt;WPF поддерживает мультисенсорный ввод&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;WPF 4.0 приносит с собой поддержку технологии multi-touch напрямую из WPF API, без необходимости обращения к «естественному» сервису. Данная новая функция доступна только в Windows 7 и автоматически отключается, когда приложение запускается в старой операционной системе, так что вам не придется самостоятельно заниматься определением версии операционной системы. WPF 4.0 добавляет новый API для обработки манипуляций жестами в базовый класс UIElement. Эта поддержка позволит разработчикам отслеживать множественные касания и генерировать как отдельные манипуляции, так и их совокупность. Прежде всего, это позволяет преобразовывать объект в координатах X и Y, переворачивать и масштабировать его.&lt;/p&gt;

&lt;p&gt;WPF будет предоставлять события манипуляций, если свойство IsManipulationEnabled элемента будет установлено в «true». По умолчанию оно имеет значение «false» , так что вам придется самостоятельно включать это свойство для каждого элемента, для которого вы хотите использовать манипуляции жестами. Для этого нужно просто добавлять строчку IsManipulationEnabled=true в XAML-код, как это показано в следующем примере:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Border&lt;/span&gt; &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;10,5&amp;quot;&lt;/span&gt; 
    &lt;span class="attr"&gt;BorderBrush&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;DarkGoldenrod&amp;quot;&lt;/span&gt; 
    &lt;span class="attr"&gt;BorderThickness&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;2&amp;quot;&lt;/span&gt; 
        &lt;span class="attr"&gt;CornerRadius&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;10&amp;quot;&lt;/span&gt; 
    &lt;span class="attr"&gt;MinHeight&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;75&amp;quot;&lt;/span&gt; 
    &lt;span class="attr"&gt;IsManipulationEnabled&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Дополнительно можно также связать события ManipulationStarting и ManipulationCompleted для обеспечения выделенного кода реализации этих событий.&lt;/p&gt;

&lt;p&gt;WPF 4.0 также поддерживает низкоуровневые сообщения о касаниях или необработанный ввод касаний. Таким образом можно взаимодействовать с событиями любых объектов UIElement, используя TouchDown, TouchMove и TouchUp. Для каждого из них есть версия для предварительной обработки. Это может быть полезно, если вы пытаетесь отслеживать несколько касаний, которые управляют разными объектами, или когда вы хотите обеспечить различную реакцию приложения на касания и передвижения мыши. В скором времени мы подробнее напишем про технологию мультисенсорного ввода в Windows 7 в общем и в WPF в частности.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Обновления MFC&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;В Visual Studio 2010 среды С++ и MFC получили несколько обновлений, среди которых такие полезные функции, как расширения IntelliSense и возможности C++X0. Серьезному обновлению подверглась библиотека MFC, особенно в отношении панели задач, технологии multi-touch и функции Restart and Recovery:&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;i&gt;Панель задач&lt;/i&gt;&lt;/b&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;Панель задач MFC обеспечивает весь функционал, предоставляемый родным COM API панели задач. Нет ничего, что могла бы выполнить одна, и не могла другая. По сути MFC просто «обертывает» Win32 API (как и обычно) в «MFC-подобный» API, который соответствует рекомендациям по стилю программирования MFC Framework. Например, приведенный ниже фрагмент кода устанавливает многослойные иконки:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;CMainFrame* mainFrm = 
dynamic_cast&amp;lt;CMainFrame*&amp;gt;(AfxGetApp()-&amp;gt;GetMainWnd());
&lt;span class="kwrd"&gt;if&lt;/span&gt; (mainFrm)
    mainFrm-&amp;gt;SetTaskbarOverlayIcon(IDI_ICON_INFO,L&lt;span class="str"&gt;&amp;quot;Info&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Код:&lt;/p&gt;

&lt;p&gt;Для начала нужно получить дескриптор для главного окна приложения (окна верхнего уровня), который соответствует Win32 HWND. Затем, вы просто вызываете метод SetTaskbarOverlayIcon, на вход которому в виде параметра подаются HICON и строка содержащая в себе версию текста информации, переданной оверлеем, для соответствия требования доступности. Просто, не так ли?&lt;/p&gt;

&lt;p&gt;Класс CFrameWnd библиотеки MFC предоставляет функционал однооконного интерфейса (Single Document Interface, SDI) Windows, перекрывающихся или вплывающих окон Frame Window. В новом MFC этот класс был обновлен, и теперь он поддерживает такие функции панели задач, как многослойные иконки (overlay icon), индикатор выполнения (Progress Bar), списки переходов (jump list) и эскизы (thumbnail).&lt;/p&gt;

&lt;p&gt;В панель задач MFC по умолчанию встроена поддержка эскизов, а потому эти эскизы будут отображать любое изменение в пределах просматриваемого окна. Следовательно, за исключением реализации своих собственных способов прорисовки окна, вам не понадобится писать никакого кода для обновления изображения в эскизе.&lt;/p&gt;

&lt;p&gt;Для включения эскизов панели задач в MFC-приложении в мастере создания MFC-приложения все пользователям необходимо будет выбрать тип приложения «Multiple document» с включенной опцией «Tabbed documents». Когда приложение запущено, MFC будет делать снимки каждого окна и отправлять их в Taskbar API для отображения в эскизах.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_5D36703E.png"&gt;&lt;img title="image" border="0" alt="image" src="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_thumb_5F00_1508B462.png" width="535" height="422" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Результат будет выглядеть примерно так:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_13C41B83.png"&gt;&lt;img title="image" border="0" alt="image" src="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_thumb_5F00_58FC72AC.png" width="339" height="350" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Мультисенсорный ввод&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;В Visual Studio 2010 библиотека MFC также обзавелась поддержкой технологии multi-touch. По умолчанию на touch-совместимых устройствах (таких, как сенсорный экран) Windows 7 посылает сообщения о жестах любому приложению; т.е. по умолчанию Windows 7 отсылает сообщение WM_GESTURE целевым окнам. Все, что делает MFC, это отображает такие сообщения на свои дескрипторы сообщений. MFC предоставляет множество переопределенных дескрипторов сообщений, которые могут получать любой тип жеста, и каждый из которых возвращает булево значение. Если жест был обработан сообщением, соответствующий ему переопределенный дескриптор возвращает TRUE; иначе – FALSE. Потому, если вам, например, нужен дескриптор для жеста «увеличение/уменьшение», все, что вам надо – это реализовать соответствующий дескриптор. Вот список поддерживаемых дескрипторов:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;// Gesture handlers&lt;/span&gt;
&lt;span class="kwrd"&gt;virtual&lt;/span&gt; BOOL OnGestureZoom(CPoint ptCenter, &lt;span class="kwrd"&gt;long&lt;/span&gt; lDelta);
&lt;span class="kwrd"&gt;virtual&lt;/span&gt; BOOL OnGesturePan(CPoint ptFrom, CPoint ptTo);
&lt;span class="kwrd"&gt;virtual&lt;/span&gt; BOOL OnGestureRotate(CPoint ptCenter, &lt;span class="kwrd"&gt;double&lt;/span&gt; dblAngle);
&lt;span class="kwrd"&gt;virtual&lt;/span&gt; BOOL OnGesturePressAndTap(CPoint ptFirstFinger, &lt;span class="kwrd"&gt;long&lt;/span&gt; lDelta);
&lt;span class="kwrd"&gt;virtual&lt;/span&gt; BOOL OnGestureTwoFingerTap(CPoint ptCenter);&lt;/pre&gt;

&lt;p&gt;Точно так же, вы можете зарегистрироваться для получения необработанных сообщений о касаниях и стандартных сообщений о жестах. В Windows 7 сообщения о жестах и необработанные сообщения о касаниях являются взаимоисключающими. Если вы зарегистрировались для получения необработанных сообщений о касаниях для какого-либо конкретного окна, это окно прекратит получать сообщения о жестах. Если вы выбрали обработку необработанных сообщений о касаниях, вы должны реализовать следующий дескриптор:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;virtual&lt;/span&gt; BOOL OnTouchInput(
                        CPoint pt, 
                        &lt;span class="kwrd"&gt;int&lt;/span&gt; nInputNumber, 
                        &lt;span class="kwrd"&gt;int&lt;/span&gt; nInputsCount, 
                        PTOUCHINPUT pInput);&lt;/pre&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
MFC облегчает жизнь, предоставляя много информации для каждого параметра касаний, например, координаты конкретной точки touch-совместимого устройства, которой коснулся пользователь. MFC также предоставляет ID параметра касания, т.е. первого, второго или третьего пальца, а также точное количество текущих касаний.

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Перезагрузка и восстановление через Restart Manager&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;В Visual Studio 2010 библиотека MFC также обеспечивает естественную поддержку Restart Manager – инструмента, который был представлен еще в операционной системе Windows Vista. Он может помочь приложениям сохранить свои данные, когда обновление требует завершения работы этого приложения или когда происходит неожиданная программная ошибка. Вместо неправильного завершения работы, Restart Manager позволяет приложению выполнить сохранение данных перед закрытием. Кроме того, он может повторно запустить приложение, позволив ему восстановить свое состояние до аварийного завершения работы.&lt;/p&gt;

&lt;p&gt;Для новых MFC-приложений можно использовать функцию Restart and Recovery, воспользовавшись мастером MFC Application Wizard, как показано на следующем экране:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/clip_5F00_image001_5F00_5DFEB05B.png" /&gt;&lt;/p&gt;

&lt;p&gt;Все настраиваемые части API Restart Manager предоставляются пользователю через виртуальные элементы, которые могут быть переопределены.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;.NET и платформа Location&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;.NET 4 включает в себя новое пространство имен Device, которое поддерживает Windows 7 Location API (часть платформы Windows 7 Sensors and Location). Пространство имен &lt;a href="http://msdn.microsoft.com/library/system.device.location.aspx"&gt;&lt;b&gt;System.Device.Location&lt;/b&gt;&lt;/a&gt; позволяет разработчикам приложений легко получать доступ к информации о местоположении пользователя, использую один единственный API. Информация о местоположении может исходить от множества провайдеров, таких как GPS, триангуляция Wi-Fi и триангуляция с использованием вышек сотовой связи. Классы System.Device.Location образуют единый API для объединения нескольких провайдеров местоположения в компьютере и поддерживают «бесшовную» систему приоритетов и переходов между ними. Разработчику приложений, которые будет использовать этот API, необязательно знать, какая из технологий определения местоположения доступна на отдельно взятом компьютере; таким образом, он освобожден от бремени адаптации приложения к определенной аппаратной конфигурации.&lt;/p&gt;

&lt;p&gt;Чтобы получить доступ к информации о местоположении, вам нужно создать объект GeoLocationProvider. Это главный объект Location Manager, через который можно зарегистрироваться для получения уведомлений LocationChange и синхронно считывать последние данные о местоположении. Далее вы должны вызвать метод Start для начала процесса получения данных от текущего провайдера местоположения. Чтобы проверить, доступны ли эти данные, можно воспользоваться свойством Status. Если данные доступны, можно получить данные о местоположении единожды, или же, воспользовавшись событием LocationChanged, непрерывно получать обновления текущего местоположения. Следующий фрагмент кода является значительно упрощенным примером, показывающим как получить текущие координаты GeoCoordinates (широта, долгота):&lt;/p&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;pre class="csharpcode"&gt;GeoLocationProvider provider = &lt;span class="kwrd"&gt;new&lt;/span&gt; GeoLocationProvider();
provider.Start();
GeoCoordinate coordinate = provider.Location.Coordinate;
&lt;span class="kwrd"&gt;if&lt;/span&gt; (coordinate != GeoCoordinate.Unknown)
{
  &lt;span class="rem"&gt;//Business logic here&lt;/span&gt;
}&lt;/pre&gt;

&lt;p&gt;К сожалению, .NET 4 поддерживает только Location API, а не всю платформу Sensor and Location – предполагается, что .NET-реализация функции Location все еще не содержит части Sensor. Для доступа к функции Sensor через управляемый код можно использовать Windows API Code Pack.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Параллельные вычисления и поддержка многоядерности Windows 7&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Параллельное программирование в Visual Studio 2010 имеет множество аспектов, таких как Parallel LINQ или другие расширения .NET, требующих поддержки параллельных вычислений, включая операторы, подобные Parallel.For, которые используют System.Threading.Tasks.Task. Разработчики C++ будут рады узнать, что концепции Task также присутствуют в 10-ой версии языка C++, которая поставляется с VS 2010. В случае с неуправляемым кодом параллельная среда выполнения (Concurrency Runtime, ConcRT) знает о &lt;a href="http://blogs.msdn.com/nativeconcurrency/archive/2009/02/04/concurrency-runtime-and-windows-7.aspx"&gt;&lt;b&gt;процессорных группах Win7&lt;/b&gt;&lt;/a&gt; и способна работать с максимум 256 ядрами; ConcRT также использует преимущества планирования непривилегированного режима (User Mode Scheduling, UMS) потоков. Именно поэтому любой вычислительный процесс, построенный на ConcRT, получает выгоду от использования многоядерности. Другими словами, благодаря тому, что Parallel Pattern Library (PPL) и Asynchronous Agents включены в состав Visual C++ 10 CRT и имеют в своей основе ConcRT, любой вычислительный процесс, который вы построите на их базе, будет масштабироваться между 256 ядрами (конечно, вам все равно придется писать код, однако масштабирование будет бесплатным).&lt;/p&gt;

&lt;p&gt;Для приложений на управляемом коде ситуация не такая радужная. Управление потоком управляемого стека по умолчанию основывается на .NET ThreadPool (System.Threading.ThreadPool). В нем не применяются API новых процессорных групп Windows 7, и потому он не может автоматически использовать возможности Windows 7 по масштабированию. Максимальное число процессов, которые может использовать threadpool, равно 64. Но еще не все потеряно – вполне возможно написать дополнительный TaskScheduler, который смог бы работать с более чем 64 процессами, и использовать остальную часть библиотеки Task Parallel Library с этим специальным планировщиком. Это было бы крутым проектом для CodePlex, правда?&lt;/p&gt;

&lt;p&gt;Visual Studio 2010 включает в себя массу новых технологий и усовершенствований, которые представляют собой своего рода глазурь поверх пирога Windows 7.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9928807" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/windev/archive/tags/API/default.aspx">API</category><category domain="http://blogs.msdn.com/windev/archive/tags/Sensor+and+Location/default.aspx">Sensor and Location</category><category domain="http://blogs.msdn.com/windev/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/windev/archive/tags/_1F0430043D0435043B044C04_+_37043004340430044704_/default.aspx">Панель задач</category><category domain="http://blogs.msdn.com/windev/archive/tags/Multi-Touch/default.aspx">Multi-Touch</category><category domain="http://blogs.msdn.com/windev/archive/tags/Visual+Studio+2010/default.aspx">Visual Studio 2010</category></item><item><title>Программирование служб Windows 7 с триггерами (часть 2)</title><link>http://blogs.msdn.com/windev/archive/2009/11/13/windows7-trigger-start-services-part-2-building-a-trigger-start-optimized-service.aspx</link><pubDate>Fri, 13 Nov 2009 05:54:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9927113</guid><dc:creator>Daniel Kornev [MSFT]</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/windev/comments/9927113.aspx</comments><wfw:commentRss>http://blogs.msdn.com/windev/commentrss.aspx?PostID=9927113</wfw:commentRss><description>&lt;p&gt;В предыдущей статье &lt;a href="http://blogs.msdn.com/windev/archive/2009/11/12/windows7-trigger-start-services-part-1-introduction.aspx"&gt;&lt;b&gt;о программировании служб Windows 7 с триггерами&lt;/b&gt;&lt;/a&gt; мы представили Windows 7 Trigger Services в качестве способа оптимизировать ваши службы для повышения производительности и безопасности. В этой статье мы рассмотрим, как превратить службу, настроенную на автоматический запуск, в службу, запускающуюся по триггеру, т.е. только после того, как в системе произошло определенное событие. Мы используем WPF-приложение (управляемый код), которое регистрирует и следит за службой (также созданной с использованием .NET). Для связи между миром .NET и Win32 API, о которой шла речь в прошлой статье, мы используем слой взаимодействия C++/CLI.&lt;/p&gt;  &lt;p&gt;Приложение-пример состоит из 3 частей:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Слой взаимодействия C++/CLI, который обеспечивает обычный и простой интерфейс .NET API в приложении контроллера &lt;/li&gt;    &lt;li&gt;Приложение контроллера WPF, которое позволяет вам регистрировать и запускать службу &lt;/li&gt;    &lt;li&gt;Простая служба .NET, которая проверяет наличие запоминающего устройства USB (жесткого диска) и на нем ищет папку под названием «ToCopy» для копирования из нее файлов в локальную папку «C:\FromUSB». &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Изображение иллюстрирует структуру решения:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_5FB98C22.png"&gt;&lt;img title="image" border="0" alt="image" src="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_thumb_5F00_5EE12638.png" width="217" height="373" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Давайте начнем с рассмотрения реализации кода службы .NET. Это простая служба Windows, написанная на C#. Ее цель заключается в автоматическом копировании изображений с запоминающего устройства USB, подключенного к вашему компьютеру, на локальный жесткий диск – «&lt;i&gt;c:\FromUSB&lt;/i&gt;».&lt;/p&gt;  &lt;p&gt;Служба реализована в &lt;i&gt;USBService.cs&lt;/i&gt;. Этот класс наследует базовый класс &lt;i&gt;ServiceBase&lt;/i&gt; и переопределяет методы &lt;i&gt;OnStart&lt;/i&gt; и &lt;i&gt;OnStop&lt;/i&gt;. В этом классе имеется метод &lt;i&gt;DoWork&lt;/i&gt;, который и выполняет все копирование с диска USB на локальный диск. Метод &lt;i&gt;DoWork&lt;/i&gt; записывает данные в файл журнала, за которым мы будем следить.&lt;/p&gt;  &lt;p&gt;Наиболее интересная часть службы заключается в методе &lt;i&gt;OnStart&lt;/i&gt;. Он вызывается сразу же после запуска службы. Заметьте, что первая строка кода проверяет, настроена ли служба на запуск по триггеру. Если условие оператора if ложно, то создается новая копия таймера, которая производит опрос каждые 5 секунд. &lt;b&gt;До&lt;/b&gt; появления Windows 7 это был единственный способ реализации подобной службы, то есть требовалось регулярное опрашивание системы на наличие USB-устройства. Кроме того, данной службе для опроса системы нужно быть запущенной постоянно (24х7). Это приводит к крайне неразумному расходованию ресурсов, не позволяет системе переходить в энергосберегательный режим и, наряду с некоторыми другими отрицательными факторами, увеличивает поверхность атаки приложения.&lt;/p&gt;  &lt;p&gt;Но с Windows 7 можно настроить такую службу при помощи триггера подключения устройства USB. Это означает, что служба не будет работать до тех пор, пока не подключено устройство USB, а точнее универсальное дисковое устройство USB. Мы перейдем к этой части решения уже через секунду, но сейчас, если вы посмотрите на метод &lt;i&gt;OnStart&lt;/i&gt;, то заметите, что мы проверяем, настроена ли служба как служба на запуск по триггеру; если это так, мы просто вызываем в другом потоке метод &lt;i&gt;DoWork&lt;/i&gt;, как это показано в приведенном ниже фрагменте кода. Все это должно хорошо работать, поскольку служба НЕ включена и будет запущена только после срабатывания триггера. И, затем, для обработки очереди работы здесь используется пул потоков.&lt;/p&gt;  &lt;pre class="csharpcode"&gt; &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnStart(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)
 {
   &lt;span class="kwrd"&gt;if&lt;/span&gt; (ServiceControl.IsServiceTriggerStart(ServiceName))
   {
      ThreadPool.QueueUserWorkItem(_ =&amp;gt; DoWork());
   }
   &lt;span class="kwrd"&gt;else&lt;/span&gt;
   {
     _timer = &lt;span class="kwrd"&gt;new&lt;/span&gt; Timer(_ =&amp;gt; DoWork());
     _timer.Change(0, 5000);
   }
 }&lt;/pre&gt;

&lt;p&gt;Пространство имен &lt;i&gt;ServiceControl&lt;/i&gt; содержит слой взаимодействия C++/CLI. Этот слой использует C++/CLI в качестве связующего элемента между неуправляемым API и приложением WPF. Основной файл &lt;i&gt;ServiceControlInterop.cpp&lt;/i&gt; содержит всю функциональность, которая необходима и которая используется приложением WPF. Например, используя приложение контроллера, мы можем использовать &lt;i&gt;AddService(…) &lt;/i&gt;или &lt;i&gt;RemoveService(…) &lt;/i&gt;для добавления или удаления службы соответственно. Мы также может настроить службу для запуска по триггеру либо при подключении устройства USB, либо при появлении IP-адреса, используя &lt;i&gt;SetServiceTriggerStartOnUSBArrival&lt;/i&gt; или &lt;i&gt;SetServiceTriggerStartOnIPAddressArrival &lt;/i&gt;соответственно. Рассмотрение реализации обеих функций показывает, что обе они действует одинаково. Они:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Сначала используют &lt;i&gt;OpenSCManager&lt;/i&gt;, чтобы поместить дескриптор в Service Control Manager (SCM)&lt;/li&gt;

  &lt;li&gt;Затем используется дескриптор SCM &lt;i&gt;OpenService&lt;/i&gt;, чтобы получить настоящий дескриптор службы, которую мы хотим настроить&lt;/li&gt;

  &lt;li&gt;Наконец, они вызывают &lt;i&gt;ChangeServiceconfig2&lt;/i&gt; для настройки соответствующего триггера&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Обо всем этом уже говорилось подробно в предыдущей статье &lt;a href="http://blogs.msdn.com/windev/archive/2009/11/12/windows7-trigger-start-services-part-1-introduction.aspx"&gt;&lt;b&gt;Программирование служб Windows 7 с триггерами (ч.1)&lt;/b&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Можно &lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers.CodeSamples/TriggerStartServiceDemo.zip"&gt;&lt;b&gt;загрузить&lt;/b&gt;&lt;/a&gt; образец кода этого приложения. Обратите внимание, что вам потребуется запустить Visual Studio с правами администратора (см. изображение ниже), так как вам потребуется регистрировать, запускать и останавливать службы. Также потребуется Windows 7 SDK для компиляции той части решения, которая написана на С++.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_49173DDB.png"&gt;&lt;img title="image" border="0" alt="image" src="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_thumb_5F00_2F4307AC.png" width="331" height="184" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;После компиляции и запуска стандартного приложения (приложения WPF) вы увидите следующую картину.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_156ED17D.png"&gt;&lt;img title="image" border="0" alt="image" src="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_thumb_5F00_34B17850.png" width="258" height="286" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Это основное окно приложения контроллера WPF. Отсюда вы можете создавать службы, нажимая на кнопку Create Manual.&lt;/p&gt;

&lt;p&gt;Затем откройте окно служб, набрав «Services» в поле поиска меню «Пуск». Вы должны увидеть окно служб. Найдите USBCopyService; она должна выглядеть следующим образом:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_2606CC6B.png"&gt;&lt;img title="image" border="0" alt="image" src="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_thumb_5F00_336CDF71.png" width="524" height="132" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Нажмите кнопку Run (Запуск) и затем кнопку Refresh (Обновить) в окне служб или просто нажмите F5. Вы не увидите больших изменений, но статус USBCopyService должен измениться с Manual на Started, как показано ниже:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_2BE17004.png"&gt;&lt;img title="image" border="0" alt="image" src="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_thumb_5F00_0B5A3052.png" width="514" height="110" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Повторное обращение к приложению покажет активность службы в файле журнала. Как вы можете видеть на нижеприведенном изображении, служба проявляла активность каждые 5 секунд и опрашивала систему в поисках USB-устройства:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_18C04358.png"&gt;&lt;img title="image" border="0" alt="image" src="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_thumb_5F00_29C4713B.png" width="307" height="340" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Нажмите кнопку Stop, чтобы остановить службу и затем нажмите Delete Service, чтобы удалить ее. Теперь нажмите кнопку Trigger Start, чтобы зарегистрировать и настроить службу на запуск по триггеру при подключении универсального дискового устройства USB. Если вы проверите окно служб, то увидите, что для службы USBCopyService указано «manual», в то время как на самом деле она настроена для запуска по событию триггера (просто для этого нет графического представления).&lt;/p&gt;

&lt;p&gt;Если вы подключите USB-диск с папкой «ToCopy», служба запустится и скопирует файлы в c:\FromUSB. Не самая лучшая реализация, но это всего лишь демонстрация. На изображении, приведенном ниже, в файле журнала имеется всего одна строка, потому что служба была запущена лишь единожды; она выполнила метод &lt;i&gt;DoWork&lt;/i&gt; и затем завершила свою работу. Она не работала постоянно и не опрашивала систему каждые 5 секунд и, следовательно, не растрачивала ресурсы и не была подвержена угрозам безопасности.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_3AC89F1E.png" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Заключение&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Разработка службы в Windows 7 с запуском по триггеру может быть несколько сложнее, чем обычный автозапуск службы, которая постоянно работает от загрузки до выключения. Но практически все умещается в нескольких строках кода. В то же самое время эти несколько строк кода могут оказать очень большое влияние в плане сохранения ресурсов и безопасности. Так что в следующий раз, когда вы будете разрабатывать новую службу Windows, попытайтесь встроить в нее триггеры.&lt;/p&gt;

&lt;p&gt;Вы можете узнать больше о Windows 7, обратившись к &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=1C333F06-FADB-4D93-9C80-402621C600E7&amp;amp;displaylang=en"&gt;&lt;b&gt;Windows 7 Training Kit for Developers&lt;/b&gt;&lt;/a&gt; или просмотрев видео о Windows 7 на &lt;a href="http://channel9.msdn.com/windows"&gt;&lt;b&gt;Channel 9&lt;/b&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Вы также можете &lt;a href="http://channel9.msdn.com/learn/courses/Windows7/BackgroundServices/"&gt;&lt;b&gt;попрактиковаться&lt;/b&gt;&lt;/a&gt; в работе с Windows 7 Trigger Start Services, используя &lt;a href="http://channel9.msdn.com/learn/courses/Windows7/"&gt;&lt;b&gt;онлайн-тренинги Windows 7&lt;/b&gt;&lt;/a&gt;, являющиеся частью &lt;a href="http://channel9.msdn.com/learn/"&gt;&lt;b&gt;Channel 9 Learning Center&lt;/b&gt;&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9927113" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/windev/archive/tags/API/default.aspx">API</category><category domain="http://blogs.msdn.com/windev/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/windev/archive/tags/Triger+Start+Services/default.aspx">Triger Start Services</category><category domain="http://blogs.msdn.com/windev/archive/tags/Windows+7+Training+Kit/default.aspx">Windows 7 Training Kit</category></item><item><title>Программирование служб Windows 7 с триггерами (часть 1)</title><link>http://blogs.msdn.com/windev/archive/2009/11/12/windows7-trigger-start-services-part-1-introduction.aspx</link><pubDate>Thu, 12 Nov 2009 13:01:54 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9921322</guid><dc:creator>Daniel Kornev [MSFT]</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/windev/comments/9921322.aspx</comments><wfw:commentRss>http://blogs.msdn.com/windev/commentrss.aspx?PostID=9921322</wfw:commentRss><description>&lt;p&gt;Несколько недель назад мы рассмотрели &lt;a href="http://windowsteamblog.com/blogs/developers/archive/2009/10/01/session-0-isolation.aspx"&gt;&lt;b&gt;изоляцию Сессии 0&lt;/b&gt;&lt;/a&gt; с точки зрения программной совместимости. Поэтому вполне естественно, что мы возвращаемся к обсуждению служб в контексте Windows 7. Но на этот раз мы поговорим о некоторых выгодах оптимизации служб, доступных в Windows 7. Эта статья посвящена новой возможности Windows 7 – &lt;i&gt;Trigger Start Services&lt;/i&gt;. Но прежде, чем обратиться к API, давайте обрисуем общую картину служб.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Что такое службы?&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Служба – это внутренний механизм, встроенный в операционную систему Windows. Вы можете считать службы специальными приложениями, работающие вне зависимости от текущего пользовательского контекста. Службы отличаются от обычных приложений тем, что ее можно настроить на работу с момента включения (загрузки) системы и до выключения, не требуя присутствия пользователя. То есть, службы могут работать, даже если пользователь не выполнил вход в систему.&lt;/p&gt;  &lt;p&gt;Мы предпочитаем считать службы запущенными задачами, работающими в фоновом режиме и не затрагивающими операции пользователя. Службы в Windows отвечают за все виды фоновой активности, начиная с Remote Procedure Call (RPC), Printer Spooler и вплоть до Network Location Awareness.&lt;/p&gt;  &lt;p&gt;На протяжении многих лет Windows росла и вместе с тем увеличивалось число служб. Будем честны, фоновые службы в Windows ощущаются довольно болезненно – операционная система изначально поставляется со множеством служб. Помимо этого, независимые разработчики ПО (ISV) и их приложения добавляют еще больше служб. На пример, службы обновления программного обеспечения. Вместе с тем, некоторые службы критически важны и требуются в процессе загрузки, в то время как необходимость в других возникает позже, когда определенный пользователь выполняет вход в систему, а иные и вовсе не нуждаются в запуске, пока не будут вызваны. Несмотря на это, когда вы просматриваете список запущенных в данный момент служб, то видите множество объектов, которым нет необходимости работать по схеме 24х7.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Что плохого в службах, работающих 24 часа в сутки 7 дней в неделю?&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Есть несколько проблем, связанных со службами, работающими по схеме 24х7. Во-первых, зачем что-то должно работать (пусть даже и в фоновом режиме), если в нем нет нужды? Любой запущенный процесс (включая службы) использует драгоценную память и ресурсы ЦП, которые могли бы использоваться для других приложений и служб. Если вы подсчитаете все службы, запущенные в определенный момент, то они сложатся в значительный объем памяти, дескрипторов, потоков и использование ЦП. Все эти «растрачиваемые» ресурсы понижают общую производительность компьютера, его отзывчивость и создают впечатление, что компьютер вялый и медлительный. К тому же, поскольку множество служб настроены на автоматический запуск (начинают работать при старте системы), они влияют на время загрузки компьютера.&lt;/p&gt;  &lt;p&gt;Во-вторых, эти растрачиваемые ресурсы непосредственным образом сказываются на потреблении электроэнергии. Чем больше нагрузка на ЦП, тем больше электроэнергии потребляет компьютер. Это может быть критически важно для ноутбуков и может сокращать время работы от батареи на несколько часов.&lt;/p&gt;  &lt;p&gt;В-третьих, постоянная работа непродуктивного программного обеспечения может привести к утечкам памяти и общей нестабильности системы. Это ведет к сбою в работе приложений и, в конце концов, компьютера.&lt;/p&gt;  &lt;p&gt;Наконец, если служба работает по схеме 24х7, и если это хорошо известная служба (которая может оказаться у каждого популярного приложения – например, у PDF Reader), то это создает большую поверхность для атаки. Злоумышленник может воспользоваться сведениями о том, что определенное популярное приложение устанавливает службу, работающую в режиме 24х7, и попытаться взломать ее для получения доступа к компьютеру.&lt;/p&gt;  &lt;p&gt;Учитывая все вышесказанное, вы можете удивиться, почему так много разработчиков настраивают свои службы на постоянную работу, если у них имеется другая возможность. Даже до Windows 7 было доступно несколько вариантов запуска служб:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;b&gt;Disabled (Отключена)&lt;/b&gt; полностью отключает службу и предотвращает ее запуск и запуск зависимых служб – это означает, что пользователь должен включить службу вручную из панели управления или командной строки &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Manual (Вручную)&lt;/b&gt; запускает службу по надобности (в связи с зависимостями других служб) или при вызове службы из приложения при помощи соответствующих API, как будет показано ниже &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Automatic (Автоматически)&lt;/b&gt; запускает службу при входе в систему &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Automatic Delayed (Автоматический отложенный запуск)&lt;/b&gt; – более новый тип запуска, появившийся в Windows Vista, при помощи которого запуск службы происходит после завершения загрузки и выполнения первоначальных операций, что ускоряет запуск системы. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;К сожалению, многие ISV (включая саму корпорацию Microsoft) продолжают настраивать свои службы на автоматический (Automated) или автоматический отложенный запуск (Automatic Delayed), поскольку для всех представляется простейшим решением. Служба просто работает 24х7 и всегда доступна, устраняя любую необходимость проверки зависимостей или того, запущена ли служба.&lt;/p&gt;  &lt;p&gt;Можно привести множество примеров существующих служб, которые могут расходовать куда меньше ресурсов и стать безопаснее, не работая в режиме 24х7. Например, подумайте о службе обновлений, которая проверяет наличие новых обновлений для приложения. Если компьютер не подключен к сети и не имеет IP-адреса, зачем ей работать? Она ничего не может сделать, так зачем оставлять работающей программу, которая ничего не делает? Подумайте о службе управления политиками, которая используется при изменении групповых политик или при подключении компьютера к домену или отключении от него, но сейчас, когда компьютер подключен к моей домашней сети, служба, опять же, работает впустую.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Появление служб с запуском по триггеру&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Решение вышеуказанных проблем заключается в выведении службы из «состояния постоянной работы» в другие виды фоновой активности, такие как запланированные задачи или службы, запускаемые триггером. Эта статья посвящена Windows 7 Trigger Start Services. О Windows 7 Scheduled Tasks можно сказать очень много интересного, что и будет сделано в последующих статьях.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd405513(VS.85).aspx"&gt;&lt;b&gt;Службы, запускаемые по триггеру&lt;/b&gt;&lt;/a&gt; (англ. trigger-start service), впервые появились в Windows 7. По сути, это обычная служба, которую можно настроить на запуск (или остановку) в случае срабатывания триггера, то есть в определенном случае или состоянии, которые вы сами задаете (например, когда становится доступным IP-адрес или когда он исчезает). Ниже приведен список доступных триггеров, с помощью которых можно настроить режим запуска службы:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Подключение или отключение устройства &lt;/li&gt;    &lt;li&gt;Вход в домен или выход из него &lt;/li&gt;    &lt;li&gt;Открытие или закрытия порта брандмауэра &lt;/li&gt;    &lt;li&gt;Изменение в групповых политиках &lt;/li&gt;    &lt;li&gt;Доступность первого IP-адреса/исчезновение последнего IP-адреса &lt;/li&gt;    &lt;li&gt;Настраиваемое событие – трассировка событий для Windows (ETW) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Последний пункт указывает на расширяемость. Разработчик может настроить любое событие ETW в качестве триггера для службы, что дает хороший инструмент для управления запуском и остановкой служб приложения.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Так что же такое триггер?&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Триггер состоит из:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Типа события триггера &lt;/li&gt;    &lt;li&gt;Подтипа события триггера &lt;/li&gt;    &lt;li&gt;Действия, которое должно быть предпринято при наступлении события триггера &lt;/li&gt;    &lt;li&gt;Одного или более элементов данных, связанных с триггером (для определенных типов событий триггера) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Подтип и связанные с триггером элементы данных вместе устанавливают состояние для уведомления службы о событии. Формат элемента данных зависит от типа события триггера; элемент данных может состоять из двоичных, строковых или многостроковых данных.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Работа с Trigger Start Services&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;К сожалению, в пользовательском интерфейсе консоли Windows 7 Services MMC нет графического представления Trigger Start Services. Однако у вас есть две возможности. Вы можете по-прежнему использовать старой доброй программой командной строки Service Configuration – sc.exe или воспользоваться методом WIN32 &lt;a href="http://msdn.microsoft.com/library/ms681988.aspx"&gt;&lt;b&gt;ChangeServiceConfig2&lt;/b&gt;&lt;/a&gt; для программной настройки параметров запуска службы, как будет показано в этой статье.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Использование SC.exe для запроса данных триггера службы (Query Service Trigger Information)&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Пора повеселиться. Начнем с получения сведений о конфигурации некоторых служб. Общая форма для использования конфигурации службы выглядит следующим образом:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;sc &amp;lt;server&amp;gt; [command] [service name] &amp;lt;option1&amp;gt; &amp;lt;option2&amp;gt;...&lt;/pre&gt;
&lt;style type="text/css"&gt;







.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;Где &lt;i&gt;server&lt;/i&gt; необязательный параметр, указывающий на компьютер (по умолчанию вы работаете с локальным компьютером): 

&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;command&lt;/b&gt; – это операция, которую нужно выполнить, например, запрос данных триггера &lt;/li&gt;

  &lt;li&gt;&lt;b&gt;service name – &lt;/b&gt;это имя службы, с которой будем работать &lt;/li&gt;

  &lt;li&gt;&lt;b&gt;options&lt;/b&gt; – это различные значения (параметры), которые можно выполнить для настройки службы &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Начнем с запроса определенной службы о ее конфигурации триггера. Для этого нам понадобится запустить окно Windows Shell:&lt;/p&gt;

&lt;p&gt;1. Откройте меню «Пуск».&lt;/p&gt;

&lt;p&gt;2. Введите CMD в поле поиска.&lt;/p&gt;

&lt;p&gt;3. Выберите cmd.exe.&lt;/p&gt;

&lt;p&gt;4. Введите sc &lt;b&gt;qtriggerinfo w32time&lt;/b&gt; и нажмите клавишу ввода.&lt;/p&gt;

&lt;p&gt;Вот, как это должно выглядеть:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/Windows7TriggerStartServicesPart1Introdu_E16B/clip_image002_2.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/Windows7TriggerStartServicesPart1Introdu_E16B/clip_image002_thumb.gif" width="627" height="160" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Как можно видеть, мы запросили данные триггера службы W32time, которая настроена на запуск при подключении компьютера к домену и остановку при отключении от домена.&lt;/p&gt;

&lt;p&gt;Microsoft в Windows 7 обновила приложение командной строки sc.exe для поддержки конфигурации и получения сведений о поддерживаемых триггерах. Введите sc triggerinfo в окне Windows Shell и нажмите клавишу ввода. Результат будет похож на тот, что приведен ниже, и будет содержать все триггеры и сведения о том, как настроить службы на их использование.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;C:\&amp;gt;sc triggerinfo
ОПИСАНИЕ:
        Изменяет параметры активации службы.
USAGE:
        sc &amp;lt;сервер&amp;gt; triggerinfo [имя службы] &amp;lt;параметр1&amp;gt; &amp;lt;параметр2&amp;gt;...&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;ПАРАМЕТРЫ:
 start/device/UUID/HwId1/... &amp;lt;Запуск службы после получения 
                              строки UUID указанного класса 
                              интерфейса устройства с одной 
                              или несколькими строками кода 
                              оборудования или совместимыми 
                              строками кода&amp;gt;
 start/custom/UUID/data0/.. &amp;lt;Запуск службы после получения 
                              события от строки UUID указанного 
                              настраиваемого поставщика трассировки 
                              событий Windows с одним или несколькими 
                              двоичными элементами данных в формате 
                              шестнадцатеричной строки, например,
                              ABCDABCD, для задания 4 байтов данных&amp;gt;
 stop/custom/UUID/data0/... &amp;lt;Остановка службы после получения 
                              события от строки UUID указанного 
                              настраиваемого поставщика трассировки 
                              событий Windows с одним или несколькими 
                              двоичными элементами данных в формате 
                              шестнадцатеричной строки, например, 
                              ABCDABCD, для задания 4 байтов данных&amp;gt;
 start/strcustom/UUID/data0/.. &amp;lt;Запуск службы после получения 
                              события от строки UUID указанного 
                              настраиваемого поставщика трассировки 
                              событий Windows с одним или несколькими 
                              необязательными элементами данных&amp;gt;
 stop/strcustom/UUID/data0/.. &amp;lt;Остановка службы после получения 
                              события от строки UUID указанного 
                              настраиваемого поставщика трассировки 
                              событий Windows с одним или несколькими 
                              необязательными элементами данных&amp;gt;
 start/networkon             &amp;lt;Запуск службы при первом IP-адресе&amp;gt;
 stop/networkoff             &amp;lt;Остановить службу при отсутствии IP-адресов&amp;gt;
 start/domainjoin            &amp;lt;Запуск службы при подключении к домену&amp;gt;
 stop/domainleave            &amp;lt;Остановка службы при отсоединении от домена&amp;gt;
 delete                      &amp;lt;Удаление текущих параметров триггера&amp;gt;&lt;/pre&gt;

&lt;p&gt;Все, что нужно для настройки службы на запуск при появлении IP-адреса, – это ввести &lt;i&gt;sc triggerinfo [имя службы] start/networkon&lt;/i&gt;, где «имя службы» заменено на имя той службы, которую вы хотите настроить.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Программная&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;настройка&lt;/b&gt;&lt;b&gt; Trigger Start Services &lt;/b&gt;&lt;b&gt;при&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;помощи&lt;/b&gt;&lt;b&gt; ChanceServiceConfig2&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Более интересным с точки зрения разработчиков аспектом является создание служб, зависящих от триггера, и использование кода для конфигурации службы. В Windows 7 вы можете использовать функцию &lt;b&gt;ChangeServiceConfig2&lt;/b&gt; для настройки данных триггера службы и функцию &lt;b&gt;QueryServiceConfig2&lt;/b&gt; для их вызова.&lt;/p&gt;

&lt;p&gt;Регистрация триггера службы производится вызовом &lt;b&gt;ChangeServiceConfig2&lt;/b&gt; с использованием SERVICE_CONFIG_TRIGGER_INFO для параметра &lt;i&gt;dwInfoLevel&lt;/i&gt; и представлением данных регистрации триггера в структуре SERVICE_TRIGGER_INFO посредством параметра&lt;i&gt; lpInfo&lt;/i&gt;. К тому же, могут быть указаны дополнительные связанные с триггером данные. Ниже приведен пример функции установщика службы, который создает триггер USB-устройства для службы под названием &lt;i&gt;MyService&lt;/i&gt;:&lt;/p&gt;

&lt;div&gt;
  &lt;pre id="codeSnippet" class="csharpcode"&gt;define SERVICE_NAME L&lt;span class="str"&gt;&amp;quot;MyService&amp;quot;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;//set the device guid&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; GUID GUID_USBDevice = {&lt;br /&gt;       0x53f56307, 0xb6bf, 0x11d0, &lt;br /&gt;       {0x94, 0xf2, 0x00, 0xa0, 0xc9, &lt;br /&gt;       0x1e, 0xfb, 0x8b }};&lt;br /&gt;&lt;br /&gt;BOOL _SetServiceToStartOnDeviceTrigger()&lt;br /&gt;{&lt;br /&gt;    BOOL fResult = &lt;span class="kwrd"&gt;FALSE&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    SC_HANDLE hScm = OpenSCManager(&lt;br /&gt;        NULL, &lt;span class="rem"&gt;//local machine&lt;/span&gt;&lt;br /&gt;        NULL, &lt;span class="rem"&gt;//active database&lt;/span&gt;&lt;br /&gt;        SC_MANAGER_CONNECT);&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt;(hScm != NULL)&lt;br /&gt;    {&lt;br /&gt;        SC_HANDLE hService = OpenService(&lt;br /&gt;            hScm,&lt;br /&gt;            SERVICE_NAME,&lt;br /&gt;            SERVICE_ALL_ACCESS);&lt;br /&gt;&lt;br /&gt;        If( hService != NULL)&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;           LPCWSTR lpszDeviceString = L&lt;span class="str"&gt;&amp;quot;USBSTOR\\GenDisk&amp;quot;&lt;/span&gt;;&lt;br /&gt;           SERVICE_TRIGGER_SPECIFIC_DATA_ITEM deviceData = {0};&lt;br /&gt;           deviceData.dwDataType = SERVICE_TRIGGER_DATA_TYPE_STRING;&lt;br /&gt;           deviceData.cbData = &lt;br /&gt;                       (wcslen(lpszDeviceString)+1) * &lt;span class="kwrd"&gt;sizeof&lt;/span&gt;(WCHAR);    &lt;br /&gt;           deviceData.pData = (PBYTE)lpszDeviceString;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;           &lt;br /&gt;           SERVICE_TRIGGER st;&lt;br /&gt;           st.dwTriggerType = &lt;br /&gt;                       SERVICE_TRIGGER_TYPE_DEVICE_INTERFACE_ARRIVAL;&lt;br /&gt;           st.dwAction = SERVICE_TRIGGER_ACTION_SERVICE_START;&lt;br /&gt;           st.pTriggerSubtype = (GUID *) &amp;amp;GUID_USBDevice;&lt;br /&gt;           st.cDataItems = 1;&lt;br /&gt;           st.pDataItems = &amp;amp;deviceData;&lt;br /&gt;&lt;br /&gt;           &lt;br /&gt;           SERVICE_TRIGGER_INFO sti;&lt;br /&gt;           sti.cTriggers = 1;&lt;br /&gt;           sti.pTriggers = &amp;amp;st;&lt;br /&gt;           sti.pReserved = 0;&lt;br /&gt;&lt;br /&gt;           fResult = ChangeServiceConfig2(&lt;br /&gt;                        hService,&lt;br /&gt;                        SERVICE_CONFIG_TRIGGER_INFO,&lt;br /&gt;                        &amp;amp;sti);&lt;br /&gt;        }&lt;br /&gt;        CloseServiceHandle (hService);&lt;br /&gt;    }&lt;br /&gt;    CloseServiceHandle (hScm);&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt;(!fResult)&lt;br /&gt;    {&lt;br /&gt;        printf(&lt;span class="str"&gt;&amp;quot;Service trigger registration failed (%d)\n&amp;quot;&lt;/span&gt;, &lt;br /&gt;                 GetLastError());&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; fResult;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Примечание: все службы контролируются Service Control Manager (SCM), который мы рассмотрим в другой статье.&lt;/p&gt;

&lt;p&gt;Можно видеть, как в приведенном фрагменте кода мы сначала получаем дескриптор (hScm) SCM вызовом &lt;i&gt;openSCManager&lt;/i&gt;. Далее мы вызываем &lt;i&gt;openService&lt;/i&gt; и определяем дескриптор SCM – hscm, и имя службы – SERVICE_NAME, к которой хотим получить доступ. Последний параметр, SERVICE_ALL_ACCESS, указывает, что у нас имеется полный доступ к службам. Полагая, что теперь имеется верный дескриптор, мы начинаем создавать отдельную структуру, которой воспользуемся вскоре для настройки службы.&lt;/p&gt;

&lt;p&gt;SERVICE_TRIGGER_SPECIFIC_DATA_ITEM задает тип события триггера. Он содержит данные о событии триггера службы. В нашем случае, мы задаем строку, описывающую подключение USB-диска.&lt;/p&gt;

&lt;p&gt;Затем мы задаем структуру SERVICE_TRIGGER, которая представляет события триггеру службы. Заметьте, что именно здесь мы задаем тип триггера (подключение устройства), действие (запуск службы), и подтип триггера (определенный род USB-дисков). Следом мы определяем конкретное устройство, которое будет вызывать службу. Заметьте, что вы можете задать список устройств и их GUID. Также следует отметить, что мы не хотим срабатывания триггера запуска службы при подключении любого USB-устройства, вроде мыши или камеры. Мы хотим, чтобы служба запускалась только при появлении USB-диска.&lt;/p&gt;

&lt;p&gt;Наконец, мы задаем структуру SERVICE_TRIGGER_INFO, которая содержит данные события триггера службы. Эта структура просто указывает на структуру SERVICE_TRIGGER, которую мы задали ранее, и количество триггеров, число которых в данном случае равно одному.&lt;/p&gt;

&lt;p&gt;Теперь мы можем вызвать функцию ChanceServiceConfig2 и передать дескриптор к службе, которую хотим настроить, параметр SERVICE_CONFIG_TRIGGER_INFO, который указывает, что мы хотим настроить триггер службы, и Null.&lt;/p&gt;

&lt;p&gt;Вот и все. Если вы все сделали правильно, то служба запуститься при подключении USB жесткого диска.&lt;/p&gt;

&lt;p&gt;В следующей статье я рассмотрю, как написать простую реализацию службы .NET, которую мы настроим на запуск при подключении диска USB.&lt;/p&gt;

&lt;p&gt;Вы можете узнать больше о Windows 7 при помощи &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=1C333F06-FADB-4D93-9C80-402621C600E7&amp;amp;displaylang=en"&gt;&lt;b&gt;Windows 7 Training Kit for Developers&lt;/b&gt;&lt;/a&gt; или просмотрев видео, посвященные Windows 7, на &lt;a href="http://channel9.msdn.com/windows"&gt;&lt;b&gt;Channel 9&lt;/b&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Вы также можете &lt;a href="http://channel9.msdn.com/learn/courses/Windows7/BackgroundServices/"&gt;&lt;b&gt;потренироваться&lt;/b&gt;&lt;/a&gt; в работе с Windows 7 Trigger Start Services при помощи &lt;a href="http://channel9.msdn.com/learn/courses/Windows7/"&gt;&lt;b&gt;курса Windows 7 Online&lt;/b&gt;&lt;/a&gt;, являющегося частью &lt;a href="http://channel9.msdn.com/learn/"&gt;&lt;b&gt;Channel 9 Learning Center&lt;/b&gt;&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9921322" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/windev/archive/tags/Channel+9/default.aspx">Channel 9</category><category domain="http://blogs.msdn.com/windev/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/windev/archive/tags/Triger+Start+Services/default.aspx">Triger Start Services</category><category domain="http://blogs.msdn.com/windev/archive/tags/Windows+7+Training+Kit/default.aspx">Windows 7 Training Kit</category></item><item><title>Новые ресурсы для разработчиков под Windows 7</title><link>http://blogs.msdn.com/windev/archive/2009/11/11/windows-7-ga-time-for-some-new-windows-7-developer-resources.aspx</link><pubDate>Wed, 11 Nov 2009 12:02:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9926142</guid><dc:creator>Daniel Kornev [MSFT]</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/windev/comments/9926142.aspx</comments><wfw:commentRss>http://blogs.msdn.com/windev/commentrss.aspx?PostID=9926142</wfw:commentRss><description>&lt;p&gt;Совсем недавно Windows 7 стала официально доступна широкой публике, и каждый может купить и установить себе Windows 7, как вместе с новым компьютером, так и в виде коробочной версии. Уже сейчас люди по всему миру могут запускать ваше приложение на Windows 7. Они ожидают, что оно будет работать так же, как если бы оно было создано специально для Windows 7, и использует в своей работе новые функции и технологии Windows 7, такие как новая панель задач, библиотеки, поддержка touch-интерфейса и сенсоры местоположения.&lt;/p&gt;  &lt;p&gt;В связи с тем, что Windows 7 наконец-то вышла, мы продолжаем выпускать новые материалы для разработчиков, которые должны помочь вам начать работу с новой ОС. Появление Windows 7 в публичном доступе является прекрасным поводом чтобы обновить все материалы для разработчиков по Windows 7, которые должны помочь в написании прекрасных приложений для новой операционной системы.&lt;/p&gt;  &lt;p&gt;Ниже приведен ряд ссылок, по которым вы можете найти ресурсы для разработчиков под Windows 7:&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Обновленный&lt;/b&gt;&lt;b&gt; Windows 7 Training Kit&lt;/b&gt; (&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=1c333f06-fadb-4d93-9c80-402621c600e7&amp;amp;displaylang=en"&gt;&lt;b&gt;Скачать&lt;/b&gt;&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=1c333f06-fadb-4d93-9c80-402621c600e7&amp;amp;displaylang=en"&gt;&lt;img title="image" border="0" alt="image" src="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_4AF2B9BF.png" width="276" height="256" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Чтобы помочь вам написать приложение под Windows 7 как можно скорее, мы обновили &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=1c333f06-fadb-4d93-9c80-402621c600e7&amp;amp;displaylang=en"&gt;&lt;b&gt;Windows 7 Training Kit for Developers&lt;/b&gt;&lt;/a&gt;. В нем можно найти информацию по всем предыдущим темам, таким как Taskbar, Sensor and Location, Libraries and Shell, Multitouch, Ribbon и т.д. В новой версии добавлено описание работы в среде VS2010 и использования новых расширений MFC в VS2010 (&lt;a href="http://www.microsoft.com/visualstudio/ru-ru/products/2010/default.mspx"&gt;&lt;strong&gt;скачать VS2010&lt;/strong&gt;&lt;/a&gt;). Мы также добавили в комплект VB-версии наших решений – теперь ни один разработчик не останется не у дел.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Онлайн&lt;/b&gt;&lt;b&gt;-&lt;/b&gt;&lt;b&gt;тренинги&lt;/b&gt;&lt;b&gt; Windows 7 &lt;/b&gt;&lt;b&gt;в&lt;/b&gt;&lt;b&gt; Channel 9 Learning Center&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Давайте предположим, что вы хотите узнать все о библиотеках Windows 7, или, например, о том, как добавить в приложение поддержку новых возможностей панели задач, но при этом не хотите скачивать весь комплект учебных материалов. Благодаря &lt;a href="http://channel9.msdn.com/learn/courses/Windows7"&gt;&lt;b&gt;Windows 7 Online Training Kit&lt;/b&gt;&lt;/a&gt;, размещенному на сайте &lt;a href="http://channel9.msdn.com/learn/"&gt;&lt;b&gt;Channel 9 Learning Center&lt;/b&gt;&lt;/a&gt;, вы получите доступ ко всем обучающим разделам по Windows 7. Каждый из этих разделов (например, Taskbar) включает в себя несколько обучающих видео по теме. Данный ресурс предоставляет вам быстрый и простой доступ к большинству наших обучающих материалов. Если вы хотите увидеть оставшуюся их часть, например, презентации PowerPoint и дополнительные демонстрационные видео, вам нужно &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=1c333f06-fadb-4d93-9c80-402621c600e7&amp;amp;displaylang=en"&gt;&lt;b&gt;скачать Windows 7 Training Kit for Developers&lt;/b&gt;&lt;/a&gt;. На следующем экране показана часть одного из руководств по написанию кода для панели задач.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://channel9.msdn.com/learn/courses/Windows7"&gt;&lt;img title="image" border="0" alt="image" src="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_42FB175D.png" width="563" height="316" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Как и всегда, в разделе про Windows 7 сайта Channel 9 находятся специальные видео и скринкасты про Windows 7. За прошедшие несколько недель мы опубликовали новые видео (включая новое видео от Марка Руссиновича), которые, я уверен, вы найдете весьма интересными и полезными. Хотелось бы вам напомнить, что &lt;a href="http://channel9.msdn.com/shows/Going+Deep/Mark-Russinovich-Inside-Windows-7/"&gt;&lt;b&gt;последнее видео&lt;/b&gt;&lt;/a&gt; Марка &lt;a href="http://channel9.msdn.com/shows/Going+Deep/Mark-Russinovich-Inside-Windows-7/"&gt;&lt;b&gt;«Mark Russinovich: Inside Windows 7»&lt;/b&gt;&lt;/a&gt;, стало блокбастером сайта Channel 9. Если вы до сих пор его не видели, то я очень рекомендую его посмотреть, так же как и новое видео &lt;a href="http://channel9.msdn.com/shows/Going+Deep/Mark-Russinovich-Inside-Windows-7-Redux/"&gt;&lt;b&gt;«Mark Russinovich: Inside Windows 7 Redux»&lt;/b&gt;&lt;/a&gt;. Не забывайте также следить за обновлениями следующих тематических разделов:&lt;/p&gt;  &lt;p&gt;· &lt;a href="http://channel9.msdn.com/windows/using/"&gt;&lt;b&gt;Using Windows 7&lt;/b&gt;&lt;/a&gt; – содержит ориентированные на потребителей и пользователей видео, вроде «Как установить Windows 7» и «Как настроить сеть домашней группы»;&lt;/p&gt;  &lt;p&gt;· &lt;a href="http://channel9.msdn.com/windows/programming/"&gt;&lt;b&gt;Programming Windows 7&lt;/b&gt;&lt;/a&gt; – думаю, не стоит объяснять, о чем этот раздел, не так ли?&lt;/p&gt;  &lt;p&gt;· И последнее по порядку, но не по значению – &lt;a href="http://channel9.msdn.com/windows/under-the-hood/"&gt;&lt;b&gt;«Under the Hood»&lt;/b&gt;&lt;/a&gt; – описание концепций внутренней архитектуры Windows.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;MSDN Developer Center&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;a href="http://msdn.microsoft.com/windows/default.aspx"&gt;MSDN Developer Center&lt;/a&gt;&lt;/b&gt; также подвергся редизайну в связи с выпуском Windows 7, обзавелся новым интерфейсом и получил ряд новых функций. MSDN Developer Center включает в себя множество &lt;a href="http://msdn.microsoft.com/windows/aa904962.aspx"&gt;&lt;b&gt;материалов по Windows 7&lt;/b&gt;&lt;/a&gt;, которые дополняют обучающие видео с сайта Channel 9. Думайте о MSDN Developer Center как о центре концентрации информации по Windows 7, знакомство с которой может послужить вам прекрасным стартом для разработки приложений, которые будут блистать на Windows 7. Там вы можете найти информацию на различные темы, обзоры программных моделей, узнать об инструментальных средствах для разработчика, которые можно использовать, просмотреть видео и почитать блоги.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/windows/aa904962.aspx"&gt;&lt;img title="image" border="0" alt="image" src="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_5AB24EC3.png" width="561" height="433" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Новая книга для разработчиков под Windows 7&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.amazon.com/gp/product/0735626820?ie=UTF8&amp;amp;tag=msdn-winc-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0735626820"&gt;&lt;img title="image" border="0" alt="image" src="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_67AC2ED4.png" width="237" height="285" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Помимо всего прочего, в MSDN Developer Center вы также можете найти &lt;a href="http://msdn.microsoft.com/windows/dd722803.aspx"&gt;&lt;b&gt;список рекомендуемых книг&lt;/b&gt;&lt;/a&gt; по Windows 7 для разработчиков. Последние несколько месяцев я был занят написанием книги про Windows 7 с тремя замечательными соавторами: Лоуренсом Моруни (Laurence Moroney), Сашей Голдштейном (Sasha Goldshtein) и Элоном Флайесом (Alon Fliess). Вместе мы написали книгу &lt;a href="http://www.amazon.com/gp/product/0735626820?ie=UTF8&amp;amp;tag=msdn-winc-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0735626820"&gt;&lt;b&gt;«Introducing Windows 7 for Developers»&lt;/b&gt;&lt;/a&gt;. В ней рассказывается о многих великолепных особенностях Windows 7, таких как новая панель задач, библиотеки, датчики расположения и сенсоры, multitouch (включая поддержку WPF 4 в VS 2010), и даже использование технологии Silverlight вне браузера (включая touch-технологию). Насколько я знаю, это первая книга по Windows 7 для разработчиков, и я надеюсь, вам она покажется полезной. Марк Руссинович воспользовался материалами из этой книги во время работы над интеграцией функций Windows 7 в инструменты Sysinternals и написал предисловие для этой книги.&lt;/p&gt;  &lt;p&gt;Я надеюсь, эта статья поможет вам в написании впечатляющих приложений для Windows 7.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9926142" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/windev/archive/tags/Channel+9/default.aspx">Channel 9</category><category domain="http://blogs.msdn.com/windev/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/windev/archive/tags/_1104380431043B0438043E04420435043A043804_/default.aspx">Библиотеки</category><category domain="http://blogs.msdn.com/windev/archive/tags/Windows+7+Training+Kit/default.aspx">Windows 7 Training Kit</category></item><item><title>Windows 7 на PDC 2009</title><link>http://blogs.msdn.com/windev/archive/2009/10/19/windows-7-at-pdc09.aspx</link><pubDate>Mon, 19 Oct 2009 07:28:48 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9908947</guid><dc:creator>Daniel Kornev [MSFT]</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/windev/comments/9908947.aspx</comments><wfw:commentRss>http://blogs.msdn.com/windev/commentrss.aspx?PostID=9908947</wfw:commentRss><description>&lt;p&gt;Professional Developers Conference (PDC) – это мероприятие, которое все разработчики, использующие технологи Microsoft, просто обязаны посетить хотя бы раз в жизни. Это флагманское событие, предлагающее всесторонний, обращенный в будущее, технически углубленный, плотный набор сессий от представителей Microsoft. И &lt;a href="http://microsoftpdc.com/"&gt;&lt;b&gt;PDC в этом году&lt;/b&gt;&lt;/a&gt; – не исключение, и вы вправе ожидать очень волнующее мероприятие.&lt;/p&gt;  &lt;p&gt;Моим первым PDC был PDC’08, проходивший в прошлом ноябре в LA Convention Center. Как одному из тех, кто работал над Windows 7 в Microsoft, мне очень повезло войти в тот узкий круг лиц, связанных с Windows 7 на PDC 2008, и внести свой вклад (хоть он был и невелик) в одно из выступлений. В выступлении второго дня Стивен Синофски (Steven Sinofsky) представил Windows 7 миру и впервые люди вне Microsoft увидели новую панель задач, Windows Ribbon, стали свидетелями демонстрации технологии одновременного нажатия. Посетители получили жесткий диск объемом 160 ГБ (что заставляет задуматься о том, что они получат в этом году…) с Windows 7 build 6801 (кто-нибудь помнит эту сборку?). Команда разработчиков Windows представила множество своих технологий в ряде впечатляющих сессий. И с тех пор, на протяжении различных версий Windows – Beta, RC и RTM – мы продолжали выпускать новые материалы, чтобы помочь разработчикам подготовиться к Windows 7.&lt;/p&gt;  &lt;p&gt;Windows 7 выйдет на рынок 22 октября, а PDC в этом году пройдет сразу же после релиза Windows 7. Теперь без тумана секретности, окутавшего предварительные версии, на PDC в этом году мы сможем углубиться (очень углубиться) в Windows 7, чтобы развернуть наше понимание того, как работает Windows 7 и, что куда более важно, какие преимущества могут получить разработчики от всех тех улучшений и возможностей, предлагаемых Windows 7.&lt;/p&gt;  &lt;p&gt;Для начала, за день до начала PDC’09, состоится &lt;a href="http://windowsteamblog.com/blogs/developers/archive/2009/10/07/free-windows-7-seminar-with-mark-russinovich-and-friends.aspx"&gt;&lt;b&gt;БЕСПЛАТНЫЙ семинар Windows 7 Boot Camp&lt;/b&gt;&lt;/a&gt;, проводимый ведущими экспертами Microsoft, такими, как Марк Руссинович (Mark Russinovich), Лэнди Вонг (Landy Wang) и Арун Кишан (Arun Kishan). Затем, в течение самого PDC, пройдет несколько более углубленных сессий, посвященных Windows 7.&lt;/p&gt;  &lt;p&gt;Что ж, вот первый набор сессий Windows 7, который мы анонсируем:&lt;/p&gt;  &lt;p&gt;Первая сессия затрагивает, пожалуй, мою любимую тему (я фанатик, что еще можно сказать). Что может быть важнее, чем быстродействие, особенно, когда оно касается Windows 7 и приложений, запущенных на Windows 7? Эта сессия должна стать обязательной к посещению для любого разработчика, пишущего любое программное обеспечение (с неуправляемым кодом или .NET-совместимое) для &lt;b&gt;Windows&lt;/b&gt; (и не только для Windows 7) – это действительно уникальная возможность.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Повышая быстродействие при помощи Windows Performance Tookit&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Команда разработчиков Windows 7 использует Windows Performance Toolkit (WPT) для оптимизации операционной системы. Приходите и узрите, как команда разработчиков Windows Performance использовала WPT в течение цикла разработки Windows 7 для оптимизации под сценарии клиентов, и как вы можете использовать многие из его функций и возможностей, которые помогут создать более быстрые приложения для Windows. Во время этой сессии будут показаны учебные примеры, которые продемонстрируют, как использовать этот набор инструментов для выявления областей, нуждающихся в улучшении в вашем приложении, и будут предложены принципы, которым необходимо следовать для создания приложений с оптимальной производительностью.&lt;/p&gt;  &lt;p&gt;Следующие две сессии также в числе моих любимых (вы не можете осудить меня за любовь к Windows 7), поскольку я думаю, что эти технологии представляют новый уровень пользовательского взаимодействия и адаптивных пользовательских интерфейсов:&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Создавая контекстно-зависимые приложения с Windows 7 и .NET&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Сколько раз вы про себя думали: «Моему приложению было бы намного лучше, если бы оно знало, где находится пользователь»? Благодаря Windows 7 и .NET Framework 4.0 теперь в ваших руках есть инструменты для определения местоположения в ваших приложениях. Используя новую платформу Location and Sensor в Windows 7, API местоположения в .NET Framework 4.0 предлагает единый, последовательный API для получения географической широты и долготы, не обращая внимания на лежащую в основе технологию, позволяя вас сфокусироваться на создании превосходных, разнообразных контекстно-зависимых приложений.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Погружение в Windows Touch&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Windows предлагает приложения со стандартным набором возможностей взаимодействия жестами и прикосновениями. Ваши приложения могут выйти за пределы обычных возможностей благодаря мощной платформе, которую они теперь способны задействовать. Эта сессия нацелена на разработчиков, заинтересованных в создании решений, оптимизированных под прикосновения. Мы ближе рассмотрим некоторые из наиболее важных составных частей платформы Touch, такие, как управление и бездействие процессоров, а также рассмотрим насущные проблемы, которые нашли и успешно обошли разработчики.&lt;/p&gt;  &lt;p&gt;Еще одна очень рекомендуемая к посещению сессия посвящена Windows Ribbon. Прежде, чем вы откажетесь от Ribbon, я рекомендую вам взглянуть на него еще раз и прочитать между строк неуправляемого API Windows Ribbon. В текущем API представлена очень интересная архитектура программного обеспечения, которая дает первое представление об инфраструктуре будущего.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Технические аспекты Windows Ribbon&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Это выступление покроет некоторые из наиболее острых и сложных аспектов реализации ленточного интерфейса, таких, как проектирование галерей (важнейшая задача любой ленты), добавление внешних MRU и т.д. Мы будем отталкиваться от конкретных примеров Windows Live и других партнеров, и расскажем о том опыте, который накопили эти команды разработчиков, как подопытные кролики Windows Ribbon.&lt;/p&gt;  &lt;p&gt;Очень многое было сказано об обновлении в Windows 7 графического стека. Этот стек играет важную роль в повышении производительности Windows 7. Вы, как разработчик, можете воспользоваться этими изменениями и задействовать разнообразные современные графические технологии, которые используют максимум ресурсов графических процессоров.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Современная 3D-графика в Windows 7 и оборудовании Direct3D&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Окунитесь в возможности Direct3D 11 и Windows 7, чтобы получить практические навыки, которые помогут использовать графику на всю катушку. Узнайте о новом этапе тесселяции в Direct3D 11, который обеспечивает беспрецедентное качество рендеринга, динамично генерируя геометрию в ГП. К тому же вы увидите, как улучшения поддержки многоядерности в среде выполнения Direct3D 11 могут помочь в масштабировании приложения, чтобы задействовать все ядра на компьютере. Наконец, узнайте о возможностях DirectCompute (вычислительной технологии общего назначения, использующей аппаратное ускорение) в контексте графических приложений.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Передовые графические возможности с DirectX&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Число конфигураций ПК растет. С нетбуками и передовыми настольными системами, использующими последнее графическое оборудование, создание приложений, удовлетворяющих всем этим системам, становится все сложнее с каждым годом. Приходите, и мы расскажем о многих опциях, доступных в Windows 7 и служащих для упрощения графической разработки для всех видов аппаратных конфигураций, от маломощных встроенных ГП до топовых линеек дискретных карт. Узнайте о Direct3D 10 Level 9, который позволяет приложениям Direct3D 10 работать на практически всех компьютерах, доступных сегодня на рынке. Узнайте о WARP, новой программной прорисовке, которая позволяет приложениям использовать высококачественную графику, даже при отсутствии видеокарты. Наконец, узнайте о Direct2D, DirectWrite, WIC и возможности взаимодействия технологий Windows 7 для создания искусной, высококачественной графики в ваших приложениях.&lt;/p&gt;  &lt;p&gt;Последняя сессия, которую я рассмотрю в этой статье, но далеко не последняя по важности, посвящена &lt;a href="http://code.msdn.microsoft.com/WindowsAPICodePack"&gt;&lt;b&gt;Windows API Code Pack for Microsoft .NET&lt;/b&gt;&lt;/a&gt;. Это платформа, в которой у меня есть личная заинтересованность и о которой я довольно часто пишу. С Visual Studio 2010 и .NET 4, жизнь разработчиков .NET станет проще. Тем не менее, остается огромное количество важных Windows API, которые не входят в состав пакета .NET. Эта библиотека открытого кода предлагает отличное промежуточное решение.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Разработка&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;с&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;помощью&lt;/b&gt;&lt;b&gt; Windows API Code Pack for .NET Framework&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Windows API Code Pack for Microsoft .NET Framework включает библиотеку исходных кодов, которую вы можете использовать для доступа к некоторым новым возможностям Windows 7 (и некоторым замечательным функциям предыдущих версий операционной системы Windows) из управляемого кода. Эти функции Windows сегодня недоступны разработчикам из .NET Framework. Эта сессия расскажет, как вы можете получить доступ к таким возможностям, как интеграция с панелью задач, списки переходов, библиотеки, сенсорная платформа, Direct2D и другие.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9908947" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/windev/archive/tags/_1A043E043D0444043504400435043D04460438043804_/default.aspx">Конференции</category></item><item><title>Готово ли ваше приложение к Windows 7 RTM?</title><link>http://blogs.msdn.com/windev/archive/2009/08/28/is-your-application-ready-for-windows-7-rtm.aspx</link><pubDate>Fri, 28 Aug 2009 11:44:32 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9888116</guid><dc:creator>Daniel Kornev [MSFT]</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/windev/comments/9888116.aspx</comments><wfw:commentRss>http://blogs.msdn.com/windev/commentrss.aspx?PostID=9888116</wfw:commentRss><description>&lt;p&gt;Несколько недель назад состоялся важный этап в разработке &lt;b&gt;Windows&lt;/b&gt; 7 – &lt;a href="http://windowsteamblog.com/blogs/windows7/archive/2009/07/22/windows-7-has-been-released-to-manufacturing.aspx"&gt;она была отправлена в печать&lt;/a&gt;! И через три месяца – 22 октября – Windows 7 станет доступна всем желающим. Восторженное ожидание предстоящего публичного релиза Windows 7 росло месяцами, и мы ожидаем куда более высокий уровень ее принятия, чем это было с предыдущими версиями Windows.&lt;/p&gt;  &lt;p&gt;Поскольку мы приближаемся к 22 октября, вы должны спросить себя: готово ли ваше приложение к Windows 7? Что будет, когда конечные пользователи установят ваше приложение на Windows? Запустится ли оно? Увидят ли пользователи какую-либо разницу, когда запустят приложение на Windows 7 по сравнению с Windows Vista или XP? 22 октября уже не за горами и мы здесь, чтобы помочь вам ответить «&lt;strong&gt;Да!&lt;/strong&gt;» на эти вопросы и убедиться, что «&lt;strong&gt;Однозначно, мое приложение блистает всеми красками на Windows 7&lt;/strong&gt;». Мы хотим помочь создать у пользователей приятное впечатление от вашего приложения и, конечно же, от Windows 7.&lt;/p&gt;  &lt;p&gt;Все это звучит замечательно, но какие шаги нужно предпринять, чтобы сказать: «Да, мое приложение работает на Windows»? Есть ли контрольный список? Да, конечно, есть.&lt;/p&gt;  &lt;p&gt;Вам нужно сделать три вещи, чтобы обеспечить плавный переход:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Убедиться, что приложение совместимо с Windows 7&lt;/li&gt;    &lt;li&gt;Оптимизировать его работу и быстродействие в Windows 7&lt;/li&gt;    &lt;li&gt;Реализовать новые возможности, предоставляемые Windows 7&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;strong&gt;Убедитесь, что приложение совместимо с Windows 7&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Перед тем, как использовать новые возможности Windows 7, убедитесь, что ваше приложение совместимо с нею. Другого пути нет: очень важно, чтобы вы убедились, что приложение правильно работает в Windows 7. Нет ничего хуже для пользователя, чем находиться в предвкушении новой операционной системы и обнаружить, что приложение просто не работает. Некорректная работа вредит всем – вот почему вы должны убедиться, что ваше приложение устанавливается и работает на всех версиях Windows 7 и поддерживает как 32-, так и 64-разрядную версии.&lt;/p&gt;  &lt;p&gt;Если приложение совместимо с Windows Vista, значит, у вас не будет проблем! Мы ожидаем, что большинство приложений, работающих на Windows Vista, будет работать на Windows 7. Понятно, что вы не можете быть уверенными в этом и должны проверить (и перепроверить), что приложение и вправду совместимо с Windows 7. Есть ряд различий между Windows Vista и Windows 7, которые могут повлиять на определенную функциональность приложений, так что если вы до сих пор не ознакомились с &lt;a href="http://code.msdn.microsoft.com/Windows7AppQuality"&gt;Windows 7 Quality Cookbook&lt;/a&gt;, мы настоятельно рекомендуем сделать это.&lt;/p&gt;  &lt;p&gt;Если приложение было разработано для Windows XP (или более ранней версии Windows), и вы не проверяли, совместимо ли оно с Windows Vista, есть ряд вопросов (например, UAC), которым вы должны уделить особое внимание. Важно помнить, что нет единой палочки-выручалочки для всех проблем совместимости. Каждое приложение имеет свой собственный набор проблем, который зависит от отдельных нюансов реализации. &lt;a href="http://msdn.microsoft.com/library/bb757005"&gt;Windows Vista Application Compatibility Cookbook&lt;/a&gt; остается актуальной для Windows 7, поскольку 99% содержимого этой документации применимо к Windows 7. Стоит отметить, что некоторые разделы важнее других. Следующие семь тем покрывают большую часть отчетов о проблемах совместимости.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Проверка версий&lt;/strong&gt; – безусловно, главная проблема совместимости приложений. Вы когда-нибудь получали сообщение от приложения «Требуется Windows XP или выше», пытаясь запустить его на Windows 7? Если так, то вы наткнулись на проблему проверки версии. Больше на эту тему можно узнать в статье &lt;a href="http://msdn.microsoft.com/en-us/library/bb756927.aspx"&gt;Проблемы совместимости: версии операционных систем&lt;/a&gt;.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Перенаправление данных&lt;/strong&gt; – начиная с Windows Vista, обычные пользователи имеют ограниченных доступ к некоторым файлам, папкам и ключам реестра. Когда приложение пытается произвести запись в эти объекты, оно получает перенаправление куда-нибудь еще. В основном, это прозрачно и для пользователя, и для разработчиков, но иногда случается иначе, что приводит к очень интересным результатам. Вы можете узнать больше на эту тему из статьи &lt;a href="http://support.microsoft.com/kb/927387"&gt;Общие проблемы виртуализации файлов и реестра в Windows Vista&lt;/a&gt;.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Защищенный режим IE&lt;/strong&gt; – начиная с Windows Vista, по умолчанию IE работает с низкими правами. Обычно это означает, что некоторые элементы управления ActiveX, которые работали в Windows XP, не работают в Windows Vista и Windows 7. Если вам требуется дополнительная информация, прочтите о &lt;a href="http://blogs.msdn.com/ie/archive/2006/02/09/528963.aspx"&gt;Защищенном режиме в Vista IE7&lt;/a&gt; (это применимо и к IE8).&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Изоляция Сессии 0&lt;/strong&gt; – в Windows Vista службы работают в собственной сессии (сессия 0), а не в пользовательской сессии(ях) (сессия 1 и выше). Эта граница безопасности защищает систему от многих атак и абсолютно необходима. Однако она также вызывает проблемы коммуникации между службами и приложением, как, например, блокирование сообщений! Вы можете узнать больше на эту тему в статье «&lt;a href="http://blogs.msdn.com/cjacks/archive/2006/10/24/modifying-the-mandatory-integrity-level-for-a-securable-object-in-windows-vista.aspx"&gt;Изменение обязательного уровня целостности для защищенных объектов в Windows Vista&lt;/a&gt;».&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Обнаружение инсталлятора&lt;/strong&gt; – начиная с Windows Vista, ОС автоматически пытается определить, является ли приложение программой установки, запуск которых обычно требует прав администратора. Однако иногда эта эвристика может вызвать проблемы. Если вам требуется дополнительная информация, прочтите &lt;a href="http://msdn.microsoft.com/en-us/library/aa905330.aspx"&gt;Правила разработчика Windows Vista и Windows Server 2008&lt;/a&gt;.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Ограничение привилегий пользовательского интерфейса&lt;/strong&gt; – не позволяет приложению (процессу) посылать сообщения другому процессу с более высокими правами, даже если они запущены из одной учетной записи. В то время как это защищает от shatter-атак, ограничение также может привести к неработоспособности некоторых приложений.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;High DPI&lt;/strong&gt; – во время установки Windows 7 автоматически определяет, поддерживает ли ваш экран High DPI. Если поддерживает, то Windows 7 автоматически устанавливает разрешение экрана на High DPI. Если приложение несовместимо с High DPI, это может вызвать некоторые проблемы отображения (например, обрезание текста). Узнайте больше о том, как &lt;a href="http://msdn.microsoft.com/en-us/library/dd756693.aspx"&gt;убедиться, что приложение отображается корректно на дисплеях с High-DPI&lt;/a&gt;.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;В ближайшие недели мы подробно рассмотрим каждый из этих пунктов, чтобы помочь вам подготовиться к Windows 7.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Оптимизация работы и быстродействия приложения в Windows 7&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;После проверки того, что приложение устанавливается и работает на Windows 7 без проблем, наступает время идти дальше и оптимизировать его работу и быстродействие в Windows 7. Сделайте это при помощи использования новых возможностей, представленных в Windows 7. Сюда входят и инновации в пользовательском интерфейсе, такие как панель задач (Taskbar) и библиотеки (Libraries), и более фундаментальные функции, вроде сервисов Trigger Start Services или новой платформы Troubleshooting (Устранение неполадок). Оптимизируя приложение для Windows 7, вы можете убедиться, что работа пользователей с ним в Windows 7 превзойдет их ожидания. Пользователи могут ожидать, что приложение работает правильно с панелью задач (всего лишь пример), но если оно не оптимизировано для работы с новой панелью задач Windows 7, конечный пользователь может заметить это.&lt;/p&gt;  &lt;p&gt;Когда вы будете готовы к оптимизации приложения для Windows 7, обдумайте одну или несколько из следующих возможностей:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Панель задач (Taskbar)&lt;/strong&gt; – новая панель задач в Windows 7 предоставляет пользователю больше интуитивно понятной информации при помощи таких функций, как списки переходов (jump lists), которые помогают быстро переходить к необходимому объекту/задаче. Также рекомендую ознакомиться со статьей &lt;a href="http://blogs.msdn.com/windev/archive/2009/06/25/developing-for-the-windows-7-taskbar-application-id.aspx"&gt;Разработка для панели задач Windows 7 – Application ID&lt;/a&gt;.&lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_0C2CB989.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/IsYourApplicationReadyforWindows7RTM_B325/clip_image002_00243de9-b44a-4b77-85bf-75ff376d2546.gif" width="209" height="323" /&gt;&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Библиотеки (Libraries)&lt;/strong&gt; – это точки доступа к пользовательским данных в Windows 7. Библиотека в Windows 7 – это заданная пользователем коллекция, выводящая данные пользователя независимо от иерархии папок. Пользователь может объединить иерархию папок, собрав любое количество физических папок (на своей локальной машине или удаленных устройствах) в одно место – библиотеку. Узнать о библиотеках больше вы сможете, прочитав &lt;a href="http://blogs.msdn.com/windev/archive/2009/06/13/windows-7-programming-guide-libraries.aspx"&gt;Руководство по программированию Windows 7: библиотеки&lt;/a&gt;.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Trigger Start Services&lt;/strong&gt; – Windows 7 Service Control Manager был расширен, чтобы служба могла быть автоматически запущена и остановлена при определенном системном событии, или триггере, сработавшем в системе. Возможность триггер-включения ликвидирует необходимость службе запускаться автоматически при включении компьютера и простаивать в ожидании, когда событие случится, например, когда будет подключено устройство. Больше по этой теме можно узнать из статьи &lt;a href="http://msdn.microsoft.com/en-us/library/dd405513.aspx"&gt;Service Trigger Events&lt;/a&gt;.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Оптимизация энергопотребления&lt;/strong&gt; – Windows 7 предлагает инфраструктуру и инструменты, которые помогают разработчикам определить влияние электропитания на их приложения. Набор обратных вызовов событий позволяет приложениям уменьшать их активность, когда система работает от аккумулятора и увеличивать ее при работе от сети.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Troubleshooting Platform&lt;/strong&gt; – Windows 7 предлагает обширную и расширяемую платформу Troubleshooting (Устранение неполадок), которая использует основанный на PowerShell механизм выявления и устранения проблем. Troubleshooting Platform плавно интегрируется с Windows 7 PC Solution Center и дает возможность другим приложениям выполнять диагностику тем же образом. Узнайте больше о &lt;a href="http://msdn.microsoft.com/en-us/library/dd323778.aspx"&gt;Windows Troubleshooting Platforum&lt;/a&gt;.      &lt;br /&gt; &lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_3C075B4A.png"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/a&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/IsYourApplicationReadyforWindows7RTM_B325/clip_image004_322e536b-cb4c-47ec-a254-f982619217ff.gif" width="354" height="272" /&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Windows Error Reporting&lt;/strong&gt; – это набор технологий Windows, которые записывают данные о сбое приложения и могут отправить отчет с информацией о сбое. Благодаря службам Winqual, поставщики программного и аппаратного обеспечения могут получать доступ к отчетам для анализа и решения проблем. Этот набор инструментов предоставляет информацию в реальном времени о качестве программного обеспечения и упрощают обновление и создание патчей. См. &lt;a href="http://www.microsoft.com/whdc/maintain/StartWER.mspx"&gt;Приступая к работе с Windows Error Reporting&lt;/a&gt;.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Оптимизация I/O&lt;/strong&gt; – назначение приоритетов ввода/вывода улучшает отзывчивость операционной системы без значительного снижения быстродействия. Если у вас имеются службы, функционирующие в течение продолжительного времени и активно использующие ввод/вывод, которые можно было бы запустить в фоновом режиме, то пользователь был бы вам благодарен за этот шаг. Неоптимизированные по вводу/выводу приложения дают дополнительную нагрузку на систему. Если приложение оптимизирует ввод/вывод для некритичных служб, это может значительно улучшить поведение системы целиком.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Restart Manager&lt;/strong&gt; – эта технология дает возможность автоматического перезапуска после сбоя, а также применение обновлений к приложениям и операционной системе без перезагрузки самой машины. Когда вы встраиваете данную функциональность, то получаете второй шанс сохранить важную для приложения информацию. Windows автоматически перезапустит ваше приложение и попытается загрузить информацию, с которой пользователь только что работал. Эта же технология упрощает обновление большинства приложений и операционной системы без перезагрузки. Если же перезагрузка необходима, то Windows перезапустит приложение и вернет его в последнее состояние.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Реализация новых возможностей Windows 7&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Как только вы выполнили первые два шага, можете разнообразить свое приложение новыми уникальными возможностями Windows 7. Windows 7 позволяет создавать разнообразные и интуитивные приложения, которые значительно увеличивают доступность, простоту в использовании и улучшают общее восприятие. Новые методы настольной интеграции помещают функциональность приложения «на кончики пальцев» пользователя. Новые Touch API делают возможным естественное взаимодействие при помощи технологии одновременного нажатия и движений пальцев. Стремительное развитие аппаратных и программных технологий также ведет к более точному пользовательскому интерфейсу. Windows 7 отдает эти достижения под контроль разработчика с новыми гибкими API, использующими все преимущества технологии и одновременно упрощающими разработку приложений.&lt;/p&gt;  &lt;p&gt;Windows 7 включает множество новых возможностей, которые могут заставить приложение сиять, возвышаясь над конкурентами. Когда вы задумаетесь о создании нового восхитительного пользовательского интерфейса, вспомните об одной или нескольких из следующих возможностей:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Ribbon&lt;/strong&gt; – в Windows 7 включен Ribbon-интерфейс Office 2007, который обеспечивает платформу для разработки интерфейсов пользователя. Это означает, что могжно забыть о нудной разработке Win32 UI и предложить визуально богатый и знакомый пользовательский интерфейс, используя UI на базе разметки и быстродействующую исполняемую среду управляемого кода.&lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_20EE8C3C.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/IsYourApplicationReadyforWindows7RTM_B325/clip_image006_6232684e-e788-414c-8e88-87e1ac599abb.gif" width="569" height="72" /&gt;&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Multitouch &amp;amp; Ink&lt;/strong&gt; – Windows 7 включает улучшенную поддержку прикосновений и жестов, позволяя разработчикам быстро и просто создавать уникальные интерфейсы приложений, которые не ограничиваются простыми наведениями мышки, щелчками и перетаскиваниями. Новые Multi-touch API поддерживают разнообразные жесты, такие как перелистывание, масштабирование и поворот. Все жесты получают немедленный визуальный отклик и взаимодействуют с контентом естественно и интуитивно.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Sensor and Location Platform&lt;/strong&gt; – Windows 7 изменяет то, как разработчики используют сенсоры. Сюда входит и поддержка датчиков, расширенная новой платформой разработки на уже существующие типы, включая датчики местоположения (такие как устройства GPS) и датчики температуры и освещенности, позволяющая создавать контекстно-зависимые приложения. Датчики местоположения открывают новые возможности для служб, ориентированных на определенное местоположение.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Новый графический стек&lt;/strong&gt; – Windows 7 дает в руки разработчикам новые графические возможности при помощи нового набора DirectX API. Разработчики Win32 могут получить преимущества от последних добавлений в GPU, чтобы включить быструю, масштабируемую, высококачественну 2D- и 3D-графику, текст и изображения в свои приложения.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_460BD6A8.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="clip_image008" border="0" alt="clip_image008" src="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/IsYourApplicationReadyforWindows7RTM_B325/clip_image008_b61b8d0b-03ec-4dd7-be86-fb0733568f97.gif" width="244" height="202" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Платформа мультимедиа&lt;/strong&gt; – Media Foundation и DirectShow® составляют основу поддержки мультимедиа в Windows Media Foundation, появившейся в Windows Vista как замена DirectShow. В Windows 7 Media Foundation была расширена для лучшей поддержки форматов, включая:&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;MPEG-4&lt;/li&gt;      &lt;li&gt;Запись видео с устройств и аппаратных декодеров, таких как H.264, MJPEG и MP3&lt;/li&gt;      &lt;li&gt;Новые источники для MP4, 3GP, MPEG2-TS и AVI&lt;/li&gt;      &lt;li&gt;Новые приемники для MP4, 3GP и MP3&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;И для разработчиков Windows 7 добавляет новые API высокого уровня, которые сильно упрощают написание мультимедиа-приложений.&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Федеративный поиск (Federated Search)&lt;/strong&gt; – Windows 7 обеспечивает поиск документов за пределами ПК пользователя. Разработчики и ИТ-специалисты могут добавить в свои движки, хранилища документов, веб-приложения и частные хранилища данных поддержку поиска из Windows 7 без написания и развертывания клиентского кода. Это позволит искать внутри сети своей корпорации или в Интернете легко, как если бы они искали свои локальные файлы – из знакомого интерфейса Windows.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Интеграция Device Stage&lt;/strong&gt; – Windows 7 совмещает программное обеспечение и службы для создания новых способов работы с мобильными телефонами, портативными медиа-плеерами, камерами и принтерами. Windows 7 упрощает использование этих устройств прямо с рабочего стола Windows. Она также дает производителям устройств возможность создать заметное место на рабочем столе Windows с расположением брендовой информации и простого интерфейса для представления функциональности и служб, поддерживаемых устройствами.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Я надеюсь, эта статья поможет вам начать работу, чтобы сделать ваше приложение для Windows 7 ярким и поистине запоминающимся!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9888116" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/windev/archive/tags/Win7+Developer+Guide/default.aspx">Win7 Developer Guide</category></item><item><title>7 способов получить бесплатные билеты на PDC 2009 и 17777 долларов</title><link>http://blogs.msdn.com/windev/archive/2009/07/17/7-pdc-2009-17777.aspx</link><pubDate>Fri, 17 Jul 2009 10:31:27 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9836841</guid><dc:creator>Daniel Kornev [MSFT]</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/windev/comments/9836841.aspx</comments><wfw:commentRss>http://blogs.msdn.com/windev/commentrss.aspx?PostID=9836841</wfw:commentRss><description>&lt;p&gt;Хотите выиграть путешествие в Лос-Анджелес и бесплатный билет на PDC 2009? Полагаете, что у вас есть все необходимое, чтобы выиграть 17777 американских долларов? Считаете, что сможете создать уникальное приложение для Windows 7?&lt;/p&gt;  &lt;p&gt;Если на каждый из трех вопросов вы ответили утвердительно, тогда добро пожаловать на сайт &lt;a href="https://www.code7contest.com/"&gt;Code&lt;sup&gt;7&lt;/sup&gt; Contest&lt;/a&gt;. Конкурс Code&lt;sup&gt;7&lt;/sup&gt; дает возможность привлечь внимание к своему приложению, а также выиграть путешествие в Лос-Анджелес на конференцию PDC09 и до &lt;b&gt;17777&lt;/b&gt;&lt;b&gt; американских долларов&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;наличными&lt;/b&gt;&lt;b&gt;!&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/clip_5F00_image002_5F00_6FD1F86B.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Code7 Contest" border="0" alt="Code7 Contest" src="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/7PDC200917777_A1AB/clip_image001_a7049b55-ab12-4a7d-9cd1-5f2278a712ac.jpg" width="542" height="311" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Code&lt;sup&gt;7&lt;/sup&gt; – это специальный конкурс для разработчиков приложений. Это уникальная возможность продемонстрировать ваш талант и опыт программирования всему миру. Это отличный способ заработать на собственном опыте и знаниях.&lt;/p&gt;  &lt;p&gt;Это не просто очередной конкурс на умение программировать; этот конкурс даст финалистам возможность лично представить свое приложение посетителям конференции PDC 2009 в Лос-Анджелесе. Первый приз –17777 американских долларов наличными, возможность представить свое приложение руководству Microsoft на PDC 2009, а также всемирный интерес к вашему приложению, включая массивную маркетинговую кампанию.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;u&gt;Для того, чтобы принять участие в конкурсе, вам необходимо:&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Создать оригинальный, ориентированный на конечных потребителей прототип приложения для Windows 7 (с помощью Win32, WPF, MFC или WinForms, но не приложение Air или обычный гаджет), относящегося к одной или нескольким категориям:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Упрости свою жизнь &lt;/li&gt;    &lt;li&gt;Больше медиа, больше мест &lt;/li&gt;    &lt;li&gt;Игры &lt;/li&gt;    &lt;li&gt;Работа отовсюду &lt;/li&gt;    &lt;li&gt;Защити свое дело &lt;/li&gt;    &lt;li&gt;Приложения для лучшего завтра &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;В приложении должна быть использована, как минимум, одна из указанных технологий Windows 7. Однако, предпочтение будет отдаваться тем работам, в которых используется более одной из этих функций:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Библиотеки &lt;/li&gt;    &lt;li&gt;Windows Touch &lt;/li&gt;    &lt;li&gt;Интеграция с оболочкой &lt;/li&gt;    &lt;li&gt;DX11 (DirectX 11) &lt;/li&gt;    &lt;li&gt;Платформа Sensor and Location &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Поэтому, если вы регулярно читаете этот блог, у вас есть преимущество.&lt;/p&gt;  &lt;p&gt;Конкурс будет проходить в несколько этапов и вот несколько правил, о которых следует знать:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Для того, чтобы принять участие в конкурсе, вы должны записать и опубликовать &lt;b&gt;видео&lt;/b&gt;, в котором необходимо подробно описать и продемонстрировать приложение. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Первый квалификационный раунд&lt;/b&gt; начинается в 12:00 по тихоокеанскому времени (PT) &lt;b&gt;13 июля 2009 года&lt;/b&gt; и заканчивается в 23:59 &lt;b&gt;10 октября 2009 года&lt;/b&gt;. Вы сможете загрузить свое видео до 23:59 &lt;b&gt;10 октября 2009 года&lt;/b&gt;. Оно будет включено в пул с другими работами основываясь на географическом расположении. &lt;/li&gt;    &lt;li&gt;Видео, добавленные до 23:59 &lt;b&gt;15 августа 2009 года&lt;/b&gt;, попадут в розыгрыш призов, описанных в разделе &lt;b&gt;Early&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;Bird&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;Prize&lt;/b&gt;. &lt;/li&gt;    &lt;li&gt;По завершении первого квалификационного раунда компетентное жюри выберет двух призеров и одного финалиста из каждой географической области. &lt;/li&gt;    &lt;li&gt;Затем Microsoft уведомит всех призеров и финалистов, а также снабдит их инструкциями по загрузке приложения для последующей оценки. &lt;/li&gt;    &lt;li&gt;Финалисты будут приглашены представить свои приложения компетентному жюри на конференции Partner Developer Conference 2009 (PDC09) в Лос-Анджелесе. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;За дополнительной информацией по поводу правил обращайтесь к разделу «Правила» на сайте конкурса- &lt;a href="https://www.code7contest.com/"&gt;https://www.code7contest.com/&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Так чего же вы ждете? Приступайте к работе над своим приложением для Windows 7!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9836841" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/windev/archive/tags/_1A043E043D043A04430440044104_/default.aspx">Конкурс</category></item><item><title>Разработка для панели задач Windows 7 – переходим к спискам переходов – часть 3</title><link>http://blogs.msdn.com/windev/archive/2009/07/13/developing-for-the-windows-7-taskbar-jump-into-jump-lists-part-3.aspx</link><pubDate>Mon, 13 Jul 2009 12:21:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9889761</guid><dc:creator>Daniel Kornev [MSFT]</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/windev/comments/9889761.aspx</comments><wfw:commentRss>http://blogs.msdn.com/windev/commentrss.aspx?PostID=9889761</wfw:commentRss><description>&lt;p&gt;К этому моменту вы, как я надеюсь, поняли, как &lt;a href="http://blogs.msdn.com/windev/archive/2009/07/12/developing-for-the-windows-7-taskbar-jump-into-jump-lists-part-2.aspx"&gt;&lt;b&gt;создать собственный список переходов для вашего приложения&lt;/b&gt;&lt;/a&gt;. Вы также должны были оценить стандартную поддержку Windows 7 для категорий «Recent» и «Frequent» и понять, как создавать свои собственные категории. В этой статье мы рассмотрим другие возможности списков переходов и покажем, насколько просто добавлять новые задачи в список приложения.&lt;/p&gt;  &lt;p&gt;Задачи пользователя – это настраиваемые задачи, помещаемые в собственную категорию Tasks. Как разработчик вы можете установить заголовок отображаемой задачи, иконку слева и, что более важно, приложение, которое запускается, когда данная задача активируется. Вы можете рассматривать задачи пользователя как ярлыки функций, обеспечиваемых приложением. Как вы помните, задачи пользователя в нашем словаре выражаются глаголами; например, в списке Windows Media Player есть задача «Resume last playlist», а в Sticky Notes – задача «New note».&lt;/p&gt;  &lt;p&gt;Задача пользователя обычно представляет собой объект &lt;a href="http://msdn.microsoft.com/en-us/library/bb774950.aspx"&gt;&lt;b&gt;IShellLink&lt;/b&gt;&lt;/a&gt;, который запускает любое указанное приложение (ваше приложение или любое другое, которое вы выберите) с соответствующим параметром командной строки. Хотя вы не можете распределять задачи по категориям, вы можете разделить их, используя специальный разделительный объект. Ниже приведен пример списка с разделителем, который разбивает три задачи на группу из двух задач и одной дополнительной:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_17EEBBC0.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image002" border="0" alt="clip_image002" src="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/DevelopingfortheWindows7TaskbarJumpintoJ_B834/clip_image002_6146314b-81d8-4884-9a6f-a0d6f3c539a9.gif" width="242" height="234" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Так что же требуется для добавления задач в список переходов? На самом деле, не так уж много. По существу, это один единственный вызов функции &lt;b&gt;AddUserTasks&lt;/b&gt; в интерфейсе, с которым мы уже знакомы, ICustomDestinationList (ICustomDestinationList::AddUserTasks(IObjectArray) Method). Рассматривая код, вы увидите одну единственную строку, &lt;b&gt;hr = pcdl-&amp;gt;AddUserTasks(poa);&lt;/b&gt;. Однако как всегда, кто-то должен создать переменную &lt;i&gt;poa,&lt;/i&gt; IObjectArray, параметр и заполнить их соответствующий информацией. Давайте рассмотрим этот процесс.&lt;/p&gt;  &lt;p&gt;Мы создадим коллекцию IShellLinks. Эта коллекция будет позже приведена к требуемому параметру IObjectArray. Нижеприведенный код начинает этот процесс.&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;IObjectCollection *poc;&lt;br /&gt;HRESULT hr = CoCreateInstance(&lt;br /&gt;D_EnumerableObjectCollection, NULL, CLSCTX_INPROC, IID_PPV_ARGS(&amp;amp;poc));&lt;br /&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hr))&lt;br /&gt;{&lt;br /&gt;    IShellLink * psl;&lt;br /&gt;    hr = _CreateShellLink(L&lt;span style="color: #006080"&gt;&amp;quot;/Task1&amp;quot;&lt;/span&gt;, L&lt;span style="color: #006080"&gt;&amp;quot;Task 1&amp;quot;&lt;/span&gt;, &amp;amp;psl);&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hr))&lt;br /&gt;    {&lt;br /&gt;        hr = poc-&amp;gt;AddObject(psl);&lt;br /&gt;        psl-&amp;gt;Release();&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Здесь можно видеть, что мы использовали COM (вновь) и CoCreate и IObjectCollection, poc. Далее вызывается вспомогательная функция CreateShellLink с тремя параметрами:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Первый параметр – это аргумент командной строки для задачи &lt;/li&gt;

  &lt;li&gt;Второй параметр – это заголовок, который будет отображен &lt;/li&gt;

  &lt;li&gt;Третий параметр – это указатель на IShellLink. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Затем объект заполняется соответствующей информацией.&lt;/p&gt;

&lt;p&gt;Наконец, мы добавляем недавно созданный IShellLink в коллекцию объекта. Вы можете задаться вопросом, где же параметр, который указывает путь к исполняемому файлу, который мы планируем вызвать. Что же, это хороший вопрос. Для простоты, мы жестко задаем эту информацию, как показано в следующем фрагменте кода:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hr))&lt;br /&gt;{&lt;br /&gt;    hr = _CreateShellLink2(&lt;br /&gt;            L&lt;span style="color: #006080"&gt;&amp;quot;C:\\Users\\&amp;lt;my user&amp;gt;\\Documents\\new text file.txt&amp;quot;&lt;/span&gt;, &lt;br /&gt;            L&lt;span style="color: #006080"&gt;&amp;quot;NotePad&amp;quot;&lt;/span&gt;, &lt;br /&gt;            &amp;amp;psl);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hr))&lt;br /&gt;    {&lt;br /&gt;        hr = poc-&amp;gt;AddObject(psl);&lt;br /&gt;        psl-&amp;gt;Release();&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Здесь вы можете видеть, что мы вызывает жестко заданную функцию &lt;b&gt;_CreateShellLink2&lt;/b&gt;. Ей присваиваем в качестве одного из параметров путь к текстовому файлу и запускаем Notepad.&lt;/p&gt;

&lt;p&gt;Вот код с вызовом функции &lt;b&gt;CreateShellLink2&lt;/b&gt;:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;HRESULT _CreateShellLink2(&lt;br /&gt;            PCWSTR pszArguments, PCWSTR pszTitle, &lt;br /&gt;            IShellLink **ppsl)&lt;br /&gt;{&lt;br /&gt;    IShellLink *psl;&lt;br /&gt;    HRESULT hr = CoCreateInstance(&lt;br /&gt;                    CLSID_ShellLink, &lt;br /&gt;                    NULL, &lt;br /&gt;                    CLSCTX_INPROC_SERVER, &lt;br /&gt;                    IID_PPV_ARGS(&amp;amp;psl));&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hr))&lt;br /&gt;    {&lt;br /&gt;        hr = psl-&amp;gt;SetPath(c_szNotePadExecPath);&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hr))&lt;br /&gt;            {&lt;br /&gt;                hr = psl-&amp;gt;SetArguments(pszArguments);&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hr))&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: #008000"&gt;// Свойство заголовка требуется элементам списка,&lt;/span&gt;&lt;br /&gt;                    &lt;span style="color: #008000"&gt;// представленным как экземпляр IShellLink. Это значение используется&lt;/span&gt;&lt;br /&gt;                    &lt;span style="color: #008000"&gt;// как отображаемое имя в списке переходов.&lt;/span&gt;&lt;br /&gt;                    IPropertyStore *pps;&lt;br /&gt;                    hr = psl-&amp;gt;QueryInterface(IID_PPV_ARGS(&amp;amp;pps));&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hr))&lt;br /&gt;                    {&lt;br /&gt;                        PROPVARIANT propvar;&lt;br /&gt;                        hr = InitPropVariantFromString(pszTitle, &amp;amp;propvar);&lt;br /&gt;                        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hr))&lt;br /&gt;                        {&lt;br /&gt;                            hr = pps-&amp;gt;SetValue(PKEY_Title, propvar);&lt;br /&gt;                            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hr))&lt;br /&gt;                            {&lt;br /&gt;                                hr = pps-&amp;gt;Commit();&lt;br /&gt;                                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hr))&lt;br /&gt;                                {&lt;br /&gt;                                    hr = psl-&amp;gt;QueryInterface&lt;br /&gt;                                            (IID_PPV_ARGS(ppsl));&lt;br /&gt;                                }&lt;br /&gt;                            }&lt;br /&gt;                            PropVariantClear(&amp;amp;propvar);&lt;br /&gt;                        }&lt;br /&gt;                        pps-&amp;gt;Release();&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            hr = HRESULT_FROM_WIN32(GetLastError());&lt;br /&gt;        }&lt;br /&gt;        psl-&amp;gt;Release();&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; hr;&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Сначала нам вновь следует использовать COM и CoCreate для создания COM-объекта IShellLink. Даже беглый просмотр SDK обнаруживает, что у объекта IShellLink есть множество функций. Вот несколько из них, которые мы будем использовать:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;GetPath&lt;/b&gt; – получает путь и имя файла объекта, которые являются путем к исполняемому файлу &lt;/li&gt;

  &lt;li&gt;&lt;b&gt;GetShowCmd&lt;/b&gt; – получает команду объекта Shell link, имя исполняемого файла &lt;/li&gt;

  &lt;li&gt;&lt;b&gt;SetArguments&lt;/b&gt; – устанавливает аргументы командной строки для объекта Shell link &lt;/li&gt;

  &lt;li&gt;&lt;b&gt;SetDescription&lt;/b&gt; – устанавливает описание для объекта Shell link; описание может быть любой определенной приложением строкой &lt;/li&gt;

  &lt;li&gt;&lt;b&gt;SetIconLocation&lt;/b&gt; – устанавливает размещение (путь и индекс) иконки объекта Shell link &lt;/li&gt;

  &lt;li&gt;&lt;b&gt;SetPath&lt;/b&gt; – устанавливает путь и имя файла для объекта Shell link &lt;/li&gt;

  &lt;li&gt;&lt;b&gt;SetWorkingDirectory&lt;/b&gt; – задает имя рабочей папки для объекта Shell link &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Как видите, для каждого параметра мы должны получить и задать соответствующие методы. Есть и дополнительные параметры; просмотрите раздел &lt;a href="http://msdn.microsoft.com/en-us/library/bb774950.aspx"&gt;&lt;b&gt;IShellLink&lt;/b&gt;&lt;/a&gt; в SDK, если хотите узнать больше.&lt;/p&gt;

&lt;p&gt;В примере выше мы установили путь к Notepad (при установке Windows 7 по умолчанию, c:\windows\notepad.exe). Мы также жестко задали (не самая лучшая привычка) аргумент командной строки, указывающий на текстовой файл в моей папке документов (C:\Users\&amp;lt;my user&amp;gt;\Documents\new text file.txt). Оставшаяся часть кода задает свойство заголовка, требующееся для элементов списка.&lt;/p&gt;

&lt;p&gt;Мы вызываем &lt;b&gt;CreateShellLink2&lt;/b&gt; и &lt;b&gt;CreateShellLink&lt;/b&gt; еще несколько раз, чтобы добавить все три ярлыка, как показано на скриншоте выше.&lt;/p&gt;

&lt;p&gt;Теперь давайте добавим разделитель.&lt;/p&gt;

&lt;p&gt;Для добавления разделителя в наш TaskList, нам необходимо создать IShellLink и установить свойство PKEY_AppUserModel_IsDestListSeparator, используя свойство COM, как показано во фрагменте кода ниже:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #008000"&gt;// Категория Tasks в списке переходов поддерживает разделительные элементы. &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;// Это простые экземпляры IShellLink, у которых&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;// Свойство PKEY_AppUserModel_IsDestListSeparator установлено в TRUE.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;// Все другие значения игнорируются.&lt;/span&gt;&lt;br /&gt;HRESULT _CreateSeparatorLink(IShellLink **ppsl)&lt;br /&gt;{&lt;br /&gt;    IPropertyStore *pps;&lt;br /&gt;    HRESULT hr = CoCreateInstance(&lt;br /&gt;                    CLSID_ShellLink, &lt;br /&gt;                    NULL, &lt;br /&gt;                    CLSCTX_INPROC_SERVER, &lt;br /&gt;                    IID_PPV_ARGS(&amp;amp;pps));&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hr))&lt;br /&gt;    {&lt;br /&gt;        PROPVARIANT propvar;&lt;br /&gt;        hr = InitPropVariantFromBoolean(&lt;span style="color: #0000ff"&gt;TRUE&lt;/span&gt;, &amp;amp;propvar);&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hr))&lt;br /&gt;        {&lt;br /&gt;            hr = pps-&amp;gt;SetValue(PKEY_AppUserModel_IsDestListSeparator, propvar);&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hr))&lt;br /&gt;            {&lt;br /&gt;                hr = pps-&amp;gt;Commit();&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hr))&lt;br /&gt;                {&lt;br /&gt;                    hr = pps-&amp;gt;QueryInterface(IID_PPV_ARGS(ppsl));&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            PropVariantClear(&amp;amp;propvar);&lt;br /&gt;        }&lt;br /&gt;        pps-&amp;gt;Release();&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; hr;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Здесь вы можете видеть, что мы использовали &lt;b&gt;CoCreate&lt;/b&gt; для создания объекта &lt;b&gt;IShellLink&lt;/b&gt;. Далее мы присвоили переменной PROPVARIANT&lt;b&gt; propvar&lt;/b&gt; значение TRUE и установили свойство &lt;b&gt;PKEY_AppUserModel_IsDestListSeparator&lt;/b&gt; объекта &lt;b&gt;IShellLink&lt;/b&gt; в TRUE. Это заставит ОС показать &lt;b&gt;IS&lt;/b&gt;&lt;b&gt;h&lt;/b&gt;&lt;b&gt;ellLink&lt;/b&gt; как разделитель, а не как обычный &lt;b&gt;IShellLink&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;Что ж, это было не так уж сложно. Тем не менее, давайте взглянем на укороченную версию, используя .NET. Для этого мы воспользуемся &lt;a href="http://windowsteamblog.com/blogs/developers/archive/2009/05/18/windows-7-managed-code-apis.aspx"&gt;&lt;b&gt;Windows API Code pack for the .NET Framework&lt;/b&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Как и следует ожидать от .NET, мы получаем абстракцию большей части требуемого COM-кода. Пространство имен &lt;b&gt;Microsoft.WindowsAPICodePack.Shell.Taskbar&lt;/b&gt; включает объект &lt;b&gt;JumpListLink&lt;/b&gt;, который расширяет объект &lt;b&gt;ShellLink&lt;/b&gt; и встраивает &lt;b&gt;IJumpListTasks&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;Класс &lt;b&gt;JumpList&lt;/b&gt; содержит &lt;b&gt;UserTasks&lt;/b&gt;-коллекцию &lt;b&gt;IJumpListTasks&lt;/b&gt;, к которой вы можете просто добавить новые объекты &lt;b&gt;JumpListLink&lt;/b&gt;, как показано в следующем фрагменте кода:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #008000"&gt;// Путь к системному каталогу Windows&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; systemFolder = &lt;br /&gt;        Environment.GetFolderPath(Environment.SpecialFolder.System);&lt;br /&gt;&lt;br /&gt;jumpList.UserTasks.Add(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; JumpListLink&lt;br /&gt;{&lt;br /&gt;    Title = &lt;span style="color: #006080"&gt;&amp;quot;Open Notepad&amp;quot;&lt;/span&gt;,&lt;br /&gt;    Path = Path.Combine(systemFolder, &lt;span style="color: #006080"&gt;&amp;quot;notepad.exe&amp;quot;&lt;/span&gt;),&lt;br /&gt;    IconReference = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; IconReference(&lt;br /&gt;(systemFolder, &lt;span style="color: #006080"&gt;&amp;quot;notepad.exe&amp;quot;&lt;/span&gt;), 0)&lt;br /&gt;});&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Используя синтаксис C# 3.0, мы инициализируем новый объект &lt;b&gt;JumpListLink&lt;/b&gt; и добавляем его в коллекцию &lt;b&gt;UserTasks&lt;/b&gt;. Как вы видите, управляемый код &lt;b&gt;JumpListLink&lt;/b&gt; имеет свойства очень схожие с неуправляемым кодом (что очень разумно). Мы также добавили иконку к ярлыку Блокнота в коде выше, но не указали никаких параметров командной строки.&lt;/p&gt;

&lt;p&gt;Вы хотите добавить разделитель? Что же, это также очень просто: просто добавьте объект &lt;b&gt;JumpListSeparator&lt;/b&gt; к коллекции UserTasks.&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;jumpList.UserTasks.Add(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; JumpListSeparator());&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Заметьте, пожалуйста, что, как всегда, работая с Windows Code pack API Taskbar, необходимо вызвать функцию «refresh», чтобы подтвердить изменения, как объяснялось в предыдущей статье.&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;Taskbar.JumpList.RefreshTaskbarList();&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;После обновления список выглядит следующим образом:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_7284C851.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/DevelopingfortheWindows7TaskbarJumpintoJ_B834/clip_image004_fdbbdaf6-45cc-4984-84fc-06ab8a8091c0.gif" width="243" height="237" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Я скомпилировал пример в неуправляемом коде из Windows 7 SDK. Вы можете получить копию этого кода &lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers.CodeSamples/CustomJumpList.zip"&gt;&lt;b&gt;здесь&lt;/b&gt;&lt;/a&gt;. Вы можете &lt;a href="http://code.msdn.microsoft.com/WindowsAPICodePack"&gt;&lt;b&gt;загрузить Windows API Code Pack&lt;/b&gt;&lt;/a&gt;, включающий примеры управляемого кода, который мы использовали в этой статье.&lt;/p&gt;

&lt;p&gt;Это завершает наш разговор о списках переходов. Наша следующая статья о панели задач будет посвящена Icon Overlay.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9889761" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/windev/archive/tags/_1F0430043D0435043B044C04_+_37043004340430044704_/default.aspx">Панель задач</category></item><item><title>Разработка для панели задач Windows 7 – переходим к спискам переходов – часть 2</title><link>http://blogs.msdn.com/windev/archive/2009/07/12/developing-for-the-windows-7-taskbar-jump-into-jump-lists-part-2.aspx</link><pubDate>Sun, 12 Jul 2009 16:37:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9852096</guid><dc:creator>Daniel Kornev [MSFT]</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/windev/comments/9852096.aspx</comments><wfw:commentRss>http://blogs.msdn.com/windev/commentrss.aspx?PostID=9852096</wfw:commentRss><description>&lt;p&gt;Вторая часть статьи о списках перехода из серии, посвященной панели задач Windows 7. В &lt;a href="http://blogs.msdn.com/windev/archive/2009/07/11/developing-for-the-windows-7-taskbar-jump-into-jump-lists-part-1.aspx"&gt;&lt;b&gt;предыдущей статье&lt;/b&gt;&lt;/a&gt; мы рассказали об элементах, которые входят в состав списков переходов: назначениях и задачах. Как разработчик вы имеете значительный уровень контроля над этими элементами. В этой статье мы поговорим о различных API, которые вы можете использовать при программировании списков переходов.&lt;/p&gt;  &lt;p&gt;Сначала следует поговорить об одной важной вещи. Элементы, попадающие в категорию Recent (недавно открытых), также как и в любую другую, &lt;b&gt;&lt;i&gt;должны иметь зарегистрированный обработчик файлов для приложения в реестре&lt;/i&gt;&lt;/b&gt;. Это вовсе не означает, что приложение должно быть стандартным обработчиком этого определённого типа файлов. Это значит, что ваше приложение должно иметь зарегистрированный обработчик для всех файлов, которые вы хотите сделать доступными в выпадающем списке. Таким образом, элементами могут быть только файлы. Запомните, при щелчке по одному из элементов в выпадающем списке ОС исполняет команду, ассоциированную с этим файлом, по отношению к вашей программе. Когда вы регистрируете обработчик файлов, вы также указываете приложение, которое обрабатывает файл, и определяете, как обрабатывать входящие параметры. Еще одна важная вещь, которую необходимо помнить: все элементы (файлы) должны быть локальными, то есть находиться на локальном жёстком диске, и быть доступными вашему приложению. Таким образом, мы можем сказать, что каждый элемент в назначениях выпадающего списка является доступным локальным файлом с зарегистрированным обработчиком файлов.&lt;/p&gt;  &lt;p&gt;Как мы упоминали в предыдущих статьях, как только вы зарегистрировали обработчик файлов, ОС фактически помогает отслеживать эти файлы. В следующей статье мы поговорим об обработчике файлов.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Шаг 1. Используйте стандартное поведение Windows «из коробки»&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;По умолчанию списки переходов содержат категорию «Recent», которая в случае использующих файлы приложений автоматически будет наполняться содержимым с помощью функции SHAddToRecentDocs. Эта функция добавляет использованный элемент (файл) в список оболочки недавно использованных документов. В дополнение к обновлению списка недавних документов оболочка добавляет ярлык в пользовательскую папку с одноименным названием. Панель задач Windows 7 использует этот список и папку недавних документов для заполнения списка последних документов в списке переходов.&lt;/p&gt;  &lt;p&gt;Windows сможет выполнить работу за вас, если тип файла вашего приложения зарегистрирован в системе. Каждый раз, когда вы дважды щёлкаете на файле с зарегистрированным обработчиком до того, как Windows запустит приложение, ОС автоматически вызовет функцию SHAddToRecentDocs от имени вашего приложения. Это разместит элемент в списке недавних документов Windows, и, в конце концов, в категории «Recent» списка переходов. То же самое происходит при использовании общего файлового диалога (Common File Dialog, CFD) для открытия файлов с помощью типового приложения. Таким образом, это еще один хороший повод использовать CFD, дебютировавший в Windows Vista и играющий жизненно важную роль в отношении библиотек, как мы уже объясняли в &lt;a href="http://blogs.msdn.com/windev/archive/2009/04/21/light-up-with-windows-7-libraries.aspx"&gt;&lt;b&gt;одной из статей цикла&lt;/b&gt;&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Оба примера используют стандартное поведение Windows в тех случаях, когда у вас есть зарегистрированный обработчик и Application ID, благодаря которым файлы ассоциируются со списками недавно и часто используемых элементов. В обоих случаях Windows автоматически вставляет элемент в список переходов, только если вы специально не отключили эту возможность, используя COM API. Очевидно, что у пользователей также есть возможность удалить любой элемент из списка переходов. Удаляя элемент из списка, вы перемещаете его в список удалённых элементов, который мы обсудим ниже.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Шаг 2. Создайте собственную категорию&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Если стандартные категории не отвечают вашим нуждам, то пришло время создать собственную категорию. Для этого необходимо использовать интерфейс ICustomDestinationList для создания собственного списка.&lt;/p&gt;  &lt;p&gt;ICustomDestinationList открывает методы, которые позволяют приложению предоставлять собственные списки переходов с собственными назначениями и заданиями для их отображения в панели задач. Вот методы, которые мы используем для приведённого ниже примера:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;AppendCategory – определяет собственные категории и назначения для их включения в собственный список переходов &lt;/li&gt;    &lt;li&gt;AppendKnownCategory – определяет, что категории недавно и часто используемых документов должны быть включены в список переходов &lt;/li&gt;    &lt;li&gt;BeginList – инициирует начало сессии по созданию собственного списка перехода &lt;/li&gt;    &lt;li&gt;CommitList – декларирует, что список переходов, инициированный вызовом к BeginList, завершен и готов для отображения. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Следующий пример кода показывает, как создать новый собственный список под названием Custom Lists и добавить туда несколько элементов:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt; CreateJumpList()&lt;br /&gt;{    &lt;br /&gt;    ICustomDestinationList *pcdl;&lt;br /&gt;    HRESULT hr = CoCreateInstance(&lt;br /&gt;                    CLSID_DestinationList, &lt;br /&gt;                    NULL, &lt;br /&gt;                    CLSCTX_INPROC_SERVER, &lt;br /&gt;                    IID_PPV_ARGS(&amp;amp;pcdl));&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hr))&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000"&gt;//important to setup App Id for the Jump List&lt;/span&gt;&lt;br /&gt;        hr = pcdl-&amp;gt;SetAppID(c_szAppID);&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hr))&lt;br /&gt;        {&lt;br /&gt;            UINT uMaxSlots;&lt;br /&gt;            IObjectArray *poaRemoved;&lt;br /&gt;            hr = pcdl-&amp;gt;BeginList(&lt;br /&gt;                            &amp;amp;uMaxSlots, &lt;br /&gt;                            IID_PPV_ARGS(&amp;amp;poaRemoved));&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hr))&lt;br /&gt;            {&lt;br /&gt;                hr = _AddCategoryToList(pcdl, poaRemoved);&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hr))&lt;br /&gt;                {&lt;br /&gt;                    pcdl-&amp;gt;CommitList();&lt;br /&gt;                }&lt;br /&gt;                poaRemoved-&amp;gt;Release();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Здесь можно видеть, что мы начали со стандартного вызова COM-инициализации. Мы вызвали CoCreateInstance для инициализации объекта ICustomDestinationList (вот в чем заключается удовольствие работы с COM). Дальше, мы указали Application ID, чтобы начать заполнять список элементами.&lt;/p&gt;

&lt;p&gt;Функция BeginList инициировала начало сессии для пользовательского списка. Эта функция возвращает максимальное количество элементов, которое поместится в указанный список. Стандартное значение составляет 10 элементов. Вы могли заметить параметр элемента Remove, IObjectArray *poaRemoved, который BeginList() возвращает как выходной параметр. Он хранит любой элемент, удаленный пользователем из списка переходов в ходе текущей сессии.&lt;/p&gt;

&lt;p&gt;Дальше мы вызывали вспомогательную функцию _AddCategoryToList(), чтобы провести всю фактическую работу по добавлению элементов в пользовательскую категорию.&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #008000"&gt;// Это функция помощника, добавляющая элементы в коллекцию &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;// object HRESULT _AddCategoryToList(ICustomDestinationList *pcdl, &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;// IObjectArray *poaRemoved)&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;    IObjectCollection *poc;&lt;br /&gt;    HRESULT hr = CoCreateInstance&lt;br /&gt;                    (CLSID_EnumerableObjectCollection, &lt;br /&gt;                    NULL, &lt;br /&gt;                    CLSCTX_INPROC_SERVER, &lt;br /&gt;                    IID_PPV_ARGS(&amp;amp;poc));&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hr))&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (UINT i = 0; i &amp;lt; ARRAYSIZE(c_rgpszFiles); i++)&lt;br /&gt;        {&lt;br /&gt;            IShellItem *psi;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(SHCreateItemInKnownFolder(&lt;br /&gt;                                FOLDERID_Documents, &lt;br /&gt;                                KF_FLAG_DEFAULT, &lt;br /&gt;                                c_rgpszFiles[i], &lt;br /&gt;                                IID_PPV_ARGS(&amp;amp;psi)))&lt;br /&gt;                )&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt;(!_IsItemInArray(psi, poaRemoved))&lt;br /&gt;                {&lt;br /&gt;                    poc-&amp;gt;AddObject(psi);&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                psi-&amp;gt;Release();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        IObjectArray *poa;&lt;br /&gt;        hr = poc-&amp;gt;QueryInterface(IID_PPV_ARGS(&amp;amp;poa));&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hr))&lt;br /&gt;        {&lt;br /&gt;            pcdl-&amp;gt;AppendCategory(L&lt;span style="color: #006080"&gt;&amp;quot;Custom category&amp;quot;&lt;/span&gt;, poa);&lt;br /&gt;            poa-&amp;gt;Release();&lt;br /&gt;        }&lt;br /&gt;        poc-&amp;gt;Release();&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; hr;&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Еще одним новым интерфейсом, который мы использовали, является IObjectCollection, представляющий коллекцию объектов с поддержкой функции IUnknown. В нее мы добавили IShellItems. Каждый элемент (файл), который мы добавили в список переходов, относится к типу IShellItem. В вышеуказанном коде был создан объект элемента оболочки для одного файла, который существует в известной папке – Documents. Однако перед тем, как мы фактически добавили новый элемент в коллекцию, мы должны определить, удалил ли его пользователь. Если пользователь точно удалил элемент из списка, этот элемент будет в списке удалённых элементов (и ассоциированном с AppID) и, как разработчики, мы должны уважать желание пользователя и избегать добавления этого элемента в список переходов. У нас уже есть список удалённых элементов, IObjectArray *poaRemoved, который был получен при вызове функции BeginList(…) в момент инициализации нового списка.&lt;/p&gt;

&lt;p&gt;На данном этапе у вас есть коллекция элементов оболочки, которые пользователь ожидает увидеть в списке переходов. Дальше мы добавим эту коллекцию в объект ICustomDestinationList и создадим новую категорию под названием «Custom category», pcdl-&amp;gt;AppendCategory (L»Custom category», poa);.&lt;/p&gt;

&lt;p&gt;Итак, мы успешно создали новую категорию в панели задач под названием «Custom category» и наполнили её четырьмя элементами. Однако наша работа еще не закончена. Финальный шаг функции CreateJumpList – вызвать CommitList(), чтобы закончить транзакцию, начатую с вызовом BeginList(). Только после нашего вызова CommitList() в списке будут отображаться новые элементы и категории. Вызов CommitList() запускает очищение списка удалённых элементов и создание нового списка удалённых элементов. Интерфейс ICustomDestinationList предоставляет «транзакционную базу» API.&lt;/p&gt;

&lt;p&gt;Чтобы гарантировать удобство конечному пользователю, удостоверьтесь, что безопасная копия нового заполненного списка закончена и готова к использованию, и единственной операцией, которую должна выполнить панель задач – переключить указатель на новый список. Результат должен выглядеть следующим образом:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_3D4A7529.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image002" border="0" alt="clip_image002" src="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/DevelopingfortheWindows7TaskbarJumpintoJ_F764/clip_image002_91f9d5a5-0649-47d3-b463-1e1b34a34bc7.gif" width="455" height="371" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Используя &lt;a href="http://www.thevista.ru/page.php?id=11303"&gt;&lt;b&gt;Windows API Code Pack&lt;/b&gt;&lt;/a&gt;, мы можем создать то же самое приложение, используя управляемый код.&lt;/p&gt;

&lt;p&gt;Как только мы убедились, что используем тот же AppID, что и все элементы панели задач, мы можем создать экземпляр списка переходов для кнопки, над которой работаем, как показано в следующем примере кода. Этот пример является частью CTOR основного окна приложения:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #008000"&gt;// Устанавливаем ID для приложения&lt;/span&gt;&lt;br /&gt;Taskbar.AppId = appId;&lt;br /&gt;&lt;span style="color: #008000"&gt;// Получаем список переходов&lt;/span&gt;&lt;br /&gt;jumpList = Taskbar.JumpList;&lt;br /&gt;category1 = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; CustomCategory(&lt;span style="color: #006080"&gt;&amp;quot;Custom Category 1&amp;quot;&lt;/span&gt;);&lt;br /&gt;category2 = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; CustomCategory(&lt;span style="color: #006080"&gt;&amp;quot;Custom Category 2&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008000"&gt;// Добавляем собственные категории&lt;/span&gt;&lt;br /&gt;jumpList.CustomCategories.Add(category1);&lt;br /&gt;jumpList.CustomCategories.Add(category2);&lt;br /&gt;&lt;span style="color: #008000"&gt;// Значения по умолчанию для списков переходов&lt;/span&gt;&lt;br /&gt;comboBoxKnownCategoryType.SelectedItem = &lt;span style="color: #006080"&gt;&amp;quot;Recent&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Здесь мы указали AppID, используя свойство AppId, и создали экземпляр списка переходов, используя статическое свойство Taskbar.JumpList. Мы также создали две категории под названием Custom Category 1 и Custom Category 2. Потом мы добавили эти категории в контейнер пользовательских категорий списков. И в конце мы установили категорию Known в Recent. Это автоматически заполнит список, как описывалось выше.&lt;/p&gt;

&lt;p&gt;После того, как мы настроили пользовательскую категорию, самое время наполнить её определённым содержимым. Чтобы сделать это, нам просто необходимо вызвать функцию Add, чтобы добавить JumpListItem в JumpListCollection. JumpListItemCollection является общей коллекцией (принадлежащей &amp;lt;IJumpListItem&amp;gt;), содержащей элементы IJumpListItem. По своей сути, элемент IJumpListItem является своего рода обёрткой для встроенного IShellItem.&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #008000"&gt;// Указываем путь к объекту оболочки&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; path = String.Format(&lt;span style="color: #006080"&gt;&amp;quot;{0}\\test{1}.txt&amp;quot;&lt;/span&gt;,&lt;br /&gt;                            executableFolder,&lt;br /&gt;                            category1.JumpListItems.Count);&lt;br /&gt;&lt;span style="color: #008000"&gt;// Добавляем объект в категорию&lt;/span&gt;&lt;br /&gt;category1.JumpListItems.Add(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; JumpListItem(path));&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Сначала нам надо указать путь к файлу, который мы хотим включить в список перехода. Пожалуйста, не забывайте, что мы можем вызвать функцию Add только, если файл размещен на локальном диске и доступен пользователю. Вышеуказанный код (наряду с несколькими другими методами, о которых мы расскажем в будущих статьях) станут результатом диалогового окна панели задач, которое будет выглядеть следующим образом:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_6D9149DF.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="clip_image004" border="0" alt="clip_image004" src="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/DevelopingfortheWindows7TaskbarJumpintoJ_F764/clip_image004_794cc9aa-79e5-4a45-9949-ec530e2d7dc5.gif" width="375" height="438" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;И, наконец, нам надо вызвать функцию Taskbar.JumpList.RefreshTaskbarList(). Так как у нас мы использовали встроенную реализацию списка переходов, мы должны подтвердить изменения, внесённые в список. Более пристальный взгляд на функцию Refresh (доступ к ней у вас есть в Code Pack API) открывает нам функцию AppendCustomCategories, которая добавляет любую пользовательскую категорию в пользовательский список переходов. В этой функции вы можете найти управляемые реализации кода, приведённого выше. Также она включает в себя вызов функции AppendCategory, которая является обёрткой для функции AppendCategory, показанной выше.&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;IObjectCollection categoryContent =&lt;br /&gt;    (IObjectCollection)&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; CEnumerableObjectCollection();&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;// Добавляем представление каждой ссылки к массиву объектов&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (IJumpListItem link &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; category.JumpListItems)&lt;br /&gt;    categoryContent.AddObject(link.GetShellRepresentation());&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;// Добавляем текущую категорию к списку назначений&lt;/span&gt;&lt;br /&gt;HRESULT hr = customDestinationList.AppendCategory(&lt;br /&gt;    category.Name,&lt;br /&gt;    (IObjectArray)categoryContent);&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Как видите, разобраться в возможностях панели задач в Windows 7 не так уж сложно. Windows автоматически сделает основную часть работы, а если вам необходимо создать собственную категорию, то сделать это очень просто.&lt;/p&gt;

&lt;p&gt;В следующей статье мы расскажем, как добавить задание в список переходов и зарегистрировать обработчик файлов.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://windowsteamblog.com/blogs/developers/archive/tags/Sample+Code/default.aspx"&gt;&lt;b&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9852096" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/windev/archive/tags/API/default.aspx">API</category><category domain="http://blogs.msdn.com/windev/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/windev/archive/tags/_1F0430043D0435043B044C04_+_37043004340430044704_/default.aspx">Панель задач</category></item><item><title>Разработка для панели задач Windows 7 – переходим к спискам переходов – часть 1</title><link>http://blogs.msdn.com/windev/archive/2009/07/11/developing-for-the-windows-7-taskbar-jump-into-jump-lists-part-1.aspx</link><pubDate>Sat, 11 Jul 2009 11:31:26 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9829395</guid><dc:creator>Daniel Kornev [MSFT]</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/windev/comments/9829395.aspx</comments><wfw:commentRss>http://blogs.msdn.com/windev/commentrss.aspx?PostID=9829395</wfw:commentRss><description>&lt;p&gt;Приглашаем присоединиться к еще одной теме, посвященной панели задач Windows 7! В предыдущей статье «&lt;a href="http://blogs.msdn.com/windev/archive/2009/06/25/developing-for-the-windows-7-taskbar-application-id.aspx"&gt;&lt;b&gt;Разработка для панели задач Windows 7 – AppID&lt;/b&gt;&lt;/a&gt;» мы рассказали об очень важном элементе внутренней архитектуры панели задач – Application ID (AppID), который является ключевым компонентом, определяющим, как разные приложения группируются под одной кнопкой панели задач. AppID также имеет прямое влияние на то, как заполняется и группируется содержимое списков переходов (jumplists).&lt;/p&gt;  &lt;p&gt;Microsoft разрабатывала панель задач Windows 7, чтобы обеспечить пользователям простой и быстрый доступ к тем функциям и документам, которые используются чаще всего. Сюда относятся изображения, музыка, документы или ссылки/ярлыки к приложениям или папкам, или любой иной тип контента Windows. Под «быстрым и простым» имеется в виду возможность получать доступ к часто используемым программам с помощью единственного щелчка мышью или, в худшем случае, с помощью значительно сократившегося количества щелчков. «Быстрый и легкий доступ» также обозначает, что пользователи должны иметь возможность быстро перейти к тем документам/приложениям, с которыми они хотят работать, начав процесс одним щелчком мышью. Чтобы обеспечить такую функциональность, в панели задач Windows 7 была представлена концепция списков переходов. Дополнительную информацию о предпосылках создания выпадающих списков панели задач можно найти в статье Чайтаньи Сарин &lt;a href="http://blogs.msdn.com/e7ru/archive/2008/11/28/the-windows-7-taskbar-windows-7.aspx"&gt;&lt;b&gt;Панель задач в Windows 7&lt;/b&gt;&lt;/a&gt; и видео на Channel 9 &lt;a href="http://channel9.msdn.com/posts/yochay/Windows-7-New-Taskbar-an-overview/"&gt;&lt;b&gt;Обзор новой панели задач Windows 7&lt;/b&gt;&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Так как мне нравится говорить о причинах создания новой панели задач (поскольку я люблю пользовательскую функциональность и простоту использования в общем), то я сфокусируюсь на API панели задач. Как разработчик вы должны думать о списках переходов, как о собственной мини-версии меню Start для приложения. Списки переходов открывают доступ к часто используемым назначениям (являющимся именами существительными) и действиям (обозначаемым глаголами) программы. Это позволяет реализовать простой пользовательский доступ к назначениям, избавляя от необходимости заблаговременно запускать приложение. Следующее изображение показывает, как списки переходов работают в Office Word 2007. Вы можете заметить, что в категории Recent есть список недавних документов, которые я использовал в Office Word. Щелчок по одному из них запустит Office Word с уже выбранным документом.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_04084771.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/DevelopingfortheWindows7TaskbarJumpintoJ_B012/clip_image002_c23a55dc-afa2-4605-a459-380943fe34b0.gif" width="272" height="369" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Раньше мы упоминали Word 2007, как пример приложения, которое отлично взаимодействует с панелью задач Windows 7, даже при том, что оно было выпущено задолго до появления панели задач Windows 7. Все кнопки панели задач группируются под одной иконкой, а список переходов автоматически заполняется недавно использовавшимися документами Word. В следующей статье я подробно расскажу, как заполняются списки переходов. Сейчас давайте сконцентрируемся на понимании сути списков переходов.&lt;/p&gt;  &lt;p&gt;Стандартные задания «из коробки» предоставляют возможность запуска новых экземпляров приложения, прикрепление или открепление приложения в панели задач и его закрытие. Вы можете получить доступ к спискам переходов, щелкнув правой кнопкой на иконке приложения в панели задач. Однако, как показывает следующее изображение, вы сможете лучше контролировать панель задач путем настройки контекста выпадающих списков для вашего приложения.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_26E90921.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/DevelopingfortheWindows7TaskbarJumpintoJ_B012/clip_image004_a5f76b47-8025-48e3-abe4-2161f7a20666.gif" width="546" height="289" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Определения из Windows 7 SDK:&lt;/p&gt;  &lt;p&gt;Под «&lt;b&gt;назначениями&lt;/b&gt;» следует понимать элементы, появляющиеся в категориях «Недавние», «Часто используемые» или в индивидуальных категориях (на изображении выше это категория Important). Назначениями могут быть файлы, папки, сайты или любые другие элементы, но не обязательно связанные с файлами. Назначения могут быть прикреплены или удалены пользователем из выпадающего списка. Обычно они представлены элементами IShellItem, но также могут быть и объектами IShellLink.&lt;/p&gt;  &lt;p&gt;Под «&lt;b&gt;заданиями&lt;/b&gt;» следует понимать часто исполняемые в приложении действия, которые доступны всем его пользователям независимо от индивидуальных шаблонов. Задания не могут быть прикреплены или удалены. Задания представлены объектами IShellLink, так как фактически являются ссылками, с необязательными параметрами на команду «Actions».&lt;/p&gt;  &lt;p&gt;Как разработчики мы можем:&lt;/p&gt;  &lt;p&gt;&lt;b&gt;1. Контролировать назначения у приложений&lt;/b&gt; (контроль тех элементов, к которым мы хотим обеспечить доступ через список переходов)&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Назначением может быть одна из любых известных категорий, например, Recent или Frequent.&lt;/li&gt;    &lt;li&gt;Категория Custom точно такая же, как и любая другая категория назначений, но при этом позволяет разработчику самому присваивать ей имя, а также наполнять содержимым.&lt;/li&gt;    &lt;li&gt;Категория Pinned рассчитана на прикрепленные элементы, к которым пользователи хотят иметь постоянный доступ в своих выпадающих списках. Пожалуйста, обратите внимание на следующее: только пользователи могут прикреплять элементы выпадающего списка, и нет никакого поддерживаемого программного способа для разработчика закрепить элемент в списке.&lt;/li&gt;    &lt;li&gt;Вы можете полностью удалить категорию прикрепленных элементов из выпадающего списка, но дважды подумайте о том, хотите ли вы запретить пользователям закреплять элементы в вашем приложении.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;2. Определять задания&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Панель задача предусматривает собственные готовые задачи, такие как запуск/закрытие приложений и прикрепление/открепление их от панели задач. Как разработчики мы не можем контролировать задачи самой панели, но можем изменять пользовательские задачи.&lt;/li&gt;    &lt;li&gt;Пользовательские задачи – общедоступные задачи, которые разработчик хочет сделать доступными в списке переходов и которые позволят совершать определенные действия прямо из списка переходов. Например, воспроизвести всю музыку из библиотеки, не запуская сам плеер, или запустить другое приложение, например, Internet Explorer, при щелчке на задаче «перейти на домашнюю страницу» в списке Windows Live Messenger, как это показано на следующей картинке. Еще раз: вся вышеуказанная функциональность списков переходов экономит время и сокращает количество щелчков, необходимых для выполнения задачи.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/DevelopingfortheWindows7TaskbarJumpintoJ_B012/clip_image006_2.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/DevelopingfortheWindows7TaskbarJumpintoJ_B012/clip_image006_thumb.gif" width="237" height="368" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;В следующей статье мы углубимся в API списков переходов на панели задач. Но сначала нам необходимо обратится к программной модели панели задач. Панель задач имеет свой набор API, как и любой другой компонент оболочки Windows, доступных через набор COM-интерфейсов. Однако, есть несколько действий, которые мы, разработчики, можем сделать до того, как начать использовать COM API панели задач.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9829395" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/windev/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/windev/archive/tags/_1F0430043D0435043B044C04_+_37043004340430044704_/default.aspx">Панель задач</category></item><item><title>Разработка для панели задач Windows 7 – Application ID (часть 2)</title><link>http://blogs.msdn.com/windev/archive/2009/07/06/developing-for-the-windows-7-taskbar-application-id-part-2.aspx</link><pubDate>Mon, 06 Jul 2009 15:53:48 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9819689</guid><dc:creator>Daniel Kornev [MSFT]</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/windev/comments/9819689.aspx</comments><wfw:commentRss>http://blogs.msdn.com/windev/commentrss.aspx?PostID=9819689</wfw:commentRss><description>&lt;p&gt;В ответ на некоторые комментарии к оригинальной статье я включил в это сообщение ссылку для загрузки кода и новые снимки экрана, чтобы показать эффект изменения AppID. На снимках можно видеть, что одно и то же приложение (с тем же AppID) может иметь две различные кнопки на панели задач. Вы также можете загрузить &lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers.CodeSamples/Taskbar-Application-ID.zip"&gt;&lt;b&gt;код для этого приложения&lt;/b&gt;&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/Taskbar_5F00_buttons_5F00_Multiplebuttone1_5F00_411DB221.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/DevelopingfortheWindows7TaskbarApplicati_ED98/clip_image002_6e2a1907-11d5-4eb1-9766-86d813063d0b.gif" width="562" height="344" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/Taskbar_5F00_buttons_5F00_Multiplebuttone2_5F00_2891FEA1.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/DevelopingfortheWindows7TaskbarApplicati_ED98/clip_image004_d1130421-9167-4c6a-8de9-b2bce2f1f569.gif" width="561" height="386" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Да, вы можете разместить разные кнопки между двумя окнами с различным AppID! Загрузить код для этого приложения можно &lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers.CodeSamples/Taskbar-Application-ID.zip"&gt;&lt;b&gt;отсюда&lt;/b&gt;&lt;/a&gt;. А управляемый код объекта Taskbar является частью проекта &lt;a href="http://code.msdn.microsoft.com/WindowsAPICodePack"&gt;&lt;b&gt;Windows API Code Pack&lt;/b&gt;&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9819689" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/windev/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/windev/archive/tags/_1F0430043D0435043B044C04_+_37043004340430044704_/default.aspx">Панель задач</category></item><item><title>Разработка для панели задач Windows 7 – Application ID</title><link>http://blogs.msdn.com/windev/archive/2009/06/25/developing-for-the-windows-7-taskbar-application-id.aspx</link><pubDate>Thu, 25 Jun 2009 22:12:44 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9804100</guid><dc:creator>Daniel Kornev [MSFT]</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/windev/comments/9804100.aspx</comments><wfw:commentRss>http://blogs.msdn.com/windev/commentrss.aspx?PostID=9804100</wfw:commentRss><description>&lt;p&gt;Это первая статья в новом цикле, посвященных панели задач Windows 7. Разработчикам стоит уделять панели задач первоочередное внимание. Мы должны понять новые возможности панели, чтобы создавать приложения, эффективно работающие с ней, чтобы расширить возможности пользователей и сделать их работу с ОС максимально удобной.&lt;/p&gt; &lt;p&gt;Я полагаю, что вы успели ознакомиться с базовой функциональностью и нововведениями панели задач Windows 7. Если же вы не знакомы, рекомендую вам посмотреть &lt;a href="http://channel9.msdn.com/posts/yochay/Windows-7-New-Taskbar-an-overview/"&gt;&lt;b&gt;видео-обзор функциональных возможностей панели задач Windows 7&lt;/b&gt;&lt;/a&gt; на Channel 9 и прочитать &lt;a href="http://blogs.msdn.com/e7ru/archive/2008/11/20/happy-anniversary-windows-on-the-evolution-of-the-taskbar.aspx"&gt;&lt;b&gt;статьи в блоге E7&lt;/b&gt;&lt;/a&gt;. Это позволит вам лучше понять, о чем идет речь в сегодняшней в статье.  &lt;p&gt;При первом запуске системы новая панель задач, пожалуй, является наиболее заметным нововведением в Windows 7. В Windows 7 панель задач представляет собой механизм для запуска приложений и переключения окон, консолидирующим возможности панелей задач из предыдущих версий Windows и, в частности, панель быстрого запуска, недавние документы, уведомления и окна запущенных приложений. В дополнение к старым возможностям панель задач Windows 7 обладает новыми: списками быстрого перехода, интерактивными миниатюрами открытых окон и т.п. Но для начала давайте заложим основу для нашей беседы и определимся с терминологией.  &lt;p&gt;Основным элементом панели задач является кнопка панели задач. Кнопка представлена иконкой на панели задач. Как видите, на панели задач размещается масса кнопок, статус которых можно понять, лишь взглянув на них:  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/DevelopingfortheWindows7TaskbarApplicati_1465F/clip_image002_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/DevelopingfortheWindows7TaskbarApplicati_1465F/clip_image002_thumb.jpg" width="568" height="141"&gt;&lt;/a&gt;  &lt;p&gt;Возьмем, к примеру, кнопку Windows Media Player: она не обрамлена и ничем не выделяется. Это свидетельствует о том, что Windows Media Player не запущен. Однако, приложение закреплено на панели задач и будет оставаться там, если мы не уберем его. Вокруг иконки Windows Explorer можно видеть тусклую рамку: это свидетельствует о том, что приложение работает, но не активно. У Visual Studio иконка в более непрозрачной прямоугольной рамке, указывающей на то, что в данный момент пользователь работает с этим приложением. Обратите внимание, что в Word открыто много документов и они сгруппированы в одну иконку приложения. Очень важно понимать логику создания и группировки окон приложений на панели задач.  &lt;p&gt;Существенное количество приложений, работающих в Windows 7 (например, Office Word 2007 и Visual Studio 2008), не были предназначены для работы с новой панелью задач Windows 7. Так каким же образом все они взаимодействуют с панелью задач и поддерживают списки переходов в Word? В основе лежит специальный Application ID, который автоматически присваивается запускаемым приложениям после их запуска. Каждое запускаемое приложение имеет свой AppID, присваиваемый либо самой Windows, либо приложением. Это не GUID, а простой строковый параметр, состоящий максимум из 128 символов. Все приложения и окна, имеющие одинаковый параметр AppID, включая списки переходов, группируются в одну кнопку на панели задач. Важно понимать, что каждый компонент (процесс, ярлык, окно, кнопка или документ) имеет ассоциированное с ним значение AppID.  &lt;p&gt;Вы спросите, откуда берется этот AppID? Как уже упоминалось ранее, ОС генерирует код для приложения, используя простую и важную для понимания эвристику. Так как в Windwos 7 можно присваивать AppID отдельным окнам, ОС пытается экстраполировать AppID приложения из его окна. Приложения, как правило, имеют хотя бы одно окно, у которого система и запрашивает AppID. Однако, большинство приложений не имеют AppID, ассоциированных с каждым окном (или вообще не имеют AppID), поэтому система вынуждена обращаться к процессу, в котором выполняется окно. У каждого процесса есть несколько свойств, которые может опрашивать ОС, к примеру, исполняемый файл процесса. Но даже в этом случае, процесс не гарантирует четкого разделения. Различные ярлыки могут использовать разные параметры для запуска одного и того же исполняемого файла и запускать совершенно разные приложения (вспомните хотя бы приложения типа «launcher»), которые сгруппированы под одной кнопкой на панели задач. В таких случаях ОС может исследовать ярлык, отыскать исполняемый файл, параметры запуска и т.д. Обратите внимание, в случае зарегистрированного типа файла регистрация указывает на приложение, которое запускается двойным щелчком на файле. Это еще один способ получения AppID. Нижеприведенное изображение иллюстрирует процедуру автоматического получения AppID:  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/DevelopingfortheWindows7TaskbarApplicati_1465F/clip_image004_2.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/DevelopingfortheWindows7TaskbarApplicati_1465F/clip_image004_thumb.gif" width="557" height="341"&gt;&lt;/a&gt;  &lt;p&gt;Если вам интересны внутренние составляющие панели задач Windows 7, рекомендую вам посмотреть несколько видео: видео Роба Джэретта (Rob Jarrett) и Бена Бетса (Ben Bets) – &lt;a href="http://channel9.msdn.com/posts/yochay/Windows-7-Taskbar-Behind-the-Scenes/"&gt;&lt;b&gt;За кулисами панели задач windows 7&lt;/b&gt;&lt;/a&gt; и &lt;a href="http://channel9.msdn.com/posts/yochay/Jump-into-the-Windows-7-Taskbar-Jump-Lists/"&gt;&lt;b&gt;Обзор списков переходов&lt;/b&gt;&lt;/a&gt;.  &lt;p&gt;Несмотря на то, что ОС может автоматически присвоить AppID, многие разработчики хотят иметь больший контроль над AppID для своего приложения или отдельного окна. Предположим, что у вас есть приложения, запускающие другие приложения (таким образом работает отладка с помощью Visual Studio). Или у вас есть несколько различных приложений и процессов, которые вы хотите сгруппировать под одной кнопкой панели задач. В любом случае, если вы пишете новое приложение для Windows 7, мы настоятельно рекомендуем задать свой собственный идентификатор приложения, согласно приведенной инструкции.  &lt;p&gt;Теперь давайте перейдем к непосредственным тестам API, который позволяет контролировать ассоциации AppID для приложений.  &lt;p&gt;Если необходимо задействовать отдельную кнопку для каждого процесса (включая все окна, принадлежащие этому процессу), вы можете присвоить AppID всему процессу, в котором исполняются все окна приложения без отдельных AppID. Присвоить отдельный AppID очень просто: осуществляется это с помощью функции &lt;a href="http://msdn.microsoft.com/library/dd378422.aspx"&gt;&lt;b&gt;SetCurrentProcessExplicitAppUserModelID&lt;/b&gt;&lt;/a&gt;:  &lt;p&gt;&amp;nbsp; &lt;div id="codeSnippetWrapper"&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;SetCurrentProcessExplicitAppUserModelID(c_rgszAppID[0]);&lt;/pre&gt;&lt;/em&gt;&lt;br&gt;&lt;/div&gt;
&lt;p&gt;где c_rgszAppID[0] – указатель на строку. Необходимо отметить, что в соответствии с документацией SDK этот метод должен быть применен в ходе загрузки приложения перед появлением его интерфейса или манипуляций со списками переходов. 
&lt;p&gt;В управляемом коде из последней версии &lt;a href="http://code.msdn.microsoft.com/WindowsAPICodePack"&gt;&lt;b&gt;API-библиотек&lt;/b&gt;&lt;/a&gt; вы можете использовать свойство AppID как часть объекта Taskbar, который можно найти в пространстве имен Microsoft.WindowsAPICodePack.Shell.Taskbar. Используя это свойство, можно присваивать AppID. 
&lt;p&gt;Присвоить AppID отдельному окну чуть сложнее. Выполняется это вызовом функции &lt;a href="http://msdn.microsoft.com/library/dd378430.aspx"&gt;&lt;b&gt;SHGetPropertyStoreForWindow&lt;/b&gt;&lt;/a&gt; и дальнейшей манипуляцией с объектом &lt;a href="http://msdn.microsoft.com/library/bb761474.aspx"&gt;&lt;b&gt;IPropertyStore&lt;/b&gt;&lt;/a&gt; для получения необходимого свойства: 
&lt;p&gt;&amp;nbsp; &lt;div id="codeSnippetWrapper"&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt; SetAppID(HWND hWnd, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; iAppID)&lt;br&gt;{&lt;br&gt;    IPropertyStore *pps;&lt;br&gt;    HRESULT hr = SHGetPropertyStoreForWindow(hWnd, IID_PPV_ARGS(&amp;amp;pps));&lt;br&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hr))&lt;br&gt;    {&lt;br&gt;        PROPVARIANT pv;&lt;br&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (iAppID &amp;gt;= 0)&lt;br&gt;        {&lt;br&gt;            hr = InitPropVariantFromString(c_rgszAppID[iAppID], &amp;amp;pv);&lt;br&gt;        }&lt;br&gt;        &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;br&gt;        {&lt;br&gt;            PropVariantInit(&amp;amp;pv);&lt;br&gt;        }&lt;br&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (SUCCEEDED(hr))&lt;br&gt;        {&lt;br&gt;            hr = pps-&amp;gt;SetValue(PKEY_AppUserModel_ID, pv);&lt;br&gt;            PropVariantClear(&amp;amp;pv);&lt;br&gt;        }&lt;br&gt;        pps-&amp;gt;Release();&lt;br&gt;    }&lt;br&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;В приведенном фрагменте можно видеть, как извлекаются свойство окна вызовом SHGetPropertyStoreForWindow, передачей hWnd в качестве ссылки на окно. Затем инициируем с помощью InitPropVariantFromString(c_rgszAppID[iAppID], &amp;amp;pv) вариант свойства строкой, представляющей AppID для конкретного окна. И, наконец, устанавливаем значение нового свойства для окна. 
&lt;p&gt;К сожалению, нынешний Windows API Code Pack не поддерживает установку AppID для отдельных окон, хотя все, что вам нужно сделать, – это добавить следующую функцию в файл Taskbar.cs: 
&lt;p&gt;&amp;nbsp; &lt;div&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; SetWindowAppId(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; appId)&lt;br&gt;{&lt;br&gt;    Microsoft.WindowsAPICodePack.Shell.ShellNativeMethods.SetWindowAppId&lt;br&gt;        (OwnerHandle, &lt;span style="color: #006080"&gt;"name here"&lt;/span&gt;);&lt;br&gt;}&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Поскольку в Windows API Code Pack присутствует исходный код, вы можете посмотреть на реализацию функции SetWindowAppId и увидеть собственными глазами, что она очень похожа на пример SetAppID, приведенный выше. Обратите внимание, что вовсе не обязательно использовать полное имя сборки «Microsoft.WindowsAPICodePack.Shell» – я использовал его, чтобы объяснить иерархию Windows API Code Pack. 
&lt;p&gt;Кстати, идентификатор окна AppID динамичен, так что вполне возможно чтобы окно отображалось как одна кнопка панели задач, а затем изменив его AppID, заставить появиться на совершенно другой кнопке. Это имеет интересный эффект. Допустим, список перехода прикреплен к кнопке на панели задач (с конкретным AppID), поэтому одно и то же окно может отображать разные списки перехода при прикреплении к другим кнопкам панели задач. Это может ввести пользователей в заблуждение, поэтому мы рекомендуем установить окну определенный AppID и придерживаться его, используя тот же процесс для определения AppID при каждом отображении окна. 
&lt;p&gt;Вы можете найти управляемый код объекта Taskbar в проекте &lt;a href="http://code.msdn.microsoft.com/WindowsAPICodePack"&gt;&lt;b&gt;Windows API Code Pack&lt;/b&gt;&lt;/a&gt;. 
&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9804100" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/windev/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/windev/archive/tags/_1F0430043D0435043B044C04_+_37043004340430044704_/default.aspx">Панель задач</category></item><item><title>Windows 7 RC Training Kit для разработчиков ПО</title><link>http://blogs.msdn.com/windev/archive/2009/06/15/windows-7-rc-training-kit-for-developers.aspx</link><pubDate>Mon, 15 Jun 2009 11:57:36 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9752461</guid><dc:creator>Daniel Kornev [MSFT]</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/windev/comments/9752461.aspx</comments><wfw:commentRss>http://blogs.msdn.com/windev/commentrss.aspx?PostID=9752461</wfw:commentRss><description>&lt;p&gt;На прошлой неделе мы выпустили инструментарий для разработчиков – &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=12100526-ed26-476b-8e20-69662b8546c1&amp;amp;displaylang=en"&gt;&lt;b&gt;Windows 7 RC Training Kit&lt;/b&gt;&lt;/a&gt; – в рамках постоянных усилий, направленных на предоставление всем разработчикам ПО под Windows необходимых средств для создания приложений, превосходно работающих в Windows 7. Эта версия включает в себя 10 презентаций и 8 лабораторных работ, в которых объясняется работа большинства наиболее интересных функций Windows 7 и затрагиваются вопросы совместимости приложений. Хочу заметить, что указанные лабораторные работы дают вам возможность первыми приобрести опыт в ключевых аспектах программирования под Windows 7 с использованием её новых особенностей, таких, как новая панель задач, библиотеки, поддержка технологии Multi-Touch, сенсоров и позиционирования, ленточный интерфейс меню в приложениях, запуск служб по наступлении события, измерение и контроль за состоянием системы (ETW). Там же рассказывается о совместимости приложений.&lt;/p&gt; &lt;p&gt;Это предварительная версия инструментария Windows 7 для разработчиков ПО, окончательная версия которого выйдет вскоре после выпуска Windows 7. Вы можете &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=12100526-ed26-476b-8e20-69662b8546c1&amp;amp;displaylang=en"&gt;&lt;b&gt;загрузить&lt;/b&gt;&lt;/a&gt; текущую версию и использовать её, но помните, что она будет работать только на предварительной (RC) версии Windows 7, и не забудьте установить Visual Studio 2008 SP1 и Windows 7 RC SDK, поскольку некоторым приложениям для стабильной работы требуются программные библиотеки из этих пакетов. &lt;p&gt;&lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/image_5F00_62F158D2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/Windows7RCTrainingKitforDevelopers_B62D/clip_image002_99e177de-5e58-4713-94ac-6154a26cea24.gif" width="244" height="213"&gt;&lt;/a&gt; &lt;p&gt;&lt;b&gt;Панель задач&lt;/b&gt; &lt;p&gt;Панель задач Windows 7 предоставляет программам возможность повернуться к пользователю совершенно новой гранью. Новая панель задач определяет множество вариантов действий – запуск приложений и переключения между ними (в том числе переключение между окнами или вкладками внутри приложений), управление местами хранения данных, облегчение доступа к наиболее часто используемым функциям того или иного приложения и общего контекстного меню приложений, сообщения о выполнении процессов и статусе приложения посредством его иконки, контроль за программой и её действиями через ярлык, находящийся тут же, в панели задач. Панель задач – главный инструмент взаимодействия пользователя с операционной системой. В этом смысле реализация новых возможностей панели задач Windows 7 в приложениях становится критически важным аспектом программирования. В этом модуле рассматриваются отличия от прежних версий и API, необходимые для программирования с учётом особенностей панели задач Windows 7. &lt;p&gt;&lt;b&gt;Библиотеки&lt;/b&gt; &lt;p&gt;Библиотеки служат новой точкой опоры пользователю, размещающему свои данные в системе. Библиотеки – продукт эволюционировавшей концепции папок «Мои документы», встроенной в интерфейс Windows Explorer. Библиотеки – центральный пункт хранения пользовательской информации, который доступен приложениям для использования и управления их содержимым. Поскольку библиотеки не являются физическими местами хранения файлов, некоторые программы потребуется обновить для того, чтобы они могли работать с библиотеками, как с папками. В этом модуле объясняется базовые принципы концепции библиотек в Windows 7, включая то, как настроить программы на использование библиотек, как интерпретировать их в качестве папок файловой системы, как использовать и как управлять библиотеками. &lt;p&gt;&lt;b&gt;Технология &lt;/b&gt;&lt;b&gt;multi-touch&lt;/b&gt; &lt;p&gt;Windows 7 предоставляет новые возможности для тактильного ввода и управления интерфейсом с помощью жестов. Благодаря этому создатели программ смогут интегрировать тактильную поддержку в свои приложения, что поднимет качество взаимодействия пользователя с ОС на новую высоту по сравнению с возможностями традиционных мыши и клавиатуры: выбор объектов, перемещение по экрану станут намного интуитивнее и проще. Новые API поддерживают комплексные жесты, применяемые для панорамирования, масштабирования и вращения экранных объектов. Платформа Windows 7 Multi-Touch обеспечивает прямой ввод данных с тактильно-чувствительных устройств, их дальнейшую обработку и построение взаимосвязей между ними. В этом модуле рассказывается о базовых элементах платформы Windows 7 Multi-Touch и её программных интерфейсах. &lt;p&gt;&lt;b&gt;Платформа Sensor and Location&lt;/b&gt; &lt;p&gt;Windows 7 предоставляет новые возможности использования сенсоров в программировании. Эта платформа содержит встроенную поддержку сенсоров, расширенную специальными возможностями для работы с датчиками, включая сенсоры перемещения и устройства глобального позиционирования. Новые программные интерфейсы Windows Location позволяют создателям ПО получать доступ к информации о географическом положении пользователей. В этом модуле разъясняется, что такое платформа для сенсоров и позиционирования, и как с ней работать. &lt;p&gt;&lt;b&gt;Ленточный интерфейс&lt;/b&gt; &lt;p&gt;В Windows 7 во всех системных приложениях применяется так называемое ленточное меню, впервые представленное в Office 2007. Таким образом, создаётся новая платформа для создания унифицированного пользовательского интерфейса. Это значит, что неудобств, имевшихся в прежнем стандартном пользовательском интерфейсе Win32, больше не существует. Новая платформа предлагает богатые возможности графики, анимации, интерфейс хорошо воспринимается пользователем, элементы управления легко распознаются и запоминаются, – и всё это делается с помощью компактной и высокопроизводительного встроенной рабочей среды. Ленточное меню позволяет повысить удобство пользования программами, просто добавляя кнопки вызова наиболее важных и необходимых элементов на ленту. Ленточное меню помогает пользователю быстрее находить и эффективнее работать с важными функциями программ, поскольку делает их более заметными, что, в свою очередь, влечёт за собой рост производительности. В этом модуле содержится инструкция, как правильно интегрировать ленточное меню Windows 7 в существующие приложения и рассматриваются некоторые важные аспекты его работы. &lt;p&gt;&lt;b&gt;Фоновые процессы, службы и задачи&lt;/b&gt; &lt;p&gt;Фоновые процессы и службы оказывают огромное влияние на производительность системы в целом, и, следовательно, на работу программ. Если удастся снизить количество запускаемых служб, можно уменьшить потребность в мощности и улучшить стабильность работы. Возможности нового диспетчера служб Windows 7 были расширены таким образом, чтобы сделать возможным запуск и остановку служб по наступлении определённого события. Триггерная система устраняет необходимость непременного автоматического запуска служб при загрузке компьютера, позволяя генерировать запросы в ожидании нужного события. В этом модуле объясняется, как с помощью различных настроек конфигурировать и запускать службы посредством триггеров. &lt;p&gt;&lt;b&gt;Производительность и средства контроля Windows 7&lt;/b&gt; &lt;p&gt;Windows 7 содержит новый инструмент регистрации событий (Event Tracing for Windows, ETW), который позволяет создателям ПО оптимизировать производительность приложения ещё на этапе разработки. Средства контроля всегда были частью Windows, но Windows 7 содержит заново созданную технологию ETW, делающую интеграцию контроля в программу намного более простой задачей. В модуле объясняется, как использовать средства контроля Windows 7 и, в частности, новый ETW. &lt;p&gt;&lt;b&gt;Совместимость приложений для Windows 7&lt;/b&gt; &lt;p&gt;Windows 7 разработана на основе Windows Vista и это означает, что если программа не работает под Windows Vista или работает с ошибками, скорее всего, при установке её на Windows 7 она будет вести себя так же или очень похожим образом. В модуле представлен краткий обзор ситуаций с совместимостью программ под Windows 7, включая перенаправление данных, изоляцию служб, проверку версии и высокое разрешение (High DPI). &lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9752461" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/windev/archive/tags/Sensor+and+Location/default.aspx">Sensor and Location</category><category domain="http://blogs.msdn.com/windev/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/windev/archive/tags/_1F0430043D0435043B044C04_+_37043004340430044704_/default.aspx">Панель задач</category><category domain="http://blogs.msdn.com/windev/archive/tags/Multi-Touch/default.aspx">Multi-Touch</category><category domain="http://blogs.msdn.com/windev/archive/tags/ETW/default.aspx">ETW</category></item></channel></rss>