<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Блог Windows 7 для разработчиков</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/windev/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/windev/feed.xml</link>
    <description>The Windows 7 Blog for Developers - Русская редакция</description>
    <lastBuildDate>Wed, 17 Apr 2019 03:40:20 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Федеративный поиск в Windows 7</title>
      <link>https://docs.microsoft.com/archive/blogs/windev/windows-7</link>
      <pubDate>Wed, 05 May 2010 01:07:34 GMT</pubDate>
      <dc:creator><![CDATA[Anton Belousov - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/windev/2010/05/05/windows-7/</guid>
      <description><![CDATA[Федеративный поиск позволяет пользователям искать информацию на удаленных источниках данных прямо из...]]></description>
      <content:encoded><![CDATA[<p>Федеративный поиск позволяет пользователям искать информацию на удаленных источниках данных прямо из окна Windows Explorer. Это означает, что прямо из Windows Explorer вы можете искать информацию на тех веб-сайтах, лентах и иных удаленных структурированных источниках, которые предоставляют такую возможность через простой интерфейс. Вы можете использовать окно поиска в Windows Explorer таким же образом, как и для поиска локального контента. Результаты поиска отображаются аналогичным образом, включая окрашивание и даже предварительный просмотр файла. Результаты ведут себя так же, как и иные элементы в Windows Explorer:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/windev/WindowsLiveWriter/Windows7_AA24/clip_image001_2.png" original-url="https://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/Windows7_AA24/clip_image001_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image001" border="0" alt="clip_image001" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/windev/WindowsLiveWriter/Windows7_AA24/clip_image001_thumb.png" original-url="https://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/Windows7_AA24/clip_image001_thumb.png" width="509" height="480" /></a></p>  <p>Преимущества интеграции внешнего источника данных в Windows Explorer состоит в том, что пользователи могут получить информацию через знакомый пользовательский интерфейс Windows Explorer. Пользователи смогут видеть файлы из удаленного источника данных так, будто они размещены локально, включая значки приложений и контекстные меню. У них есть возможность предварительно просмотреть документы или веб-страницы, видеть эскизы изображений, перетаскивать файлы непосредственно на рабочий стол или в электронную почту. Обратите внимание на приведенное изображение: файлы с www.flickr.com отображаются с указанием размера, названия, тэга, даты создания и так далее.</p>  <p>В этой статье, основанной на <a href="https://www.microsoft.com/downloads/details.aspx?familyid=c709a596-a9e9-49e7-bcd4-319664929317&amp;displaylang=en&amp;tm"><b>руководстве по разработке поставщиков федеративного поиска в Windows 7</b></a>, вы узнаете, что такое федеративный поиск и как он работает. Если вам действительно интересно, как использовать федеративный поиск или создать собственный поставщик, рекомендуем прочитать данное руководство.</p>  <h4>Как это работает?</h4>  <p>Windows 7 поддерживает подключение внешних источников данных к клиентской версии Windows через протокол OpenSearch. Стандарт OpenSearch v1.1 определяет простые форматы файла, которые могут быть использованы для описания запросов к веб-службе и формата, в котором веб-служба должна сформировать результаты, которые будут возвращены клиенту. По существу это означает, что вы можете указать Windows Explorer на внешний источник данных. Используя стандартный протокол OpenSearch, Windows Explorer направляет поисковый запрос, а удаленный источник данных возвращает грамотно сформированную структуру данных, которая может быть обработана и представлена пользователю.</p>  <p>Чтобы добавить нового поставщика OpenSearch, вы должны установить файл Search Connector Description (файл с расширением .osdx). Внутренний формат файла для .osdx – это OpenSearch Description XML. Вот содержимое .osdx-файла для поиска по Flickr:</p>  <div style="overflow: auto">   <pre class="csharpcode"><span class="kwrd">&lt;?</span><span class="html">xml</span> <span class="attr">version</span>=«<span class="attr">1</span>.<span class="attr">0</span>» <span class="attr">encoding</span>=«<span class="attr">UTF-8</span>»?<span class="kwrd">&gt;</span>

<span class="kwrd">&lt;</span><span class="html">OpenSearchDescription</span> <span class="attr">xmlns</span>=«<span class="attr">http:</span>//<span class="attr">a9</span>.<span class="attr">com</span>/<span class="attr">-</span>/<span class="attr">spec</span>/<span class="attr">opensearch</span>/<span class="attr">1</span>.<span class="attr">1</span>/<span class="kwrd">&quot;

xmlns:ms-ose=«https://schemas.microsoft.com/opensearchext/2009/&quot;</span><span class="kwrd">&gt;</span>

<span class="kwrd">&lt;</span><span class="html">ShortName</span><span class="kwrd">&gt;</span>Flickr Search<span class="kwrd">&lt;/</span><span class="html">ShortName</span><span class="kwrd">&gt;</span>

<span class="kwrd">&lt;</span><span class="html">Description</span><span class="kwrd">&gt;</span>OpenSearch for Flickr via Windows 7 Search Federation.<span class="kwrd">&lt;/</span><span class="html">Description</span><span class="kwrd">&gt;</span>

<span class="kwrd">&lt;</span><span class="html">Url</span> <span class="attr">type</span>=«<span class="attr">text</span>/<span class="attr">html</span>»

<span class="attr">template</span>=«<span class="attr">http:</span>//<span class="attr">www</span>.<span class="attr">flickr</span>.<span class="attr">com</span>/<span class="attr">search</span>/?<span class="attr">w</span>=<span class="attr">all</span>&amp;<span class="attr">amp</span>;<span class="attr">amp</span>;<span class="attr">q</span>={<span class="attr">searchTerms</span>}&amp;<span class="attr">amp</span>;<span class="attr">amp</span>;<span class="attr">m</span>=<span class="attr">text</span>»<span class="kwrd">/&gt;</span>

<span class="kwrd">&lt;/</span><span class="html">OpenSearchDescription</span><span class="kwrd">&gt;</span></pre>
</div>
<style type="text/css">

.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; }</style>

<p>Обратите внимание, насколько прост файл. Он включает URL к поиску Flickr, который определяет условия поиска. За дополнительной информацией обращайтесь к спецификации <a href="https://www.opensearch.org/Specifications/OpenSearch/1.1"><b>стандарта OpenSearch v1.1</b></a>. Те из вас, у кого зоркий глаз и хорошая память, могли подумать, что вышеупомянутый XML очень похож на <a href="https://msdn.microsoft.com/library/cc848862.aspx#dev_OSDfile"><b>поставщик поиска в Internet Explorer 8 (IE8)</b></a> – небольшое окно поиска в верхнем правом углу IE8, позволяющее выбрать контекст, в котором выполняется поиск. Это довольно интересная тема, поэтому в будущем вы вправе ожидать статью о том, как преобразовать поставщик поиска в IE8 в поставщик федеративного поиска для Windows 7.</p>

<p>У конечных пользователей есть несколько вариантов установки нового удаленного источника данных с федеративным поиском Windows: они могут открыть .osdx-файл, нажимая на одну из ссылок на веб-сайте, открыть один из предоставленных кем-то в совместно используемый ресурс или через почтовое вложение. После этого в папке «Searches» в Windows (%userprofile %/Searches) создается файл .searchconnector-ms, при этом ярлык на него помещается в папку «Links» (%userprofile %/Links). Этот ярлык отображается в разделе избранного навигационной панели Windows Explorer.</p>

<p>Коммуникация между Windows Explorer и веб-службой OpenSearch осуществляется через уровень данных Windows, который может взаимодействовать с различными типами источников данных через так называемые поставщики хранилища Windows (в оригинале Windows Store Providers). Каждый поставщик специализируется на коммуникации с источниками данных, которые поддерживают определенный протокол и имеют специфические возможности. Поставщик OpenSearch взаимодействует с хранилищами данных, у которых есть веб-служба, поддерживающая стандарт OpenSearch.</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/windev/WindowsLiveWriter/Windows7_AA24/clip_image002_2.png" original-url="https://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/Windows7_AA24/clip_image002_2.png"><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="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/windev/WindowsLiveWriter/Windows7_AA24/clip_image002_thumb.png" original-url="https://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/Windows7_AA24/clip_image002_thumb.png" width="430" height="310" /></a></p>

<p>Приступаем к практике. Загрузите <a href="https://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers.CodeSamples/flickr.osdx"><b>поисковый коннектор для поиска на Flickr</b></a>. Вам будет предложено сохранить или открыть файл. Выберите второй вариант для регистрации поставщика поиска на своем компьютере. Затем вам будет предложено добавить поисковый коннектор. Подтвердите свое намерение, нажав на кнопку «Добавить», как показано на следующем изображении:</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/windev/WindowsLiveWriter/Windows7_AA24/clip_image003_2.png" original-url="https://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/Windows7_AA24/clip_image003_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image003" border="0" alt="clip_image003" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/windev/WindowsLiveWriter/Windows7_AA24/clip_image003_thumb.png" original-url="https://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/Windows7_AA24/clip_image003_thumb.png" width="376" height="257" /></a></p>

<p>Обратите внимание, что в навигационную панель Windows Explorer в раздел избранного добавлен новый ярлык под названием Flickr Search. Нажмите на этот ярлык и введите в окне поиска Windows Explorer запрос «Seattle». Подождите несколько секунд, поскольку результаты передаются с веб-сайта Flickr.</p>

<p>По мере ввода поискового запроса в поле для поиска вверху Windows Explorer запрос передается к поставщику OpenSearch (описанному в файле .searchconnector-ms), который затем пересылает запрос удаленному хранилищу данных (URL, в котором содержатся условия поиска в .osdx-файле). Удаленная веб-служба отвечает на запрос с результатами в XML-файле либо через RSS, либо через Atom. Провайдер OpenSearch преобразует элементы XML-файла в элементы, которые, в конечном счете, возвращаются в Windows Explorer, где они отображаются пользователю. Следующее изображение иллюстрирует поток данных:</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/windev/WindowsLiveWriter/Windows7_AA24/clip_image004_2.png" original-url="https://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/Windows7_AA24/clip_image004_2.png"><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="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/windev/WindowsLiveWriter/Windows7_AA24/clip_image004_thumb.png" original-url="https://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/Windows7_AA24/clip_image004_thumb.png" width="386" height="89" /></a></p>

<p>Для подключения хранилища данных веб-службы к Windows 7 требуется всего три шага:</p>

<ol>
  <li>Разрешить поиск в хранилище данных прямо из Windows, используя OpenSearch с выводом в виде Atom или RSS. </li>

  <li>Создать .osdx-файлы, описывающие процедуру подключения к веб-службе и то, как размечать любые выбранные элементы в RSS или Atom XML. </li>

  <li>Установить поисковые коннекторы на клиентских машинах с Windows с помощью .osdx-файлов. </li>
</ol>

<p>Протокол OpenSearch обеспечивает массу способов для настройки вывода результатов поиска в Windows Explorer. Например, вы можете:</p>

<ul>
  <li>Создать шаблон для начальных запросов </li>

  <li>Установить максимальное число результатов и создать страницы </li>

  <li>Настроить отображение результатов </li>

  <li>Привязать свойства к системе свойств Windows Explorer </li>

  <li>Генерировать подсказки </li>
</ul>

<p>На самом деле, есть многое, что следует знать о создании собственных поставщиков поиска OpenSearch. Если вам интересна эта тема, ознакомьтесь с <a href="https://www.microsoft.com/downloads/details.aspx?familyid=c709a596-a9e9-49e7-bcd4-319664929317&amp;displaylang=en&amp;tm"><b>руководством по разработке поставщика федеративного поиска в Windows 7</b></a> и посмотрите <a href="https://channel9.msdn.com/posts/yochay/Introduction-to-Windows-7-Libraries/"><b>вебкаст о федеративном поиске</b></a>, созданный Сашей Голдштейном (<a href="https://blogs.microsoft.co.il/blogs/sasha/"><b>Sasha Goldstein</b></a>), одним из авторов книги <a href="https://www.amazon.com/Introducing-Windows-Developers-Yochay-Kiriaty/dp/0735626820/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1268766186&amp;sr=8-1"><b>Введение в Windows 7 для разработчиков</b></a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Использование сенсоров в приложении: реализация в управляемом коде (часть 1)</title>
      <link>https://docs.microsoft.com/archive/blogs/windev/33</link>
      <pubDate>Mon, 08 Mar 2010 22:59:51 GMT</pubDate>
      <dc:creator><![CDATA[Anton Belousov - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/windev/2010/03/08/33/</guid>
      <description><![CDATA[Мы рассмотрели архитектуру платформы Sensor and Location в Windows 7 (Я тебя чувствую: использование...]]></description>
      <content:encoded><![CDATA[<p>Мы рассмотрели архитектуру платформы Sensor and Location в Windows 7 (<a href="https://blogs.msdn.com/windev/archive/2010/02/27/i-can-feel-you-using-the-windows-7-sensor-platform.aspx"><b>Я тебя чувствую: использование платформы Sensor в Windows 7 </b></a>) и <a href="https://blogs.msdn.com/windev/archive/2010/03/03/using-sensors-in-your-application-native-implementation-part-1.aspx"><b>Использование сенсоров в приложении: реализация в неуправляемом коде (ч.1)</b></a>. В сегодняшней статье я расскажу об управляемом API для использования сенсоров. В следующих публикациях я продолжу рассказ о неуправляемых API.</p>  <p>До сих пор вы видели примеры использования платформы с помощью C++ и COM. Теперь давайте рассмотрим, как разработчики управляемого кода смогут использовать платформу с помощью <a href="https://code.msdn.microsoft.com/WindowsAPICodePack"><b>Windows API Code Pack для .NET Framework</b></a>.</p>  <p><b>Обнаружение сенсоров с помощью управляемого кода</b></p>  <p>При использовании управляемого кода следуйте тем же рекомендациям, что и для неуправляемого кода: для начала необходимо обнаружить сенсоры, проверить их состояние и при необходимости права, а затем прочитать данные с сенсора. Давайте начнем с обнаружения сенсора.</p>  <p>Основное пространство имен для сенсоров в Windows API Code Pack – это Microsoft.WindowsAPICodePack.Sensors из сборки Microsoft.WindowsAPICodePack.Sensors.dll. Это пространство имен содержит класс SensorManager, управляющий сенсорными устройствами, подключенными к ПК. Этот класс предоставляет набор методов, схожих с методами из неуправляемого интерфейса ISensorManager. Эти методы включают GetSensorsByCategoryId, GetSensorsByTypeId и GetSensorsBySensorId, последний из которых получает в качестве входного параметра GUID, который представляет категорию сенсора, тип или идентификатор сенсора. Кроме того, вы также найдете метод GetAllSensors, который возвращает все сенсоры, подключенные к системе, независимо от типа или категории, как показано в следующем фрагменте кода.</p>  <div id="codeSnippetWrapper">   <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#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">     <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #0000ff">private</span> <span style="color: #0000ff">void</span> PrintAllSensors()</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">{</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">    SensorList&lt;Sensor&gt; sensorList =  SensorManager.GetAllSensors();</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">    <span style="color: #0000ff">foreach</span> (var sensor <span style="color: #0000ff">in</span> sensorList)</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">    {</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">        StringBuilder sb = <span style="color: #0000ff">new</span>  StringBuilder();</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">        sb.Append(<span style="color: #006080">&quot;Sensor Information:&quot;</span>);</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">        sb.Append(Environment.NewLine);</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">        sb.Append(sensor.FriendlyName);</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">        sb.Append(Environment.NewLine);</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">        sb.Append(sensor.CategoryId);</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">        sb.Append(Environment.NewLine);</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">        sb.Append(sensor.State);</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">        sb.Append(Environment.NewLine);</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">&#160;</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">        Console.WriteLine(sb.ToString());</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">    }</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">}</pre>
<!--CRLF--></div>
</div>

<p>Запуск вышеприведенного фрагмента кода на моей локальной машине дает следующий результат: отображает сенсоры, подключенные к моей локальной машине. Обратите внимание, что лишь виртуальный датчик освещения находится в состоянии Ready, а остальные показывают AccessDenied, означая, что они недоступны.</p>

<div id="codeSnippetWrapper">
  <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#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">
    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">Sensor Information:</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">Legacy GPS Driver</pre>
<!--CRLF--><!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">AccessDenied</pre>

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">bfa794e4-f964-4fdb-90f6-51056bfe4b44</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">&#160;</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">Sensor Information:</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">Skyhook Wireless XPS Location Sensor</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">bfa794e4-f964-4fdb-90f6-51056bfe4b44</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">AccessDenied</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">&#160;</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">Sensor Information:</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">Ambient Light Sensor</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">17a665c0-9063-4216-b202-5c7a255e18ce</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">Ready</pre>
<!--CRLF--></div>
</div>

<p>Так как Windows API Code Pack включает строго типизированный класс сенсоров Sensor, получить список сенсоров и вывести их свойства достаточно просто. Неуправляемый API имеет интерфейс Sensor, через который вы и будете работать с сенсорами, но помимо интерфейса ISensor требуется использовать GUID. В Windows API Code Pack присутствует список всех GUID, которые доступны в Sensors.h. Классы SensorPropertyKeys и SensorCategories содержат публичное свойство «только для чтения» для объектов GUID, которые соответствуют тем же самым значениям в файле Sensors.h. Однако, это не самая используемая и предпочтительная модель программирования, к которой привыкли .NET-разработчики, и в основном потому, что неуправляемые объекты сенсора в определены не строго и вы вынуждены использовать более универсальную систему GUID для обращения к данным сенсора. Это не позволяет использовать весь спектр возможностей .NET, например, привязку данных, безопасность типов и свойства. Таким образом, пространство имен Microsoft.WindowsAPICodePack.Sensors, структура которого приведена на изображении ниже, включает несколько строго типизированных классов сенсора, позволяющих осуществлять привязку к их свойствам. Например, AmbientLightSensor, у которого одно публичное свойство, CurrentLuminousIntensity, отображающее текущее количество света (яркость), измеренное сенсором. Пространство имен также включает уровень совместимости, который охватывает неуправляемый интерфейс, всю информацию о метаданных и объектную модель, с которой имеют дело разработчики.</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/windev/WindowsLiveWriter/UsingSensorsinYouApplicationManagedPart1_8C86/clip_image001%5B4%5D.png" original-url="https://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/UsingSensorsinYouApplicationManagedPart1_8C86/clip_image001%5B4%5D.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="clip_image001[4]" border="0" alt="clip_image001[4]" align="right" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/windev/WindowsLiveWriter/UsingSensorsinYouApplicationManagedPart1_8C86/clip_image001%5B4%5D_thumb.png" original-url="https://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/UsingSensorsinYouApplicationManagedPart1_8C86/clip_image001%5B4%5D_thumb.png" width="220" height="480" /></a></p>

<p>Обратите внимание, что пространство имен Microsoft.WindowsAPICodePack.Sensors предлагает модель расширения, позволяющую создавать любой строго типизированный сенсор. Вместе с возможностями расширения, предлагаемыми неуправляемыми API, вы можете создать любой тип сенсора, какой только захотите, с любыми значениями данных. Дополнительную информацию о модуле расширения платформы Sensor and Location вы можете найти на веб-узле платформы: <a href="https://www.microsoft.com/whdc/device/sensors/"><b>https://www.microsoft.com/whdc/device/sensors/</b></a>.</p>

<p>Со строго типизированным классом сенсора Windows API Code Pack может определить версию .NET Generics методов Get. Например, GetSensorsByTypeId&lt;S&gt;, где S – производный тип от базового класса Sensor. Прототип выглядит следующим образом:</p>

<p>public static SensorList&lt;S&gt; GetSensorsByTypeId&lt;S&gt;( ) where S: Sensor</p>

<p>При использовании данной функции вы должны предопределить SensorList &lt;&gt; желаемого типа сенсора, (в нашем примере AmbientLightSensor), а затем вызвать метод, запрашивающий у менеджера сенсора возврат сенсоров типа AmbientLightSensor. Следующий фрагмент кода иллюстрирует этот процесс:</p>

<div id="codeSnippetWrapper">
  <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#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">
    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000">// Строготипизированный SensorList типа AmbientLightSensor</span></pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">SensorList&lt;AmbientLightSensor&gt; alsList = <span style="color: #0000ff">null</span>;</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #0000ff">try</span></pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">{</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">    alsList = SensorManager.GetSensorsByTypeId&lt;AmbientLightSensor&gt;();</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">}</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #0000ff">catch</span> (SensorPlatformException) </pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">{</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">    <span style="color: #008000">// Обработка ошибки, когда отсутствует доступ к сенсорному устройству </span></pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">}</pre>
<!--CRLF--></div>
</div>

<p>Класс SensorManager содержит одно событие, называемое SensorChanged, эквивалентное неуправляемому событию ISensorManager:: OnSensorEnter. Единственным различием между реализациями на неуправляемом и управляемом коде является то, что реализация на управляемом коде в дополнение к получению события при подключении нового устройства генерирует событие при отключении сенсора. Таким образом, SensorsChangedEventArgs, параметры которого переданы обработчику события SensorManager.SensorChanged, включает SensorAvailabilityChange, определяющий тип изменения для каждого сенсора, который может принимать значение Addition для вновь подключенных сенсоров и Removal при отключении сенсоров от ПК.</p>

<p>SensorManager_SensorsChanged представляет собой функцию, которая обрабатывает событие SensorsChanged в нашем приложении и это выглядит следующим образом:</p>

<div id="codeSnippetWrapper">
  <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#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">
    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #0000ff">void</span> SensorManager_SensorsChanged( SensorsChangedEventArgs change )</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">{</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">    <span style="color: #008000">// Событие SensorsChanged происходит в потоке, отличном от потока приложения.</span></pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">    <span style="color: #008000">// Анонимный делегат осуществляет обновление интерфейса приложения.</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">    BeginInvoke( <span style="color: #0000ff">new</span> MethodInvoker( <span style="color: #0000ff">delegate</span></pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">    {</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">        PopulatePanel( );</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">    } ) );</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">}</pre>
<!--CRLF--></div>
</div>

<p>Событие SensorsChanged обрабатывается в ином потоке, отличном от основного потока приложения (UI). Windows Forms не позволяют обновлять интерфейс приложения из таких потоков. Поэтому для любого Windows-приложения с оконным интерфейсом мы настоятельно рекомендуем использовать поток, отличный от основного потока UI, для выполнения сложных вычислений или любого процесса ввода/вывода (также как в нашем примере синхронного чтения данных сенсора). Для того чтобы правильно осуществлять обработку обновлений для не-UI потоков, следует использовать BeginInvoke, позволяющий выполнить определенный делегат асинхронно в потоке, в котором был создан основной обработчик формы. Это также верно для любого приложения WPF. Метод PopulatePanel выполняет итерации через все сенсоры и обновляет интерфейс приложения по мере проверки состояния сенсора и чтения его данных. Об этом мы расскажем в следующих статьях.</p>]]></content:encoded>
    </item>
    <item>
      <title>Использование сенсоров в приложении: реализация в неуправляемом коде (часть 1)</title>
      <link>https://docs.microsoft.com/archive/blogs/windev/43</link>
      <pubDate>Wed, 03 Mar 2010 11:19:36 GMT</pubDate>
      <dc:creator><![CDATA[Anton Belousov - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/windev/2010/03/03/43/</guid>
      <description><![CDATA[После поверхностного обзора платформы Sensor and Location пришло время углубиться в API. Мы начнем с...]]></description>
      <content:encoded><![CDATA[<p>После <a href="https://blogs.msdn.com/windev/archive/2010/02/27/i-can-feel-you-using-the-windows-7-sensor-platform.aspx"><b>поверхностного обзора платформы Sensor and Location</b></a> пришло время углубиться в API. Мы начнем с описания Win32 API для понимания потока данных, а затем рассмотрим управляемые API через <a href="https://code.msdn.microsoft.com/WindowsAPICodePack"><b>Windows API Code Pack для .NET Framework</b></a>.</p>  <p>Платформа Sensor and Location состоит из двух компонентов: сенсорного и компонента, созданного поверх него и отвечающего за местоположение. Для начала мы подробно рассмотрим сенсорную часть, чтобы к тому моменту, когда пойдет речь о местоположении, понимать, на чем она основана.</p>  <p>Sensor API (равно как и Location API) базируется на COM. Все необходимые API и определения GUID можно найти в файлах Sensorsapi.h и Sensors.h из Windows 7 SDK. Файл Sensors.h содержит массу GUID, которые определяют различные категории сенсоров, типов и данных. API и интерфейсы находятся в файле Sensorsapi.h. Более пристальный взгляд на файл Sensorsapi.h открывает три основных COM-интерфейса, о которых вам необходимо знать, работая с сенсорами:</p>  <ul>   <li><b>ISensorManager</b> является основным интерфейсом для всех сенсоров, подключенных к платформе. Менеджер позволяет получать список сенсоров, запрашивать разрешения для доступа к их данным и получать уведомления о событиях при обнаружении нового сенсора. </li>    <li><b>ISensor</b> представляет собой текущий объект сенсора, с которым вы собираетесь работать. Через этот интерфейс можно задавать и получать свойства объекта, получать отчеты и регистрировать события, которые произошли во время работы сенсора. </li>    <li><b>ISensorDataReport</b> – единственный интерфейс, который вы будете любить и ненавидеть, поскольку это единственный способ получения актуальных данных от сенсора, однако это обобщенная форма обобщенного отчета данных, которые необходимо охватить. </li> </ul>  <p>Чтобы интегрировать сенсоры в приложение, придется работать с этими тремя интерфейсами.</p>  <h4>Интеграция сенсоров в приложение</h4>  <p>Для интеграции сенсоров в приложение, вам необходимо выполнить следующие шаги:</p>  <p>1. <b>Обнаружение сенсора</b> – прежде, чем вы сможете обратиться к сенсору, необходимо обнаружить, какие сенсоры подключены к системе. Используйте интерфейс ISensorManager для получения списка сенсорных устройств, подключенных к платформе, и регистрации событий о подключении нового сенсора.</p>  <p>2. <b>Получение сенсора и прав на него</b> – как только вы обнаружили и выбрали сенсор, с которым желаете работать, необходимо убедиться, что вы имеете полномочия для доступа к нему. Если вы не имеете прав для доступа к данным сенсора (использовать его), то должны получить соответствующие права, чтобы приложение имело доступ к данным сенсора.</p>  <p>3. <b>Взаимодействие с сенсором</b> – после получения доступа к данным сенсора, можно начать работу с ним, читая и устанавливая свойства, а также регистрируя события.</p>  <p>Первый шаг, который необходимо сделать для каждого приложения, в котором требуется использовать сенсоры, – это обнаружить, какие сенсоры подключены к платформе, а затем получить доступ к одному из них. Чтобы разрешить приложению сделать это, вы должны использовать COM-интерфейс ISensorManager. Менедже</p>  <h4>Обнаружение сенсоров</h4>  <p>р сенсора содержит список доступных датчиков. Так как это COM-интерфейс, вам необходимо его инициализировать с помощью CoCreateInstance. В принципе, этот интерфейс можно рассматривать как корневой интерфейс для API сенсора. Следующий фрагмент кода создает экземпляр менеджера сенсора:</p>  <div style="overflow: scroll" id="codeSnippetWrapper">   <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#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">     <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000">// Объявляем указатель для получения указателя менеджера сенсора.</span></pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000">// Вообще данный указатель определяется в определении класса прототипов.</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000">// CAmbientLightAwareSensorManagerEvents</span></pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">CComPtr&lt;ISensorManager&gt; m_spISensorManager;</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">HRESULT hr;</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000">// Создаем менеджер сенсора</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">hr = m_spISensorManager.CoCreateInstance(CLSID_SensorManager);</pre>
<!--CRLF--></div>
</div>

<p>Интерфейс ISensorManager обеспечивает набор методов для обнаружения и получения доступных сенсоров. Он также выдает событие, используемое для получения уведомлений о доступности новых сенсоров. Вы можете спросить себя, как регистрировать событие, когда сенсор «покидает» систему. Ответ на этот вопрос можно отыскать в самом сенсоре. С указателем ISensorManager под рукой можно начать поиск сенсоров. У ISensorManager есть три метода, которые помогут найти подключенные датчики:</p>

<ul>
  <li><b>GetSensorsByID</b> – первый метод возвращает определенный сенсор по его идентификатору (ID), который представляет собой обычный GUID. Это не самая используемая функция, поскольку GUID сенсора генерируется автоматически при первоначальном подключении к системе для обеспечения поддержки нескольких сенсоров одного и того же производителя и одинаковой модели. </li>

  <li><b>GetSensorsByCategory</b> – эта функция возвращает набор сенсоров, совместно использующих одну категорию. Например, может быть несколько сенсоров местоположения, включая GPS и триангуляцию Wi-Fi, включенных в платформу, и вы не хотите отказываться от их использования. </li>

  <li><b>GetSensorsByType</b> – эта функция возвращает набор сенсоров одного и того же типа. </li>
</ul>

<p>Как можно заметить, имена функций показывают, что к компьютеру одновременно подключено множество сенсоров. Технически возможно, чтобы несколько сенсоров одной и той же категории были подключены к одному и тому же ПК. Например, на моем компьютере установлен один датчик освещения, установленный в корпус ПК, и еще один из состава Sensor Development Kit. Имеет смысл использовать световой датчик, встроенный в корпус, так как он обеспечивает самое точное определение условий освещения. Для приложения наилучшим способом обнаружения сенсоров является использование типа интерфейса и категорий функции Sensor Manager с последующим выбором из списка нужного сенсора.</p>

<p>В этом цикле статей мы будем использовать очень простое приложение Microsoft Foundation Classes (MFC), являющееся частью Windows 7 SDK. Следующий код взят из метода Initialize класса CAmbientLightAwareSensorManagerEvents. В этом классе реализованы уведомления ISensorManagerEvents при обнаружении нового датчика.</p>

<p>Метод Initialize вызывают во время процесса инициализации главного диалога (у нас есть только один):</p>

<div style="overflow: scroll" id="codeSnippetWrapper">
  <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#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">
    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">HRESULT CAmbientLightAwareSensorManagerEvents::Initialize()</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">{</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">    HRESULT hr;</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">    <span style="color: #008000">// Создаем менеджер сенсора</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">    hr = m_spISensorManager.CoCreateInstance(CLSID_SensorManager);</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">    <span style="color: #0000ff">if</span> (SUCCEEDED(hr))</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">    {</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">        hr = m_spISensorManager-&gt;SetEventSink(<span style="color: #0000ff">this</span>);</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">        <span style="color: #0000ff">if</span> (SUCCEEDED(hr))</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">        {</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">            <span style="color: #008000">// Ищем сенсоры внешнего освещения</span></pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">            CComPtr&lt;ISensorCollection&gt; spSensors;</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">            hr = m_spISensorManager-&gt;GetSensorsByType</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                        (SENSOR_TYPE_AMBIENT_LIGHT, &amp;spSensors);</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">            <span style="color: #0000ff">if</span> (SUCCEEDED(hr) &amp;&amp; NULL != spSensors)</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">            {</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                ULONG ulCount = 0;</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                hr = spSensors-&gt;GetCount(&amp;ulCount);</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                <span style="color: #0000ff">if</span> (SUCCEEDED(hr))</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                {</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                    <span style="color: #0000ff">for</span>(ULONG i=0; i &lt; ulCount; i++)</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                    {</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                        CComPtr&lt;ISensor&gt; spSensor;</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                        hr = spSensors-&gt;GetAt(i, &amp;spSensor);</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                        <span style="color: #0000ff">if</span> (SUCCEEDED(hr))</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                        {</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                            <span style="color: #008000">// Вспомогательная функция, устанавливающая обработчик событий </span></pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                            <span style="color: #008000">// для заданного сенсора</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                            hr = AddSensor(spSensor);</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                            <span style="color: #0000ff">if</span> (SUCCEEDED(hr))</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                            {</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                                <span style="color: #008000">// Проверка текущего состояния сенсора.</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                                SensorState state = SENSOR_STATE_READY;</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                                hr = spSensor-&gt;GetState(&amp;state);</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                                <span style="color: #0000ff">if</span>(SUCCEEDED(hr))</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                                {</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                                      <span style="color: #0000ff">if</span>(state == SENSOR_STATE_READY)</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                                     {</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                                        <span style="color: #008000">// Читаем данные с сенсора и обновляем </span></pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                                        <span style="color: #008000">// интерфейс приложения</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                                        hr = m_pSensorEvents-&gt;GetSensorData</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                                                                (spSensor);</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                                     }</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                            }</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                        }</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                    }</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                }</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">            }</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">        }</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">    }</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">    <span style="color: #0000ff">return</span> hr;</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">}</pre>
<!--CRLF--></div>
</div>

<p>Как видите, после успешного получения интерфейса ISensorManager вы вызываете ISensorManager::GetSensorsByType, используя SENSOR_TYPE_AMBIENT_LIGHT и указатель на набор ISensorCollection, spSensors. SENSOR_TYPE_AMBIENT_LIGHT указывает, что мы хотим получить только сенсор внешнего освещения (ALS). В то же время можно опросить все сенсоры типа SENSOR_TYPE_VOLTAGE из электрической категории или SENSOR_TYPE_ACCELEROMETER_3D из категории акселерометров.</p>

<p>В случае успешного выполнения функция GetSensorsByType заполняет ISensorCollection списком ALS-сенсоров. Затем вы повторяете эту процедуру для всего набора и вызываете вспомогательную функцию AddSensor для каждого сенсора. Она устанавливает обработчик события (делегат), регистрируя сенсор в m_pSensorEvents, являющийся реализацией класса SensorEvents предназначенного для перехвата событий, но об этом я расскажу позже. Наконец, вы вызываете другой вспомогательный метод, GetSensorData, чтобы считать данные с сенсора и обновить значение освещенности в интерфейсе приложения. Мы расскажем о чтении данных сенсора в следующих статьях.</p>

<p>В течение всего времени выполнения приложения к компьютеру могут быть подключены новые сенсоры, таким образом, требуется механизм уведомления приложения при подключении новых сенсоров. Интерфейс ISensorManager содержит метод SetEventSink для задания класса реализующего обработчик событий, то есть делегат, который обрабатывает события. Эта функция получает интерфейс обратного вызова ISensorManagerEvents, получающий уведомления о подключении новое сенсора. Это событие выступает в качестве приемника, обрабатывающего OnSensorEnter – единственное событие, которое есть у интерфейса ISensorManagerEvents.</p>

<p>Если вы посмотрите на вышеприведенный пример, то увидите, что SetEventSink вызывается после успешного создания интерфейса ISensorManager и передает его в качестве входного параметра, а затем локальный класс CAmbientLightAwareSensorManagerEvents использует интерфейс ISensorManagerEvents.</p>

<p>Таким образом, в этом классе вы найдете реализацию для обработчика события ISensorManager:: OnSensorEnter, которая выглядит следующим образом:</p>

<div style="overflow: scroll" id="codeSnippetWrapper">
  <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#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">
    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">HRESULT CAmbientLightAwareSensorManagerEvents::OnSensorEnter</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                                    (ISensor* pSensor, SensorState state)</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">{</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">    HRESULT hr = S_OK;</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">&#160;</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">    <span style="color: #0000ff">if</span> (NULL != pSensor)</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">    {</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">        SENSOR_TYPE_ID idType = GUID_NULL;</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">        hr = pSensor-&gt;GetType(&amp;idType);</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">        <span style="color: #0000ff">if</span> (SUCCEEDED(hr))</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">        {</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">            <span style="color: #008000">// Здесь нас интересуют лишь сенсоры освещения</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">            <span style="color: #0000ff">if</span> (IsEqualIID(idType, SENSOR_TYPE_AMBIENT_LIGHT))</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">            {</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                hr = AddSensor(pSensor);</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                <span style="color: #0000ff">if</span> (SUCCEEDED(hr))</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                {</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                    <span style="color: #0000ff">if</span> (SENSOR_STATE_READY == state)</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                    {</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                        hr = m_pSensorEvents-&gt;GetSensorData(pSensor);</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                    }</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">                }</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">            }</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">        }</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">    }</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">    <span style="color: #0000ff">else</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">    {</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">        hr = E_POINTER;</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">    }</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">&#160;</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">    <span style="color: #0000ff">return</span> hr;</pre>
<!--CRLF-->

    <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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">}</pre>
<!--CRLF--></div>
</div>

<p>В этом фрагменте кода метод OnSensorEnter получает указатель на недавно подключенный сенсор и его статус. Если указатель не NULL, считывается тип сенсора с помощью метода GetType интерфейса ISensor. Поскольку мы работаем со светочувствительным приложением и интересуемся только световыми сенсорами, мы проверим, является ли недавно подключенный сенсор световым, определив его тип. Помните, что ISensorManager получает уведомление о любом типе сенсора, подключенного к ПК. Если сенсор является датчиком освещенности, тогда вы вызываете ту же вспомогательную функцию AddSensor, которую использовали в методе Initialize, устанавливая перехватчик для специфичных сенсоров. Не перепутайте с перехватчиком для ISensorManager. Последнее, что нужно сделать, – проверить, находится ли сенсор в состоянии готовности. Если да, вы просто читаете данные с сенсора и обновляете интерфейс приложения.</p>

<p>Но чтение данных с сенсора мы оставим для следующих статей.</p>

<p>За дополнительными ресурсами по платформе <a href="https://channel9.msdn.com/learn/courses/Windows7/"><b>Windows 7 Sensor and Location</b></a> обращайтесь к <a href="https://channel9.msdn.com/learn/"><b>учебному центру на Channel 9</b></a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Я тебя чувствую: использование платформы Sensor в Windows 7</title>
      <link>https://docs.microsoft.com/archive/blogs/windev/1083</link>
      <pubDate>Sat, 27 Feb 2010 04:01:21 GMT</pubDate>
      <dc:creator><![CDATA[Anton Belousov - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/windev/2010/02/27/1083/</guid>
      <description><![CDATA[Итак, мы вернулись. После длительного перерыва пришло время написать о замечательных новых API,...]]></description>
      <content:encoded><![CDATA[<p>Итак, мы вернулись. После длительного перерыва пришло время написать о замечательных новых API, используемые Windows 7 для определения местоположения и расширения возможностей приложений. Я еще должен две статьи о панели задач Windows 7, чтобы завершить серию публикаций, но платформа Sensor and Location слишком хороша, чтобы оставлять ее напоследок.</p>  <p>Прежде, чем мы погрузится в API, я должен объяснить, что двигало нами, когда мы разрабатывали платформу Sensor and Location для Windows 7. Про местоположение я расскажу в будущих публикациях.</p>  <h6>Почему сенсоры?</h6>  <p>В последнее время мы являемся свидетелями возрастающей роли сенсоров в некоторых весьма захватывающих сценариях. Взять, к примеру, мобильное устройство, которое автоматически меняет ориентацию экрана с портретной на пейзажную, основываясь на информации о положении устройства по отношению к земле, или компьютеры, которые автоматически управляют яркостью экрана при изменении условий освещения. Однако я думаю, наилучшим примером является автоматическое изменение часового пояса на мобильном устройстве – во время путешествий при включении мобильного устройства после приземления самолета не надо заботиться об установке времени – устройство само магическим образом показывает правильное время, даже если вы пересекли несколько часовых поясов.</p>  <p>Помимо очевидных причин, другим серьезным основанием создать «платформу» является тот факт, что она унифицирует API, снижая затраты на их использование и разработку ПО. В прошлом использование сенсоров было исключительно отраслевым решением. Не было однозначного определения типа применяемых сенсоров, используемых данных и способов обращения к ним. Отсутствие стандартизации делала программирование для сенсоров трудной задачей. Используя сенсор, например сенсор местоположения GPS, вы должны были выбрать устройство из широкого ряда производителей, у каждого из которых был определенный набор драйверов и API, которые требовалось изучить для работы с этим устройством. Если вы хотели сменить устройство или вендора, то часто приходилось изучать новые API.</p>  <p>В Windows 7 мы начали решать эту проблему с самого основания, обеспечив встроенную поддержку для сенсоров. Платформа Sensor and Location в Windows 7 обеспечивает ряд стандартных интерфейсов, которые освободили разработчиков от необходимости изучать устройства различных производителей и позволили сосредоточиться на приложении, используя сенсоры в качестве еще одного канала ввода данных. Предоставляя эти стандартные интерфейсы, платформа Sensor and Location в Windows 7 предлагает значительные преимущества разработчикам, упростив им обнаружение, доступ и получение информации от сенсоров и предоставляя больше возможностей для адаптации приложений к изменениям окружающих условий. В свою очередь, это создает спрос на устройства с сенсорами и если вы относитесь к вендорам аппаратного обеспечения, к вашим услугам стандартизированный способ использования единого API, который интегрирован в Windows. Что еще более важно, конечные пользователи получат в свое распоряжение приложения, способные чувствовать окружающую среду.</p>  <p>Часть головоломки, связанная с определением местоположения, добавляет абстрактный уровень поверх платформы Sensor с единственной целью обеспечить простой способ получения данных о географическом местоположении, сохраняя при этом конфиденциальность пользователей.</p>  <h6>Сенсоры изнутри</h6>  <p>Чтобы лучше понять API платформы Sensor, я сделаю краткий обзор ее архитектуры, объяснив роль главных компонентов. Следующее изображение иллюстрирует главные компоненты в системе. Обратите внимание, что эта схема охватывает не всю платформу – на ней отсутствует часть, отвечающая за местоположение, но пока этого более чем достаточно.</p>  <p><a href="https://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/sensor_5F00_Arch1_5F00_38AF7F2B.png"><img title="sensor_Arch1" border="0" alt="sensor_Arch1" src="https://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/sensor_5F00_Arch1_5F00_thumb_5F00_1EDB48FC.png" width="426" height="399" /></a></p>  <p>Первый компонент в платформе – сам сенсор – отмечен цифрой 1 на рисунке. Обычно это – реальное физическое устройство, которое измеряет такие физические явления, как количество света, температура, влажность, относительная сила тяжести и т.д. Однако, сенсор может быть и логическим (или виртуальным) устройством. Виртуальный сенсор – это программный сенсор, который имитирует функциональные возможности физического сенсора, предоставляя данные платформе. Виртуальные сенсоры могут использоваться для эмуляции реальных сенсоров, помогая процессу разработки, поскольку вы можете сразу видеть результат.</p>  <p>Каждому сенсору требуется драйвер, обеспечивающий взаимодействие между Windows 7 и устройством. Эта интеграция достигается через драйвер User-mode Device (UMD), отмеченный на рисунке номером 2.</p>  <p>Для облегчения процесса написания драйвера устройства, который обеспечивает общение сенсора с Windows 7, в платформе предусмотрено расширение класса сенсоров, отмеченное номером 3. По сути, это библиотека драйвера, в которой реализован общий код, необходимый для драйверов сенсора. Хотя в сегодняшней статье мы не будем говорить об устройствах или драйверах, у нас есть два превосходных видео (<a href="https://channel9.msdn.com/posts/yochay/Windows-7-Sensor-and-Location-Developing-Drivers-Part-1/"><b>Windows 7 Sensor and Location – Разработка драйверов (ч.1)</b></a> и <a href="https://channel9.msdn.com/posts/yochay/Windows-7-Sensor-and-Location-Developing-Drivers-Part-2/"><b>Windows 7 Sensor and Location – Разработка драйверов (ч.2)</b></a>) с Гэвином Гиром (Gavin Gear), объясняющим, как написать драйвер для сенсора.</p>  <p>После того, как сенсор установлен и интегрирован, он становится доступен приложению через API сенсора, отмеченный номером 4.</p>  <p>Одно из главных преимуществ платформы Sensor and Location в Windows 7 состоит в том, что она позволяет различным приложениям получать данные от одного и того же сенсора в одно и то же время – эта возможность обозначена номером 5. В предыдущих версиях Windows для взаимодействия с системой устройства использовали виртуальные COM-порты. Одной из проблем работы с виртуальными COM-портами было то, что они не масштабировались и не поддерживали работу с несколькими приложениями одновременно, поэтому наличие платформы, поддерживающей параллельную работу нескольких приложений, является большим преимуществом.</p>  <p>Последний компонент платформы – это диалог «Location and Other Sensors», который является частью панели управления Windows. Этот диалог, отмеченный номером 6, позволяет пользователям управлять настройками разрешений и другими параметрами, которыми обладают сенсоры. Ниже расположен снимок этой панели управления. Как вы видите, в настоящее время у меня установлен два сенсора – Sensor Development Kit и виртуальный датчик освещенности, при этом оба они разрешены для использования.</p>  <div style="overflow: scroll"><img src="https://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/SensorAndLocationControlPannel_5F00_050712CD.png" width="640" height="354" /></div>  <p>Последним пунктом перед переходом к API, является объяснение того, каким образом сенсоры представлены в платформе.</p>  <p>Как мы видели выше, сенсор может быть как физическим так и логическим (виртуальным) устройством. Независимо от типа, все сенсоры имеют схожие свойства, представленные в списке:</p>  <ul>   <li><b>Категория</b> (Category) – набор сенсоров, определенным образом связанных между собой. Например, погодная станция могла бы измерять температуру, атмосферное давление, скорость ветра и другие сенсоры, имеющие отношение к погоде. </li>    <li><b>Тип</b> (Type) – определение физических явлений, которые могут измеряться, например, скорость ветра или количество света. </li>    <li><b>Свойства</b> (Properties) – метаданные, которые может содержать сенсор, например, дружелюбное для сенсора название. Они могут быть «только для чтения» или для «чтения-записи». Название сенсора и его серийный номер являются примеров свойств «только для чтения», а интервал опроса сенсора – пример свойства «чтения – записи». </li>    <li><b>Типы данных</b> (Data Types) – фактические типы данных, которые сенсор передает после измерения. Например, освещенность измеряется в люксах, которые сенсор передает в качестве переменной с плавающей точкой. Информация о местоположении включает широту и долготу, и при этом обе характеристики – переменные с плавающей точкой. Однако, как вы скоро узнаете, информация о местоположении может включать и адрес, являющийся набором из нескольких строк. Типы данных меняются от сенсора к сенсору и предполагается, что вы знаете, какие типы данных возвращает используемый тип сенсора. </li>    <li><b>События</b> (Events) – основной способ взаимодействия платформы Sensor and Location с приложением, благодаря которому приложение знает, что приняты новые данные или состояние сенсора изменилось. </li>    <li><b>Состояние</b> (State) – определение возможных рабочих состояний для сенсоров, отвечающих на вопросы: «действительно ли сенсор готов к использованию» или «активировал ли пользователь сенсор?&quot; </li> </ul>  <p>Вооруженные этой информацией, мы готовы начать работу с сенсорами и погрузиться в API. Но прежде еще нужно прочитать следующую статью о платформе Sensor and Location.</p>]]></content:encoded>
    </item>
    <item>
      <title>Доступны записи с Windows 7 PDC Boot Camp</title>
      <link>https://docs.microsoft.com/archive/blogs/windev/windows-7-pdc-boot-camp</link>
      <pubDate>Thu, 31 Dec 2009 01:48:18 GMT</pubDate>
      <dc:creator><![CDATA[Anton Belousov - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/windev/2009/12/31/windows-7-pdc-boot-camp/</guid>
      <description><![CDATA[Во время PDC у меня была замечательная возможность присоединиться к группе выдающихся инженеров на...]]></description>
      <content:encoded><![CDATA[<p>Во время PDC у меня была замечательная возможность присоединиться к группе выдающихся инженеров на Windows 7 Boot Camp. Как я уже <a href="https://windowsteamblog.com/blogs/developers/archive/2009/11/16/reporting-live-from-the-windows-7-seminar-boot-camp.aspx"><b>сообщал</b></a>, мероприятие происходило 16 ноября в зале, заполненном 750 участниками, которые услышали об изменениях в ядре Windows 7 и Server R2, а также о некоторых новых интерфейсах пользовательского режима и, в частности, панели задач, библиотек, платформы Windows Touch, платформы Sensor and Location и DirectX.</p>  <p>Это сообщение дает вам возможность увидеть видеозаписи, загрузить презентации и демонстрационный код. Так, даже если вы пропустили Windows 7 Boot Camp, вы можете посмотреть его прямо со своего компьютера.</p>  <p>Марк Руссинович (<a href="https://channel9.msdn.com/shows/Going%20Deep/Mark-Russinovich-Inside-Windows-7/"><b>Mark Russinovich</b></a>), технический специалист Microsoft и человек, стоящий за приложениями SysInternals и массой изменений в Windows 7, открыл день с краткого введения в работу, проделанную командой Windows Kernel, послужившей базой для следующих двух сессий. Вы можете <a href="https://microsoftpdc.com/Sessions/WKSP08"><b>посмотреть</b></a> запись презентации Марка (время – 00:00:00 – 00:13:45) и скачать <a href="https://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers.PDC2009/Windows-7-Developer-Bootcamp-_2800_Opening_2900_-_2D00_-Core-Kernel-Changes.zip"><b>презентацию</b></a>.</p>  <p>Арун Кишан (<a href="https://channel9.msdn.com/shows/Going+Deep/Arun-Kishan-Process-Management-in-Windows-Vista/"><b>Arun Kishan</b></a>), главный архитектор компонентов управления процессом, описал свою работу о распределении потоков и процессов, которое освобождает ядро от блокировок диспетчера потоков и дает Windows 7 возможность грамотно задействовать до 256 ядер. Арун также рассказал о новом <a href="https://msdn.microsoft.com/en-us/library/dd627187.aspx"><b>планировании пользовательского режима</b></a> в Windows 7, позволяющем быстрее переключать контекст между потоками (когда потоки запускаются в пользовательском режиме), в то же время, позволяя ядру управлять блокировками потоков и, таким образом, не терять указатели LP вне зоны контроля. Вы можете <a href="https://microsoftpdc.com/Sessions/WKSP08"><b>посмотреть</b></a> запись презентации Аруна (время – 00:13:45 – 00:54:26) и скачать <a href="https://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers.PDC2009/Windows-7-Developer-Bootcamp-_2D00_-Core-Kernel-Changes-in-Windows-7-and-Server-2008-R2.zip"><b>презентацию</b></a>.</p>  <p>Последним докладчиком в открывающей части мероприятия был Ленди Вонг (<a href="https://channel9.msdn.com/shows/Going+Deep/Landy-Wang-Windows-Memory-Manager/"><b>Landy Wang</b></a>), инженер в команде Windows Kernel. Ленди действительно разбирается в изменениях в управлении памятью Windows 7, большая работа была проделана командой для уменьшения объема памяти, заставляя операционную систему работать быстро (очень быстро). Ленди описал работу, выполненную для оптимизации рабочих наборов памяти, демистифицировал некоторые из вопросов о главном экране диспетчера задач и том, как диспетчер показывает рабочий набор памяти наряду с другой полезной информацией. Вы можете <a href="https://microsoftpdc.com/Sessions/WKSP08"><b>посмотреть</b></a> запись презентации Ленди (время – 00:54:26 – 01:50:43) и скачать <a href="https://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers.PDC2009/Windows-7-Developer-Bootcamp-_2D00_-Memory-Management.zip"><b>его презентацию</b></a>.</p>  <p><object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="560" height="312"> <param name="source" value="https://microsoftpdc.com/Skins/PDC09/Styles/players/VideoPlayer2009_03_27.xap" /> <param name="initParams" value="m=https://ss.channel9.msdn.com/pdc/WKSP08High.asx,autostart=false,autohide=true,showembed=true, thumbnail=https://microsoftpdc.com/Skins/PDC09/Styles/images/DefaultPlayerBackground.png, postid=0" /> <param name="background" value="#00FFFFFF" /> <a href="https://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;"> <img src="https://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none" /> </a> </object></p>  <p>После обеда мы рассмотрели программный интерфейс приложения для некоторых элементов пользовательского интерфейса Windows 7. Хайме Родригес (<a href="https://blogs.msdn.com/jaimer/"><b>Jaime Rodriguez</b></a>) начал вторую часть дня с доклада о панели задач Windows 7, показывая различные пути ( применяя неуправляемый и управляемый код, соответственно, используя Window API Code Pack и WPF 4) добавления функциональных возможностей панели задач к вашему приложению. Вы можете <a href="https://ecn.channel9.msdn.com/o9/pdc09/wmvhigh/WKSP08-2.wmv"><b>посмотреть</b></a> запись презентации Хайме (время – 00:00:00 – 00:44:07).</p>  <p>Далее следовал мой доклад с кратким обзором библиотек Windows. Акцент был сделан только на вещах, которые вы должны помнить как разработчики, так как библиотеки иногда могут нарушить работу вашего приложения. Здесь <a href="https://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers.PDC2009/Windows-7-Developer-Bootcamp-_2D00_-Shell-Libraries-Online.zip"><b>презентация библиотеки Windows 7</b></a> и <a href="https://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers.PDC2009/Library-demos.zip"><b>демонстрационный код</b></a>. Вы можете <a href="https://ecn.channel9.msdn.com/o9/pdc09/wmvhigh/WKSP08-2.wmv"><b>посмотреть</b></a> запись презентации (время – 00:44:07 – 01:19:05).</p>  <p>Моя вторая презентация в тот день была о платформе Sensor and Location в Windows 7. Мне нравится эта платформа, поскольку она дает разработчикам возможность научить их приложения реагировать на изменения в окружении компьютера. Демонстрация светового индикатора для оптимизации MSDN Reader и гоночная игра всегда заставляют аудиторию бурно реагировать. Вы можете <a href="https://ecn.channel9.msdn.com/o9/pdc09/wmvhigh/WKSP08-2.wmv"><b>посмотреть</b></a> запись сессии (время – 01:20:04 – 02:10:43) и скачать <a href="https://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers.PDC2009/Windows-7-bootcamp-for-developer-SensorsAndLocation.zip"><b>презентацию</b></a>.</p>  <p>Затем Майкл Онеппо (Michael Oneppo) рассказал об изменениях в графическом стеке Windows 7. Презентация Майкла очень интересная, поскольку она описывает часть программного интерфейса приложения DirectX, перенесенную в Windows 7 как часть <a href="https://support.microsoft.com/kb/971644"><b>обновления платформы для Windows Vista</b></a> и <a href="https://support.microsoft.com/kb/971644"><b>обновления платформы для Windows Server 2008</b></a>. Вы можете <a href="https://ecn.channel9.msdn.com/o9/pdc09/wmvhigh/WKSP08-2.wmv"><b>посмотреть</b></a> запись выступления Майкла (время – 00:00:00 – 00:50:03) и скачать <a href="https://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers.PDC2009/Windows-7-bootcamp-for-developer-SensorsAndLocation.zip"><b>презентацию</b></a>.</p>  <p>Заключительным докладчиком дня был Хайме, рассказавший о поддержке мультисенсорного ввода в Windows 7. Хайме разъяснил понятие мультисенсорного ввода, на примере неуправляемого API, но затем переключился на среду WPF 4.0, поддерживающую одновременные касания. Вы можете <a href="https://ecn.channel9.msdn.com/o9/pdc09/wmvhigh/WKSP08-4.wmv"><b>посмотреть</b></a> видеозапись презентации Хайме (время 00:53:50 – 01:34:37).</p>  <p>Напоследок я хотел бы выразить свою признательность и поблагодарить всех, кто участвовал и помог провести Windows 7 Boot Camp. В первую очередь Хайме Родригесу, сделавшим это мероприятие возможным и помогавшего в его организации, замечательным докладчикам Марку Руссиновичу, Аруну Кишану, Ленди Вонгу, Майклу Онеппо и всей команде PDC. Увидимся на следующем PDC! Я уверен, я буду снова рассказывать о Windows …</p>  <p>Большинство презентаций этого дня основаны на тренировочных курсах Windows 7, доступных в <a href="https://channel9.msdn.com/learn"><b>учебном центре Channel 9</b></a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Windows 7 Test Drive: новый ресурс для разработчиков</title>
      <link>https://docs.microsoft.com/archive/blogs/windev/windows-7-test-drive</link>
      <pubDate>Tue, 29 Dec 2009 11:37:00 GMT</pubDate>
      <dc:creator><![CDATA[Anton Belousov - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/windev/2009/12/29/windows-7-test-drive/</guid>
      <description><![CDATA[Несколько дней назад компания Microsoft запустила сайт Windows 7 TestDrive. Этот сайт дает...]]></description>
      <content:encoded><![CDATA[<p>Несколько дней назад компания Microsoft запустила сайт <a href="https://www.microsoft.com/click/WindowsTestDrive/Dev/"><b>Windows 7 TestDrive</b></a>. Этот сайт дает возможность разработчикам получить из первых рук опыт создания программ под Windows 7, даже если эта операционная система не установлена в их программной среде. Используя сайт Windows 7 TestDrive, вы можете научиться разработке под Windows 7 в виртуальной среде. Подобный опыт предоставляет обзор возможностей Windows 7 с точки зрения разработчика с целью привлечения их к платформе Windows 7.</p>  <p>Идея, лежащая в основе TestDrive-лаборатории, – познакомить разработчиков с процессом создания программ для Windows 7. Это бесплатный инструмент, который вы можете использовать всякий раз, когда не желаете устанавливать специальное программное обеспечение (за исключением ActiveX). Все что вам нужно – это Windows Live ID, несколько свободных часов и сайт Windows 7 Test Drive. Небольшие лабораторные работы со вспомогательными видеороликами дадут вам возможность исследовать особенности Windows 7 без ее установки. Попробуйте уже сегодня выполнить несколько виртуальных лабораторных работ и посмотреть несколько видеороликов, чтобы узнать, как и почему вы должны использовать Windows.</p>  <p><img src="https://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/WIn7_5F00_TestDriveSite_5F00_5C3029FA.png" /></p>  <p>Первая версия Windows 7 Test Drive включает большинство тем из Windows 7 Training Kit, однако содержит не все лабораторные работы. К примеру, Test Drive включает в себя следующие темы:</p>  <ul>   <li>Панель задач (без миниатюр) </li>    <li>Библиотеки </li>    <li>Контроль версии </li>    <li>Проверка версии </li>    <li>Платформа устранения неполадок </li>    <li>Ленточный интерфейс </li>    <li>Платформа Sensor and Location </li>    <li>IE8 </li> </ul>  <p><img src="https://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers/WIn7_5F00_TestDriveSite2_5F00_32D8E1FC.png" /></p>  <p>Этот ресурс наряду с <a href="https://channel9.msdn.com/learn/courses/Windows7/"><b>тренировочными курсами по Windows 7</b></a> в <a href="https://channel9.msdn.com/learn/"><b>учебном центре Channel 9</b></a> является отличным источником информации для разработчиков.</p>]]></content:encoded>
    </item>
    <item>
      <title>Играем в Windows 7</title>
      <link>https://docs.microsoft.com/archive/blogs/windev/windows-7-2</link>
      <pubDate>Tue, 22 Dec 2009 10:19:53 GMT</pubDate>
      <dc:creator><![CDATA[Anton Belousov - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/windev/2009/12/22/windows-7-2/</guid>
      <description><![CDATA[Недавно мы открыли вот такой любопытный сайт https://www.microsoft.com/rus/dino7, на котором можно в...]]></description>
      <content:encoded><![CDATA[<p>Недавно мы открыли вот такой любопытный сайт <a href="https://www.microsoft.com/rus/dino7">https://www.microsoft.com/rus/dino7</a>, на котором можно в шутливой форме не только узнать о новых возможностях Windows 7 и скачать 90-дневную пробную версию продукта, но и поиграть в забавную игру. Будем благодарны, если вы оставите <a href="https://moyopros.ru/Contributor/Survey/c8101b14149f4ec390665447c6eb2386  ">ваше мнение</a> об этом сайте. Нам правда очень интересно знать, как вы оцениваете нашу инициативу.</p>]]></content:encoded>
    </item>
    <item>
      <title>Программируем панель задач Windows 7: панель миниатюр</title>
      <link>https://docs.microsoft.com/archive/blogs/windev/windows-7-10</link>
      <pubDate>Tue, 15 Dec 2009 07:14:00 GMT</pubDate>
      <dc:creator><![CDATA[Anton Belousov - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/windev/2009/12/15/windows-7-10/</guid>
      <description><![CDATA[Пришло время вернуться к привычному описанию Windows 7 API. Мы уже рассмотрели основы...]]></description>
      <content:encoded><![CDATA[<p>Пришло время вернуться к привычному описанию Windows 7 API. Мы уже рассмотрели основы программирования панели задач Windows 7 в статье <a href="https://blogs.msdn.com/windev/archive/2009/06/25/developing-for-the-windows-7-taskbar-application-id.aspx">Разработка для панели задач Windows 7: AppID</a>, а также способы создания списка переходов для своего приложения в статье <a href="https://blogs.msdn.com/windev/archive/2009/07/11/developing-for-the-windows-7-taskbar-jump-into-jump-lists-part-1.aspx">Программируем панель задач Windows 7: списки переходов (ч.1)</a>, <a href="https://blogs.msdn.com/windev/archive/2009/07/12/developing-for-the-windows-7-taskbar-jump-into-jump-lists-part-2.aspx">(ч.2)</a> и <a href="https://blogs.msdn.com/windev/archive/2009/07/13/developing-for-the-windows-7-taskbar-jump-into-jump-lists-part-3.aspx">(ч.3)</a>. В сегодняшней статье мы сосредоточимся на использовании панели миниатюр, которые позволят повысить эффективность работы пользователя.</p>  <p>Чтобы убедиться, что все читатели понимают концепцию, давайте вкратце расскажем о них. Если вы уже знакомы с панелью миниатюр, тогда можете свободно переходить к середине статье, где приведены фрагменты реального кода.</p>  <p>Как сказано выше, панели миниатюр – отличный способ увеличения производительности труда пользователя, позволяющий использовать функции приложения, даже в тех случаях, когда приложение находится в фоне. В частности, с его помощью можно получить доступ к приложению без переключения на него (не делая его активным). Панели миниатюр представляют собой набор, состоящих из семи или менее кнопок, размещенных внизу интерактивной миниатюры на панели задач.</p>  <p>Отличным примером является панель миниатюр Windows Media Player, показанная ниже. Если подвести указатель мыши к иконке Media Player, когда приложение запущено, вы увидите три кнопки на дисплее: Play/Pause, Next и Previous. Нажатие на каждую кнопку выполнит соответствующую команду.</p>  <p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image001" border="0" alt="clip_image001" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/windev/WindowsLiveWriter/DevelopingforWindows7TaskbarThumbnailToo_10478/clip_image001_3.png" original-url="https://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/DevelopingforWindows7TaskbarThumbnailToo_10478/clip_image001_3.png" width="272" height="253" /></p>  <p>Еще одним хорошим примером, о котором мы упоминали несколько недель назад, является приложение <a href="https://windowsteamblog.com/blogs/developers/default.aspx">Fishbowl для Facebook</a>. Это приложение использует панель миниатюр для быстрого доступа к основным функциям, которые выполняет каждый пользователь Facebook. Как видите на следующем снимке экрана, на панели миниатюр Fishbowl пять кнопок (фактически их шесть, но об этом чуть позже).</p>  <p><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="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/windev/WindowsLiveWriter/DevelopingforWindows7TaskbarThumbnailToo_10478/clip_image002_3.png" original-url="https://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/DevelopingforWindows7TaskbarThumbnailToo_10478/clip_image002_3.png" width="472" height="445" /></p>  <p>Теперь, когда мы увидели преимущества новой функции, давайте посмотрим, как можно ее реализовать. Во-первых, несколько основных правил:</p>  <ul>   <li>Можно отобразить до семи кнопок с фиксированным размером в 16x16 пикселей (или в 24x14 пикселей для высокого DPI); </li>    <li>Можно назначить кнопку панели миниатюр для каждого активного окна в приложении (это значит, что в приложении имеется несколько окон, собранных вместе, и вы желаете использовать разные панели миниатюр для каждого из них); </li>    <li>Как только кнопки назначены (как правило, к моменту, когда создана иконка в панели задач), вы более не можете добавлять или удалять кнопки из панели миниатюр; однако, при желании, можно кнопки скрыть. </li> </ul>  <p>Как обычно, начнем с реализации в неуправляемом коде (Win32). Данный пример вы найдете в Windows 7 SDK.</p>  <p>Чтобы добавить кнопку на панель миниатюр, необходимо использовать интерфейс ITaskbarList4, содержащий методы, которые позволят динамически добавлять, удалять и активировать элементы на панели задач. В частности, для работы с панелью миниатюр понадобятся следующие методы:</p>  <ul>   <li><strong>ThumbBarAddButtons</strong> – добавляет панель миниатюр (панель, встроенная в миниатюру окна в панели задач) с указанным набором кнопок к изображению миниатюры окна на панели задач. </li>    <li><strong>ThumbBarSetImageList</strong> – определяет список изображений, который содержит изображения кнопок для панели задач, встроенной в изображение окна на панели задач. </li>    <li><strong>ThumbBarUpdateButtons</strong> – отображает, включает, отключает или скрывает кнопки в панели миниатюр в зависимости от текущего состоянием окна. </li> </ul>  <p>Как в случае с любой иной операцией, предполагающей взаимодействие с иконкой, вы должны убедиться, что у вас есть иконка панели задач; для этого необходимо зарегистрировать &quot;TaskbarCreatedMessage&quot; с помощью метода RegisterWindowMessage. Затем нужно дождаться сообщения для метода WndProc. Как только приложение получит это сообщение, вы можете без опаски идти вперед и создавать кнопки панели миниатюр. Этот же метод WndProc будет получать сообщение WM_COMMAND при нажатии любой из кнопок панели миниатюр, которые вы создали. Младшее слово параметра wParam содержит абсолютный идентификатор кнопки, определяющий, какая именно кнопка была нажата, в то время как старшее слово установлено в THBN_CLICKED. Следующий фрагмент кода иллюстрирует этот процесс:</p>  <div style="overflow: scroll">   <pre class="csharpcode">LRESULT CALLBACK WndProc(

                    HWND hWnd, UINT message,

                    WPARAM wParam, LPARAM lParam)

{

    <span class="kwrd">static</span> UINT s_uTBBC = WM_NULL;


    <span class="kwrd">if</span> (s_uTBBC == WM_NULL)

    {

        <span class="rem">// Вычисляем значение для сообщения TaskbarButtonCreated</span>

        s_uTBBC = RegisterWindowMessage(L<span class="str">&quot;TaskbarButtonCreated&quot;</span>);


        <span class="rem">// Если приложение запущено с привилегиями администратора, разрешаем</span>

        <span class="rem">// TaskbarButtonCreated and WM_COMMAND messages through.</span>

        ChangeWindowMessageFilter(s_uTBBC, MSGFLT_ADD);

        ChangeWindowMessageFilter(WM_COMMAND, MSGFLT_ADD);

    }


    <span class="kwrd">if</span> (message == s_uTBBC) <span class="rem">//wmTaskbarButtonCreated)</span>

    {

        <span class="rem">// Как только получено сообщение TaskbarButtonCreated, мы можем создать</span>

        <span class="rem">// панель миниатюр для окна.</span>

        CreateThumbnailToolbar(hWnd);

    }

    <span class="kwrd">else</span> <span class="kwrd">switch</span> (message)

    {

        <span class="kwrd">case</span> WM_COMMAND:

        {

            <span class="kwrd">int</span> <span class="kwrd">const</span> wmId = LOWORD(wParam);

            <span class="kwrd">switch</span> (wmId)

            {

                <span class="kwrd">case</span> IDTB_BUTTON1:

                <span class="kwrd">case</span> IDTB_BUTTON2:

                <span class="kwrd">case</span> IDTB_BUTTON3:

                {

                    WCHAR szMsg[100];

                    StringCchPrintf(

                            szMsg, ARRAYSIZE(szMsg),

                            L<span class="str">&quot;Thumbnail toolbar button clicked,

                            ID=%d&quot;</span>, wmId);


                    MessageBox(hWnd, szMsg, L<span class="str">&quot;Application&quot;</span>, MB_OK);

                    <span class="kwrd">break</span>;

                }

                <span class="kwrd">case</span> IDM_EXIT:

                    DestroyWindow(hWnd);

                    <span class="kwrd">break</span>;


                <span class="kwrd">default</span>:

                    <span class="kwrd">return</span> DefWindowProc(hWnd, message, wParam, lParam);

            }

            <span class="kwrd">break</span>;

        }

        <span class="kwrd">case</span> WM_DESTROY:

            PostQuitMessage(0);

            <span class="kwrd">break</span>;

        <span class="kwrd">default</span>:

            <span class="kwrd">return</span> DefWindowProc(hWnd, message, wParam, lParam);

    }

    <span class="kwrd">return</span> 0;

}</pre>
  <style type="text/css">


.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; }</style></div>

<p>Обратите внимание, что сразу после регистрации на получение сообщения TaskbarCreatedMessage, вызывается метод ChangeWindowMessageFilter. Этот метод добавляет или удаляет сообщение из фильтра сообщений User Interface Privilege Isolation (UIPI). Это следует делать в том случае, если приложение выполняется с повышенными привилегиями. Одним словом, панель задач является частью процесса explorer.exe, которая выполняется при среднем уровне целостности, то есть от имени стандартного пользователя. Начиная с Windows Vista и включения в ее состав UIPI, приложения с более низким уровнем привилегий не смогут посылать сообщения Windows-приложениям более высокого уровня. Поэтому вы должны изменить фильтр, чтобы разрешить получение определенного типа сообщений от отправителей с более низким уровнем привилегий, в частности, речь идет о результатах TaskbarCreatedMessage и WM_COMMAND. Но это, пожалуй, послужит темой для отдельной статье об UIPI.</p>

<p>Возвращаясь к нашей теме, можно видеть, что WM_COMMAND обрабатывается очень простым способом, извлекая определенный идентификатор кнопки из младшего слова параметра wParam. На самом деле, с ним мы ничего не делаем (переключатель – один и тот же для всех кнопок); это всего лишь пример.</p>

<p>Теперь поговорим о том, как зарегистрировать панель миниатюр. В вышеприведенном фрагменте кода мы вызываем вспомогательный метод CreateThumbnailToolbar. Фрагмент кода будет выглядеть так:</p>

<div style="overflow: scroll">
  <pre class="csharpcode">HRESULT CreateThumbnailToolbar(HWND hWnd)

{

    ITaskbarList4 *pTaskbarList;

    HRESULT hr = CoCreateInstance(

                    CLSID_TaskbarList,

                    NULL,

                    CLSCTX_INPROC_SERVER,

                    IID_PPV_ARGS(&amp;pTaskbarList));


    <span class="kwrd">if</span> (SUCCEEDED(hr))

    {

        hr = pTaskbarList-&gt;HrInit();

        <span class="kwrd">if</span> (SUCCEEDED(hr))

        {

            <span class="rem">// Определяем, какое изображение использовать</span>

            <span class="rem">// для кнопок панели миниатюр – наше решение</span>

            <span class="rem">// основано на минимальном системном размере иконки.</span>

            <span class="rem">// Это позволит сделать их дружелюбными к DPI.</span>

            <span class="kwrd">struct</span>

            {

                PCWSTR pbmp;

                <span class="kwrd">int</span> cx;

            }

            <span class="kwrd">const</span> bitmaps[3] =

            {

                { MAKEINTRESOURCE(IDB_BUTTONIMAGES_96),  16 },

                { MAKEINTRESOURCE(IDB_BUTTONIMAGES_120), 20 },

                { MAKEINTRESOURCE(IDB_BUTTONIMAGES_144), 24 }

            };


            <span class="kwrd">int</span> <span class="kwrd">const</span> cxButton = GetSystemMetrics(SM_CXSMICON);


            <span class="kwrd">int</span> iButtons = 0;

            <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 0; i &lt; ARRAYSIZE(bitmaps); i++)

            {

                <span class="kwrd">if</span> (bitmaps[i].cx &lt;= cxButton)

                {

                    iButtons = i;

                }

            }


            HIMAGELIST himl = ImageList_LoadImage(

                    g_hInstance,

                    bitmaps[iButtons].pbmp,

                    bitmaps[iButtons].cx,

                    0,

                    RGB(255,0,255),

                    IMAGE_BITMAP,

                    LR_CREATEDIBSECTION);


            <span class="kwrd">if</span> (himl)

            {

                hr = pTaskbarList-&gt;ThumbBarSetImageList(hWnd, himl);

                <span class="kwrd">if</span> (SUCCEEDED(hr))

                {

                    THUMBBUTTON buttons[3] = {};


                    <span class="rem">// Первая кнопка</span>

                    buttons[0].dwMask = THB_BITMAP | THB_TOOLTIP | THB_FLAGS;

                    buttons[0].dwFlags = THBF_ENABLED | THBF_DISMISSONCLICK;

                    buttons[0].iId = IDTB_BUTTON1;

                    buttons[0].iBitmap = 0;

                    StringCchCopy(buttons[0].szTip,

                                    ARRAYSIZE(buttons[0].szTip), L<span class="str">&quot;Button 1&quot;</span>);


                    <span class="rem">// Вторая кнопка</span>

                    buttons[1].dwMask = THB_BITMAP | THB_TOOLTIP | THB_FLAGS;

                    buttons[1].dwFlags = THBF_ENABLED | THBF_DISMISSONCLICK;

                    buttons[1].iId = IDTB_BUTTON2;

                    buttons[1].iBitmap = 1;

                    StringCchCopy(buttons[1].szTip,

                                    ARRAYSIZE(buttons[1].szTip), L<span class="str">&quot;Button 2&quot;</span>);


                    <span class="rem">// Третья кнопка</span>

                    buttons[2].dwMask = THB_BITMAP | THB_TOOLTIP | THB_FLAGS;

                    buttons[2].dwFlags = THBF_ENABLED | THBF_DISMISSONCLICK;

                    buttons[2].iId = IDTB_BUTTON3;

                    buttons[2].iBitmap = 2;

                    StringCchCopy(buttons[2].szTip,

                                    ARRAYSIZE(buttons[2].szTip), L<span class="str">&quot;Button 3&quot;</span>);


                    <span class="rem">// Размещаем кнопки на панели миниатюр</span>

                    hr = pTaskbarList-&gt;ThumbBarAddButtons(

                                            hWnd,

                                            ARRAYSIZE(buttons),

                                            buttons);

                }

                ImageList_Destroy(himl);

            }

        }

                pTaskbarList-&gt;Release();

    }

    <span class="kwrd">return</span> hr;

}</pre>
  <style type="text/css">


.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; }</style></div>

<p>Во-первых, необходимо создать COM-интерфейс ITasbarList4. Затем следует вызвать HrInit для инициализации объекта списка Taskbar. Этот метод должен быть вызван перед любыми другими вызываемыми методами ITaskbarList. Далее выбираем список изображений, с которым будем работать. Обратите внимание, что необходимо проверить ширину (в пикселях) маленькой иконки на соответствие рекомендуемому: настройки DPI могут изменить ее. И наконец, вызываем ThumbBarSetImageList, чтобы назначить иконки кнопкам. После загрузки исходного кода попытайтесь закомментировать эту строку и запустить приложение. Как вы думаете, что произойдет?</p>

<p>Далее, мы создаем массив из трех кнопок THUMBBUTTON и для каждой устанавливаем растровое изображение, всплывающую подсказку и флаги. Они используются для настройки кнопки панели миниатюр. Например, значение Bitmap указывает, что значение поля iBitmap (часть THUMBBUTTON) доступно. THB_FLAGS более интересен, поскольку его можно использовать для определения состояния и поведения кнопки – включена, выключена или скрыта. В SDK вы можете найти дополнительную информацию по теме. Мы также устанавливаем ID кнопки для того, чтобы различать нажатия на разные кнопки; этот идентификатор отправляется с сообщением WM_COMMAND.</p>

<p>Наконец, мы вызываем метод ThumbBarAddButtons, чтобы передать текущий параметр hWnd и массив кнопок. Он регистрирует панель миниатюр. Таким образом, в следующий раз, когда вы наведете курсор мыши на иконку приложения на панели задач, вы увидите три цветных кнопки как показано на следующем изображении.</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/windev/WindowsLiveWriter/DevelopingforWindows7TaskbarThumbnailToo_10478/clip_image003_2.png" original-url="https://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/DevelopingforWindows7TaskbarThumbnailToo_10478/clip_image003_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image003" border="0" alt="clip_image003" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/windev/WindowsLiveWriter/DevelopingforWindows7TaskbarThumbnailToo_10478/clip_image003_thumb.png" original-url="https://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/DevelopingforWindows7TaskbarThumbnailToo_10478/clip_image003_thumb.png" width="256" height="245" /></a></p>

<p>Вы можете использовать Windows API Code Pack, чтобы создать панели миниатюр для приложения на управляемом коде. Собственно, об этом подробно рассказано в <a href="https://channel9.msdn.com/learn/courses/Windows7/">Windows 7 Training Kit</a>, который доступен в <a href="https://channel9.msdn.com/learn/">учебном центре Channel 9</a>. Демо-приложение, созданное Хайме Родригесом (<a href="https://blogs.msdn.com/jaimer/">Jaime Rodriguez</a>), является WPF-приложением, которое демонстрирует все мельчайшие особенности новой панели задач. Мы лишь изучим лишь часть, касаемую панели миниатюр, остальное оставим для вашего самостоятельного изучения. Время от времени мы будем использовать это как основу для наших примеров на управляемом коде.</p>

<p>Как всегда, используя Windows API Code Pack, вам не стоит переживать о регистрации или обработке любых сообщений Windows. Только используйте TaskbarManager. В частности, если вы хотите работать с ThumbnailToolbars, который содержит метод AddButtons, который необходим для добавления объектов ThumbnailToolbarButton. ThumbnailToolbarButton представляет кнопку миниатюры панели задач, через которую вы можете включить или отключить кнопку панели задач, изменить ее значок или подсказку, и управлять ее видимостью. Вы можете также прикрепить обработчик событий к событию кнопки Click, что вполне соответствует ожиданиям разработчиков управляемого кода. Вы можете найти следующий фрагмент кода в файле ToolbarButtons.xaml.cs. Он показывает, насколько просто добавить панель миниатюр в приложение на управляемом коде:</p>

<div style="overflow: scroll">
  <p><span class="kwrd">private</span> <span class="kwrd">void</span> CreateToolbarButtons() 

    <br />

    <br />{ 

    <br />

    <br />&#160;&#160;&#160; buttonFirst = <span class="kwrd">new</span> ThumbnailToolbarButton( 

    <br />

    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TaskbarConcepts.Resources.first, <span class="str">&quot;First Image&quot;</span>); 

    <br />

    <br />&#160;&#160;&#160; buttonFirst.Enabled = <span class="kwrd">false</span>; 

    <br />

    <br />&#160;&#160;&#160; buttonFirst.Click += buttonFirst_Click; 

    <br />

    <br />

    <br />&#160;&#160;&#160; buttonPrevious = <span class="kwrd">new</span> ThumbnailToolbarButton( 

    <br />

    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TaskbarConcepts.Resources.prevArrow, <span class="str">&quot;Previous Image&quot;</span>); 

    <br />

    <br />&#160;&#160;&#160; buttonPrevious.Enabled = <span class="kwrd">false</span>; 

    <br />

    <br />&#160;&#160;&#160; buttonPrevious.Click += buttonPrevious_Click; 

    <br />

    <br />

    <br />&#160;&#160;&#160; buttonNext = <span class="kwrd">new</span> ThumbnailToolbarButton( 

    <br />

    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TaskbarConcepts.Resources.nextArrow, <span class="str">&quot;Next Image&quot;</span>); 

    <br />

    <br />&#160;&#160;&#160; buttonNext.Click += buttonNext_Click; 

    <br />

    <br />

    <br />&#160;&#160;&#160; buttonLast = <span class="kwrd">new</span> ThumbnailToolbarButton( 

    <br />

    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TaskbarConcepts.Resources.last, <span class="str">&quot;Last Image&quot;</span>); 

    <br />

    <br />&#160;&#160;&#160; buttonLast.Click += buttonLast_Click; 

    <br />

    <br />

    <br />&#160;&#160;&#160; TaskbarManager.Instance.ThumbnailToolbars.AddButtons 

    <br />

    <br />&#160;&#160;&#160; ( 

    <br />

    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span class="kwrd">new</span> WindowInteropHelper(Application.Current.MainWindow).Handle, 

    <br />

    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; buttonFirst, 

    <br />

    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; buttonPrevious, 

    <br />

    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; buttonNext,&#160;&#160;&#160; <br />

    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; buttonLast 

    <br />

    <br />&#160;&#160;&#160; ); 

    <br />

    <br />} 

    <br /></p>
  <style type="text/css">


.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; }</style></div>

<p>Остальная часть кода в этом файле отвечает за логику и обработку различных событий. Это дает возможность управлять различными изображениями, отображаемыми в главном приложении:</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/windev/WindowsLiveWriter/DevelopingforWindows7TaskbarThumbnailToo_10478/clip_image004_2.png" original-url="https://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/DevelopingforWindows7TaskbarThumbnailToo_10478/clip_image004_2.png"><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="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/windev/WindowsLiveWriter/DevelopingforWindows7TaskbarThumbnailToo_10478/clip_image004_thumb.png" original-url="https://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/DevelopingforWindows7TaskbarThumbnailToo_10478/clip_image004_thumb.png" width="640" height="407" /></a></p>

<p>Надеюсь, что к настоящему моменту вы успели оценить преимущества включения панели миниатюр и поняли, что ее довольно просто реализовать.</p>

<p>Теперь попытаюсь объяснить, почему в панели миниатюр приложения Fishbowl шесть кнопок, а не пять (см. изображение выше). Если вы внимательно посмотрите на изображение, то обратите внимание, что четыре левых кнопки непосредственно влияют на поведение приложения, а единственная правая кнопка просто запускает браузер по умолчанию и автоматически загружает сайт Facebook. Поэтому имеет смысл использовать графический разграничитель между двумя наборами кнопок. Приложение создает шесть кнопок, но пятая кнопка скрыта, что создает иллюзию разделения кнопок. В Win32-приложениях для этого следует использовать ThumbBarUpdateButtons.</p>

<p>Разработчик управляемого кода увидит, что для сокрытия кнопки гораздо проще использовать ThubmnailButton. Тщательно изучив Windows API Code Pack, вы обнаружите, что класс ThubmnailButton имеет свойство Visible для управления видимостью конкретной кнопки панели. В конце раздела Visible Set вы найдете функцию UpdateThumbnailButton(), которая является оберткой для неуправляемого метода ThumbBarUpdateButtons.</p>

<p><a href="https://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers.CodeSamples/NativeTaskbarThumbnailToolbar.zip">Загрузить пример на неуправляемом коде (Win32) &gt;&gt;&gt;</a></p>

<p><a href="https://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers.CodeSamples/ManagedTaskbarConcepts_5F00_Solution.zip">Загрузить пример на управляемом коде (WPF) &gt;&gt;&gt;</a></p>

<p>Обучающие материалы по разработке для <a href="https://channel9.msdn.com/learn/courses/Windows7/">панели задач Windows 7</a> вы можете найти в <a href="https://channel9.msdn.com/learn/">учебном центре Channel 9</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Разрабатываем вместе с Windows API Code Pack для Microsoft .NET Framework</title>
      <link>https://docs.microsoft.com/archive/blogs/windev/windows-api-code-pack-microsoft-ne</link>
      <pubDate>Wed, 02 Dec 2009 11:37:00 GMT</pubDate>
      <dc:creator><![CDATA[Anton Belousov - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/windev/2009/12/02/windows-api-code-pack-microsoft-ne/</guid>
      <description><![CDATA[В ходе PDC мы анонсировали доступность новой версии Windows API Code Pack (версии 1.0.1). В тот же...]]></description>
      <content:encoded><![CDATA[<p>В ходе PDC мы <a href="https://blogs.msdn.com/windev/archive/2009/11/20/new-windows-api-code-pack-version.aspx"><b>анонсировали</b></a> доступность новой версии Windows API Code Pack (версии 1.0.1). В тот же день я имел удовольствие демонстрировать, как использовать Windows API Code Pack для разработки приложений под Windows 7. Если вы пропустили эту сессию (или вообще пропустили PDC), вы можете загрузить <a href="https://microsoftpdc.com/Sessions/CL12"><b>запись сессии</b></a> со страницы загрузки.</p>  <p>И хотя Windows 7 является превосходной операционной системой, более быстрой и менее требовательной к ресурсам, чем ее предшественница, в ней присутствует целый ряд новых функций и возможностей, которыми могут насладиться и пользователи, и разработчики. Новая панель задач, платформы Sensor and Location, библиотеки, мультисенсорный ввод, новые возможности DirectX и визуальные улучшения – это лишь некоторые из технологий и функций Windows 7, которые новая ОС дает разработчикам, чтобы те могли заставить свои приложения сиять в Windows 7.</p>  <p>Список приложений, которые используют различные технологии Windows 7, слишком велик, чтобы все их перечислить, но есть ряд популярных приложений, которые мы продемонстрировали в ходе PDC: iTunes, Kindle, Autodesk Project Cooper и Seesmic Desktop.</p>  <p>И хотя не все из перечисленных приложений используют API Code Pack (некоторые из них и вовсе написаны на неуправляемом коде), все они используют возможности Windows 7 для улучшения удобства пользователя. Windows API Code Pack позволяет разработчикам управляемого кода реализовать преимущества этих функций и создавать великолепные приложения. В ходе сессии я продемонстрировал несколько примеров приложений на управляемом коде, которые используют возможности Windows 7:</p>  <ul>   <li>Fishbowl for Facebook является отличным примером поразительных возможностей новой панели задач (видео 00:05:02 – 00:07:41); </li>    <li>Photo View (AKA XP2Win7) является другим примером приложения, демонстрирующего большое количество новых функций Windows 7; </li>    <li>Kindle for PC представляет собой Windows-версию Amazon Kindle, которую вы сможете загрузить сегодня. В частности, я показал интеграцию с панелью задач и поддержку мультисенсорного ввода. </li> </ul>  <p>Теперь углубимся в примеры использования Windows API Code Pack. Для каждого приложения я включил программный код:</p>  <ul>   <li><a href="https://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers.CodeSamples/PDCJumpLists.zip"><b>Jump Lists Demo</b></a> – простое WinForm-приложение, демонстрирующее основные возможности использования Taskbar API и, в частности, списках переходов (00:26:30 – 00:34:27); </li>    <li>Zoobar (<a href="https://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers.CodeSamples/Zoobar.part1.rar"><b>часть 1</b></a> и <a href="https://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers.CodeSamples/Zoobar.part2.rar"><b>часть 2</b></a>) – немного более функциональное WPF-приложение, которое демонстрирует, как панель задач может быть использована для того чтобы показывать больше окон и документов. Это приложение использует ряд таких элементов управления панели задач, как например многослойный иконки, прогресс-бары, миниатюры и.т.д (00:35:15 – 00:40:50); </li>    <li><a href="https://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers.CodeSamples/PDCLibraryManager.zip"><b>Library Manager</b></a> – один из примеров, используемых в тренировочном курсе Windows 7. В нем продемонстрированы все API-методы, которые Windows Shell API использует для работы с библиотеками (00:43:04 – 00:42:27); </li>    <li><a href="https://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers.CodeSamples/PDCMSDNReader.zip"><b>MSDN Reader</b></a> – WPF-приложение, которое использует датчик освещенности для управления отображением информации. MSDN Reader показывает статьи из MSDN, в основном текст с рисунками. Когда используется датчик освещения, приложение может менять размер шрифта и контрастность для улучшения читаемости текста (00:50:14 – 00:51:36); </li>    <li>Racing Game – отличная XNA-игра, в которой вы с помощью акселлерометра, измеряющего силу тяжести и определяющего положение устройство по отношению к земле, можете управлять красной машинкой. Пример весьма прост и показателен (00:51:55 – 00:57:15); </li>    <li>Сессия вопросов и ответов (01:00:24 – 01:07:32) </li> </ul>  <p>Вы можете загрузить <a href="https://https://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/developers.CodeSamples/CL12_5F00_Kiriaty_5F00_v03_5F00_online.zip">дополнительные материалы</a>, включая заметки выступающего, и <a href="https://microsoftpdc.com/Sessions/CL12">просмотреть видео</a>.</p>  <p>Дополнительную информацию о вышеупомянутых технологиях и разработке под Windows 7 вы можете почерпнуть из <a href="https://www.microsoft.com/downloads/details.aspx?familyid=1C333F06-FADB-4D93-9C80-402621C600E7&amp;displaylang=en"><b>Windows 7 Training Kit</b></a> или <a href="https://channel9.msdn.com/windows"><b>видео на канале Channel 9</b></a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Fishbowl для Facebook с использованием новой панели задач Windows 7</title>
      <link>https://docs.microsoft.com/archive/blogs/windev/fishbowl-facebook-1</link>
      <pubDate>Thu, 26 Nov 2009 03:09:06 GMT</pubDate>
      <dc:creator><![CDATA[Anton Belousov - MSFT]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/windev/2009/11/26/fishbowl-facebook-1/</guid>
      <description><![CDATA[Во время выступления в прошлую среду на конференции PDC 2009 Брайан Голдфарб (Brian Goldfarb)...]]></description>
      <content:encoded><![CDATA[<p>Во время выступления в прошлую среду на конференции PDC 2009 Брайан Голдфарб (Brian Goldfarb) продемонстрировал отличное клиентское приложение для Facebook на базе Silverlight 4. Помимо своего удивительного внешнего вида, демо-приложение Silverlight 4 представляет собой готовое решение клиент для настольных систем Windows (и Mac). В ходе выступления также был анонсирован SilverFace, который тоже создан на базе Silverlight 4. Если вы захотите получить приятно выглядящее приложение для работы с Facebook прямо на рабочем столе Windows, вам следует взглянуть на <a href="https://www.fishbowlclient.com/"><b>Fishbowl Preview for Facebook</b></a>. Fishbowl – это отличное WPF-приложение, которое можно установить и использовать, и в то же время – это хороший образец кода, по которому можно научиться создавать WPF-приложения с использованием функций Windows 7. Если эта тема вам интересна, вы можете загрузить <a href="https://fishbowl.codeplex.com/"><b>исходные коды Fishbowl</b></a>.</p>  <p>Сегодня удобство работы является более важным, чем когда-либо. Ваше приложение должно быть не просто забавным и интересным: оно должно быть красивым, отшлифованным и функциональным, а также обеспечивать удобство работы. Как разработчику вам нужно выйти за границы возможного и использовать любой доступный технический инструмент, который предоставляет вам ОС, или любые другие средства (если установка выполнена на мобильном устройстве) для обеспечения максимально удобства работы, в ином случае пользователь может переключиться на что-то другое. В таких сценариях использование панели задач Windows 7 с целью экономии несколько секунд в каждодневных задачах выглядит весьма очевидным выбором.</p>  <p>И демо-приложение на Silverlight 4, и Fishbowl имеют прекрасных механизм взаимодействия с пользователем и увеличивают производительность. Скотт Гатри (Scott Guthrie) также анонсировал <a href="https://msdn.microsoft.com/windows/ee388574.aspx"><b>Facebook SDK</b></a> для приложений на управляемом коде, сочетающий в себе последние инновации в веб- и клиентской платформах с ведущими социальными технологиями (службами) с целью помочь разработчикам влиться в Facebook. Кроме того, что Fishbowl является примером использования Facebook SDK и обладает удобным интерфейсом, приложение является отличным примером использования WPF (версии 3.5), который показывает, как нужно создавать приложения, блистающие в Windows 7.</p>  <p>И как любое WPF-приложение, Fishbowl работает на нескольких версиях Windows, включая Windows XP, Windows Vista и Windows 7, при этом оно интегрируется в панель задач Windows 7 и поддерживает технологию мультисенсорного ввода. Одной из идей, лежащих в основе новой панели задач, является предоставление пользователям быстрого и простого доступа к контенту, помощь в выполнении задач и быстром перемещении между открытыми окнами. Так, к примеру, списки переходов являются отличным инструментом для решения рабочих вопросов и задач. Если у вас есть задача, которая выполняется один или два раза в день, с помощью двух-трех щелчков, ничего страшного. Однако если у вас есть задачи, которые приходится выполнять 10, 20 или даже более раз в день, списки переходов сэкономят массу времени. Пользователи Facebook часто проверяют свои доски, пишут сообщения, просматривают картинки друзей и так далее. Поэтому в некоторых сценариях списки переходов, значки уведомлений, миниатюры и другие функциональные возможности становятся основными инструментами в приложении.</p>  <p>Fishbowl использует панель задач, чтобы обеспечить быструю, простую и четкую интеграцию с функциональностью Facebook прямо из панели задач. Давайте рассмотрим некоторые функциональные возможности приложения перед тем, как перейти к рассмотрению кода.</p>  <p>Панель задач Fishbowl позволяет выполнить несколько задач еще до запуска приложения. Вы можете перейти на страницу Facebook.com или сразу прыгнуть к своей доске, просмотреть фотографии друга и многое другое, как показано на следующем изображении:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/windev/WindowsLiveWriter/FishbowlforFacebookUsingtheWindows7Taskb_C6C0/clip_image002_2.jpg" original-url="https://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/FishbowlforFacebookUsingtheWindows7Taskb_C6C0/clip_image002_2.jpg"><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="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/windev/WindowsLiveWriter/FishbowlforFacebookUsingtheWindows7Taskb_C6C0/clip_image002_thumb.jpg" original-url="https://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/FishbowlforFacebookUsingtheWindows7Taskb_C6C0/clip_image002_thumb.jpg" width="267" height="255" /></a></p>  <p>Одной из удивительных возможностей Fishbowl для Facebook является то, что функциональность изменяется в зависимости от различных режимов приложения. Возможность по-разному использовать панель задач в различных сценариях открывает совершенно новые горизонты.</p>  <p>Когда Fishbowl работает в обычном режиме, список переходов на панели задач отображает объекты и задачи, которые можно выполнять в рамках запущенного приложения, как, например, просмотр последних уведомлений и сообщений, не открывая приложение:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/windev/WindowsLiveWriter/FishbowlforFacebookUsingtheWindows7Taskb_C6C0/clip_image004_2.gif" original-url="https://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/FishbowlforFacebookUsingtheWindows7Taskb_C6C0/clip_image004_2.gif"><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="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/windev/WindowsLiveWriter/FishbowlforFacebookUsingtheWindows7Taskb_C6C0/clip_image004_thumb.gif" original-url="https://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/FishbowlforFacebookUsingtheWindows7Taskb_C6C0/clip_image004_thumb.gif" width="270" height="434" /></a></p>  <p>При наведении указателя мыши на иконку Fishbowl вы увидите панель миниатюр, из которой можно просмотреть миниатюру открытого окна и выполнить ряд действий:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/windev/WindowsLiveWriter/FishbowlforFacebookUsingtheWindows7Taskb_C6C0/clip_image006_2.jpg" original-url="https://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/FishbowlforFacebookUsingtheWindows7Taskb_C6C0/clip_image006_2.jpg"><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="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/windev/WindowsLiveWriter/FishbowlforFacebookUsingtheWindows7Taskb_C6C0/clip_image006_thumb.jpg" original-url="https://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/FishbowlforFacebookUsingtheWindows7Taskb_C6C0/clip_image006_thumb.jpg" width="476" height="449" /></a></p>  <p>В Fishbowl также предусмотрен мини-режим. В нем приложение показывает в небольшом окне всего одно сообщение. Как вы можете видеть на следующем рисунке, небольшая стрелка позволяет переключаться между сообщениями. При наведении курсора на значок Fishbowl в панели задач вы увидите миниатюру, при этом вы сможете контролировать приложение с помощью панели миниатюр.</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/windev/WindowsLiveWriter/FishbowlforFacebookUsingtheWindows7Taskb_C6C0/clip_image008_2.jpg" original-url="https://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/FishbowlforFacebookUsingtheWindows7Taskb_C6C0/clip_image008_2.jpg"><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="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/windev/WindowsLiveWriter/FishbowlforFacebookUsingtheWindows7Taskb_C6C0/clip_image008_thumb.jpg" original-url="https://blogs.msdn.com/blogfiles/windev/WindowsLiveWriter/FishbowlforFacebookUsingtheWindows7Taskb_C6C0/clip_image008_thumb.jpg" width="549" height="451" /></a></p>  <p>Кроме отличной интеграции в панель задач, Fishbowl оставляет приятные впечатления от наличия мультисенсорного ввода, позволяющего пролистывать сообщения с помощью пальцев. К сожалению, очень непросто проиллюстрировать сенсорные возможности приложения с помощью снимков экрана, поэтому вам придется поверить мне на слово.</p>  <p>Мы рассмотрели большинство уникальных возможностей Fishbowl для Windows 7, а в следующей статье мы поговорим об API, которые позволили реализовать мультисенсорный интерфейс. Если вас заинтересовало приложение, вы можете загрузить исходные коды для Fishbowl <a href="https://fishbowl.codeplex.com/"><b>отсюда</b></a>.</p>]]></content:encoded>
    </item>
  </channel>
</rss>