<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Jim O'Neil's Blog</title><link>http://blogs.msdn.com/jimoneil/default.aspx</link><description>Supporting the Northeast development community</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>SharePoint 2010 Experience: Dec 2nd and 3rd</title><link>http://blogs.msdn.com/jimoneil/archive/2009/11/23/sharepoint-2010-experience-dec-2nd-and-3rd.aspx</link><pubDate>Tue, 24 Nov 2009 01:38:42 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9927662</guid><dc:creator>joneil</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jimoneil/comments/9927662.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jimoneil/commentrss.aspx?PostID=9927662</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://sharepoint2010.microsoft.com/Pages/default.aspx"&gt;&lt;img style="border-right-width: 0px; margin: 0px 25px 5px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="SharePoint 2010" border="0" alt="SharePoint 2010" align="left" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/SharePoint2010ExperienceDec2ndand3rd_1224F/ShrPt10_v_rgb_r_3.png" width="175" height="102" /&gt;&lt;/a&gt; One of the highlights at &lt;a href="http://microsoftpdc.com/"&gt;PDC 09&lt;/a&gt; was the availability of the &lt;a href="http://sharepoint2010.microsoft.com/Pages/default.aspx"&gt;SharePoint 2010 Beta&lt;/a&gt;.&amp;#160; Coming on the heels of that announcement is a great opportunity for the SharePoint community in the greater Boston area.&lt;/p&gt;  &lt;p&gt;Microsoft is a Platinum Sponsor of the upcoming &lt;a href="http://gilbaneboston.com/"&gt;Gilbane Boston Conference&lt;/a&gt; at the &lt;a href="http://www.starwoodhotels.com/westin/property/overview/index.html?propertyID=1035"&gt;Westin Copley&lt;/a&gt; in Boston on December 2nd and 3rd.&amp;#160; As part of this event, you can get a &lt;a href="https://register03.exgenex.com/GcmRegister/Index.Aspx?C=60000003&amp;amp;M=50000165"&gt;FREE Technology Showcase Pass&lt;/a&gt;, which includes access to the &lt;em&gt;SharePoint 2010 Experience.&lt;/em&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;The &lt;em&gt;SharePoint 2010 Experience&lt;/em&gt; provides a hands-on opportunity to walk though, learn, and understand the new content management capabilities of SharePoint 2010. If you stop by, you’ll have a chance to win a &lt;a href="http://www.microsoft.com/hardware/mouseandkeyboard/productdetails.aspx?pid=112"&gt;Microsoft Arc Mouse&lt;/a&gt; and up to $500 in American Express Gift Cards!&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p align="center"&gt;&lt;a href="https://register03.exgenex.com/GcmRegister/Index.Aspx?C=60000003&amp;amp;M=50000165"&gt;Register for the FREE Technology Showcase Pass.&lt;/a&gt;&lt;/p&gt;    &lt;p align="center"&gt;&lt;a href="http://gilbaneboston.com/registration_information.html"&gt;Register for the full conference and workshops.&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9927662" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jimoneil/archive/tags/SharePoint/default.aspx">SharePoint</category></item><item><title>Bring a Friend, Get a Book</title><link>http://blogs.msdn.com/jimoneil/archive/2009/11/23/bring-a-friend-get-a-book.aspx</link><pubDate>Mon, 23 Nov 2009 05:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9926600</guid><dc:creator>joneil</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jimoneil/comments/9926600.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jimoneil/commentrss.aspx?PostID=9926600</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://channel9.msdn.com/northeast"&gt;&lt;img style="border-right-width: 0px; margin: 0px 0px 0px 5px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Northeast Roadshow" border="0" alt="Northeast Roadshow" align="right" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/BringaFrienDGetaBook_FBD3/n_east_roadshow_120x120_3.png" width="120" height="120" /&gt;&lt;/a&gt; As you know, Chris and I are in the middle of our &lt;a href="http://blogs.msdn.com/cbowen/archive/2009/10/13/northeast-msdn-roadshow-don-t-fear-the-coder-tour.aspx"&gt;Fall/Winter 2009 Northeast Roadshow&lt;/a&gt;, with four more stops scheduled for early December:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032429333&amp;amp;Culture=en-US"&gt;December 3 - Farmington, CT&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032429334&amp;amp;Culture=en-US"&gt;December 8 - Waltham, MA&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032429335&amp;amp;Culture=en-US"&gt;December 9 - Providence, RI&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032429336&amp;amp;Culture=en-US"&gt;December 15 - Augusta, ME&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Now there’s even more incentive to attend!&amp;#160; In addition to the &lt;a href="http://blogs.msdn.com/jimoneil/archive/2009/11/16/northeast-roadshow-3-down-4-to-go.aspx"&gt;WIN7 code referenced in my previous blog post&lt;/a&gt;, we’re incorporating a “Bring a friend, get a book” promotion for the rest of our venues (&lt;a href="http://blogs.msdn.com/jimoneil/archive/2009/10/30/east-coast-roadshow-series.aspx"&gt;our colleagues down the East coast&lt;/a&gt; are doing the same, by the way).&amp;#160; Here’s how to take advantage of the offer:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Follow the registration link above for the desired venue      &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;For the referral code, enter the name of the friend you’re bringing along, OR if you’ve already registered, have your friend enter your name when she or he registers (see below).      &lt;br /&gt;      &lt;p&gt;&amp;#160;&lt;/p&gt;      &lt;p&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Referral Code" border="0" alt="Referral Code" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/BringaFrienDGetaBook_FBD3/image_3.png" width="482" height="199" /&gt;&amp;#160;&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;When you check-in at the event, we’ll hand each of you a copy of Laurence Moroney’s &lt;a href="http://www.amazon.com/Introducing-Microsoft%C2%AE-Silverlight-Pro-Developer/dp/0735625735%3FSubscriptionId%3D0Z0Q13DZSCWFMWZJ1H82%26tag%3Dsilverlight-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0735625735"&gt;&lt;em&gt;Introducing Microsoft Silverlight 3&lt;/em&gt;&lt;/a&gt;. &lt;/li&gt; &lt;/ol&gt;  &lt;hr align="center" width="80%" /&gt;  &lt;p&gt;Obligatory Fine Print:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font size="1"&gt;Government employees are not eligible for promotion&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font size="1"&gt;Both parties must be present to win&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font size="1"&gt;If onsite supply runs out, books will be mailed to recipients&lt;/font&gt; &lt;/li&gt; &lt;/ul&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9926600" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Northeast+Roadshow/default.aspx">Northeast Roadshow</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Connecticut/default.aspx">Connecticut</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Maine/default.aspx">Maine</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Massachusetts/default.aspx">Massachusetts</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Rhode+Island/default.aspx">Rhode Island</category></item><item><title>Azure IT PAC Tour</title><link>http://blogs.msdn.com/jimoneil/archive/2009/11/22/azure-it-pac-tour.aspx</link><pubDate>Mon, 23 Nov 2009 01:16:05 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9927057</guid><dc:creator>joneil</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jimoneil/comments/9927057.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jimoneil/commentrss.aspx?PostID=9927057</wfw:commentRss><description>&lt;p&gt;One of the more popular exhibits on the Big Room floor at &lt;a href="http://microsoftpdc.com"&gt;PDC 09&lt;/a&gt; was the Azure IT PAC (Pre-assembled Container).&amp;#160; The IT PAC is the unit of deployment within Azure Data Centers, such as those in San Antonio and Chicago now, and those planning to open in 2010 in Dublin, Amsterdam, Singapore and Hong Kong.&amp;#160; The specific unit at PDC was an outdoor, &lt;a href="http://blogs.technet.com/msdatacenters/archive/2009/04/29/designing-generation-4-0-data-centers-the-engineers-approach-to-solving-business-challenges.aspx"&gt;Generation 4&lt;/a&gt; model (as opposed to the older indoor units currently deployed in Chicago and San Antonio).&lt;/p&gt;  &lt;p&gt;Check out the short video of the IT PAC I shot at PDC, after a quick tour from some of the Microsoft guys behind their deployment. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="512" height="384"&gt; &lt;param name="source" value="http://channel9.msdn.com/App_Themes/default/vp09_10_20.xap" /&gt; &lt;param name="initParams" value="deferredLoad=true,duration=0,m=http://ecn.channel9.msdn.com/o9/ch9/8/0/2/8/0/5/ITPAC_2MB_ch9.wmv,autostart=false,autohide=true,showembed=true, thumbnail=http://ecn.channel9.msdn.com/o9/ch9/8/0/2/8/0/5/ITPAC_512_ch9.png" /&gt; &lt;param name="background" value="#00FFFFFF" /&gt; &lt;a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;"&gt; &lt;img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none" /&gt; &lt;/a&gt; &lt;/object&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Adjacent to the IT PAC at PDC was a short, professional-quality video playing that showed how the unit is put together from the ground up.&amp;#160; I’m told that video should appear shortly at &lt;a href="http://www.microsoft.com/video/en/us/default.aspx"&gt;Microsoft Showcase&lt;/a&gt;, joining the &lt;a href="http://www.microsoft.com/video/en/us/details/36db4da6-8777-431e-aefb-316ccbb63e4e"&gt;concept video available&lt;/a&gt; there now, so check back within the next week or so for that.&lt;/p&gt;  &lt;p&gt;Lastly, Ina Fried has a great &lt;a href="http://news.cnet.com/2300-1001_3-10001898-1.html?tag=mncol"&gt;series of photos at the CNET site&lt;/a&gt; of the same container at PDC (clearly I need to upgrade from my &lt;a href="http://reviews.cnet.com/digital-camcorders/sony-nsc-gc1/4505-6500_7-32510287.html"&gt;Sony NSC-GC1&lt;/a&gt;!).&amp;#160; Also check out her &lt;a href="http://news.cnet.com/8301-13860_3-10371840-56.html?tag=rtcol;txt"&gt;recent coverage of the Chicago data center&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9927057" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jimoneil/archive/tags/PDC/default.aspx">PDC</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Azure/default.aspx">Azure</category></item><item><title>PDC: Pretty Darn Cool!</title><link>http://blogs.msdn.com/jimoneil/archive/2009/11/21/pdc-pretty-darn-cool.aspx</link><pubDate>Sat, 21 Nov 2009 18:18:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9926777</guid><dc:creator>joneil</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jimoneil/comments/9926777.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jimoneil/commentrss.aspx?PostID=9926777</wfw:commentRss><description>&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="PDC" border="0" alt="PDC" align="right" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/PDCPrettyDarnCool_BB43/11-21-2009%2012-38-03%20PM_3.gif" width="136" height="186" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;I got back from &lt;a href="http://microsoftpdc.com"&gt;PDC&lt;/a&gt; yesterday and have managed to (mostly) make up for my sleep deficit.&amp;#160; Undoubtedly you’ve heard by now some of the major announcements at the conference (including the &lt;a href="http://channel9.msdn.com/posts/LarryLarsen/The-Great-PDC-Laptop-Give-Away-of-2009/"&gt;free multi-touch laptop&lt;/a&gt; that all the paying attendees received!):&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://silverlight.net/getstarted/silverlight-4-beta/"&gt;Silverlight 4&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://www.microsoft.com/windowsazure/"&gt;Windows Azure availability&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://www.microsoft.com/windowsazure/developers/dallas/"&gt;“Dallas”&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://www.microsoft.com/office/2010/en/default.aspx?WT.srch=1&amp;amp;WT.mc_id=FDC76082-09CC-47FF-9ABD-1E0ED70C6A94"&gt;Office 2010 Beta&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;If you haven’t already, be sure to listen to the two keynotes (&lt;a href="http://microsoftpdc.com/Sessions/KEY01"&gt;Day 1&lt;/a&gt; and &lt;a href="http://microsoftpdc.com/Sessions/KEY02"&gt;Day 2&lt;/a&gt;) to see how far things have come since PDC 08 (as well as where we’re headed).&amp;#160; The sessions are also &lt;a href="http://microsoftpdc.com/Videos"&gt;available on demand&lt;/a&gt;, so you can experience all of the content from the comfort of your own living room as well!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9926777" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/PDC/default.aspx">PDC</category></item><item><title>Northeast Roadshow: 3 Down, 4 to Go</title><link>http://blogs.msdn.com/jimoneil/archive/2009/11/16/northeast-roadshow-3-down-4-to-go.aspx</link><pubDate>Tue, 17 Nov 2009 00:52:58 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9923297</guid><dc:creator>joneil</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jimoneil/comments/9923297.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jimoneil/commentrss.aspx?PostID=9923297</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/cbowen/archive/2009/10/13/northeast-msdn-roadshow-don-t-fear-the-coder-tour.aspx"&gt;&lt;img style="border-right-width: 0px; margin: 0px 10px 0px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="n_east_roadshow_120x120" border="0" alt="n_east_roadshow_120x120" align="left" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/NortheastRoadshow3Down4toGo_ED68/n_east_roadshow_120x120_3.png" width="120" height="120" /&gt;&lt;/a&gt; Thanks to the folks in Burlington, Vermont, and Troy and Rochester, New York, for coming to the latest edition of the &lt;a href="http://blogs.msdn.com/cbowen/archive/2009/10/13/northeast-msdn-roadshow-don-t-fear-the-coder-tour.aspx"&gt;Northeast Roadshow&lt;/a&gt; last week.&amp;#160; Given the timing (&lt;a href="http://microsoftpdc.com"&gt;PDC&lt;/a&gt; this week and the Thanksgiving holiday next week), Chris and I are on a short break before we resume the series on December 3rd.&amp;#160; There’s still room at all the remaining venues, AND we’ve got a special deal for you:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;If you’re among the first seven at each venue to register with the code &lt;strong&gt;WIN7&lt;/strong&gt;, we’ll hand you a copy of the &lt;/em&gt;&lt;a href="http://www.amazon.com/MCTS-Self-Paced-Training-Exam-70-536/dp/0735626197"&gt;&lt;em&gt;MCTS Self-Paced Training Kit (Exam 70-536) Microsoft .NET Framework Application Development Foundation, Second edition&lt;/em&gt;&lt;/a&gt;&lt;em&gt; at the event!&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Given what I heard just today -- and PDC hasn’t officially started yet -- we’ll have a lot to talk about at the upcoming venues (I’m already contemplating a few updates to my presentations and demos!).&amp;#160; You can get the full &lt;a href="http://blogs.msdn.com/cbowen/archive/2009/10/13/northeast-msdn-roadshow-don-t-fear-the-coder-tour.aspx"&gt;agenda here&lt;/a&gt;, but the topics we’ll be discussing include&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;WCF &lt;/li&gt;    &lt;li&gt;Model-View-ViewModel with Silverlight and Expression Blend &lt;/li&gt;    &lt;li&gt;Avenues to get technical help on Microsoft technologies &lt;/li&gt;    &lt;li&gt;LINQ fundamentals &lt;/li&gt;    &lt;li&gt;ASP.NET Web Forms and Ajax &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Register at the links below – looking forward to seeing you there!&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032429333&amp;amp;Culture=en-US"&gt;December 3 - Farmington, CT&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032429334&amp;amp;Culture=en-US"&gt;December 8 - Waltham, MA&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032429335&amp;amp;Culture=en-US"&gt;December 9 - Providence, RI&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032429336&amp;amp;Culture=en-US"&gt;December 15 - Augusta, ME&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9923297" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Northeast+Roadshow/default.aspx">Northeast Roadshow</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Connecticut/default.aspx">Connecticut</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Maine/default.aspx">Maine</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Massachusetts/default.aspx">Massachusetts</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Rhode+Island/default.aspx">Rhode Island</category></item><item><title>NEW! Boston Business Intelligence User Group</title><link>http://blogs.msdn.com/jimoneil/archive/2009/11/16/new-boston-business-intelligence-user-group.aspx</link><pubDate>Mon, 16 Nov 2009 22:52:18 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9923223</guid><dc:creator>joneil</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jimoneil/comments/9923223.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jimoneil/commentrss.aspx?PostID=9923223</wfw:commentRss><description>&lt;p&gt;&lt;img style="border-right-width: 0px; margin: 5px 15px 5px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Boston Business Intelligence User Group" border="0" alt="Boston Business Intelligence User Group" align="left" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/NEWBostonBusinessIntelligenceUserGroup_D121/image_5.png" width="138" height="59" /&gt;I have yet another new user group to announce!&amp;#160; The &lt;a href="http://bostonbi.org"&gt;Boston Business Intelligence User Group&lt;/a&gt; – starts meeting TOMORROW, Tuesday, November 17th, at 6:30 p.m. at the Microsoft Office on Jones Road in Waltham.&amp;#160; Thanks go out to Slava Kokaev, a familiar face in the local developer and BI community, for the initiative to establish and lead the group.&amp;#160; &lt;/p&gt;  &lt;p&gt;Here’s the group’s charter, shamelessly lifted from the &lt;a href="http://bostonbi.org"&gt;group’s website&lt;/a&gt;:&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="500"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="10"&gt;&lt;img style="margin: 0px 15px 0px 0px" title="" border="0" alt="" align="left" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/NashuaGetsAgile_C3DC/320px-Left_pointing_double_angle_quotation_mark_sh1_svg_3.png" width="33" height="36" /&gt;&lt;/td&gt;        &lt;td valign="top" width="455"&gt;&lt;strong&gt;Welcome to BOSTON BUSINESS INTELLIGENCE User Group.&lt;/strong&gt;           &lt;br /&gt;We have regular face-to-face with hands-on meetings including guest speakers. We located in the Greater Boston area. We meet first 3 Tuesday's of each month. This is a &lt;strong&gt;FREE&lt;/strong&gt; study group for everyone interested in learning the latest Microsoft Business Intelligence Platform technology and tools and Languages as well as Client Side Data Analysis Applications. &lt;/td&gt;        &lt;td valign="bottom" width="33"&gt;&lt;img style="margin: 0px; display: inline" title="" border="0" alt="" align="right" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/NashuaGetsAgile_C3DC/320px-Right_pointing_double_angle_quotation_mark_sh1_svg_3.png" width="33" height="36" /&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;To kick off the group, &lt;a href="http://blogs.pragmaticworks.com/Brian_Knight/"&gt;Brian Knight&lt;/a&gt;, SQL Server MVP and BI specialist, will present a remote Live Meeting session on an introduction to Business Intelligence.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9923223" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jimoneil/archive/tags/User+Group/default.aspx">User Group</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Massachusetts/default.aspx">Massachusetts</category></item><item><title>PHP Elite Web Optimization Event – Dec. 9th</title><link>http://blogs.msdn.com/jimoneil/archive/2009/11/16/php-elite-web-optimization-event-dec-9th.aspx</link><pubDate>Mon, 16 Nov 2009 13:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9922652</guid><dc:creator>joneil</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jimoneil/comments/9922652.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jimoneil/commentrss.aspx?PostID=9922652</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://www.navisite.com"&gt;&lt;img style="border-right-width: 0px; margin: 5px 0px 5px 15px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="NaviSite" border="0" alt="NaviSite" align="right" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/PHPEliteWebOptimizationEventDec.9th_B509/image_3.png" width="139" height="55" /&gt;&lt;/a&gt; Microsoft and &lt;a href="http://navisite.com/"&gt;NaviSite&lt;/a&gt; are co-hosting a free event at the &lt;a href="http://microsoftcambridge.com"&gt;New England Research and Development (NERD) Center&lt;/a&gt; in Cambridge on December 9th, from 10 to 6.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; margin: 10px 15px 5px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="php-med-trans" border="0" alt="php-med-trans" align="left" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/PHPEliteWebOptimizationEventDec.9th_B509/php-med-trans_3.png" width="95" height="51" /&gt; During the day, you’ll get to hear about what’s new in the Microsoft Web Platform, including IIS, PHP on Windows,&amp;#160; the &lt;a href="http://www.microsoft.com/web/downloads/platform.aspx"&gt;Web Platform Installer&lt;/a&gt;, and development and design tools like &lt;a href="http://msdn.microsoft.com/en-us/vstudio/default.aspx"&gt;Visual Studio&lt;/a&gt; and &lt;a href="http://www.microsoft.com/expression/"&gt;Expression Studio&lt;/a&gt;.&amp;#160; NaviSite will also discuss their various hosting options and their involvement with the &lt;a href="http://websitespark.com"&gt;WebsiteSpark&lt;/a&gt; program.&lt;/p&gt;  &lt;p&gt;You can register for the event at &lt;a title="http://microsoftandnavisite.eventbrite.com/" href="http://microsoftandnavisite.eventbrite.com/"&gt;http://microsoftandnavisite.eventbrite.com/&lt;/a&gt;.&amp;#160; All attendees will be entered into a drawing to win one of the following:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Copy of Windows 7 &lt;/li&gt;    &lt;li&gt;XBox 360 Elite &lt;/li&gt;    &lt;li&gt;Zune HD &lt;/li&gt;    &lt;li&gt;8GB Zune &lt;/li&gt;    &lt;li&gt;FREE NaviSite Managed Hosting for 60 days &lt;/li&gt; &lt;/ul&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9922652" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jimoneil/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Web+Platform/default.aspx">Web Platform</category></item><item><title>Not at PDC?</title><link>http://blogs.msdn.com/jimoneil/archive/2009/11/15/not-at-pdc.aspx</link><pubDate>Sun, 15 Nov 2009 18:28:16 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9922656</guid><dc:creator>joneil</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jimoneil/comments/9922656.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jimoneil/commentrss.aspx?PostID=9922656</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://microsoftpdc.com"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="PDC" border="0" alt="PDC" align="right" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/NotatPDC_BD6F/image_3.png" width="240" height="67" /&gt;&lt;/a&gt; I’m waiting for my last load in the dryer, so I can finish packing for my first &lt;a href="http://microsoftpdc.com/"&gt;PDC&lt;/a&gt;, in Los Angeles beginning tomorrow.&amp;#160; If you’re going to be there as well, hopefully we’ll catch each other among the other thousands of folks that will be there taking part in the workshops, 160+ technical sessions, Birds of a Feather discussions, hands-on labs, and other special events.&lt;/p&gt;  &lt;p&gt;If you’re not going to LA though, you can still be part of the buzz and excitement happening there.&amp;#160; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://microsoftpdc.com"&gt;Watch the two keynotes&lt;/a&gt; via Silverlight smooth-streaming from the comfort of your own office (or get a group of folks together over lunch).&amp;#160; Both keynotes begin at 11:30 Eastern time. &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;Day 1, November 17th, Ray Ozzie and Bob Muglia &lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;Day 2, November 18th, Scott Guthrie, Kurt DelBene, and ???&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://microsoftpdc.com/WhatsHappening/First-Time-Ever-Channel-9-to-Broadcast-LIVE-from-PDC09"&gt;Channel 9 will be broadcasting live&lt;/a&gt; (and unscripted) from the PDC Big Room each of the three days (beginning around 1:30 EST).&amp;#160; They’ll be interviewing presenters and attendees alike, and you can help drive the conversation by submitting your tweets to @ch9live. &lt;/li&gt; &lt;/ul&gt;  &lt;ul&gt;   &lt;li&gt;Check out the &lt;a href="http://www.notatpdc.com/"&gt;Not@PDC&lt;/a&gt; site.&amp;#160; There’s nothing there at the moment I’m writing this post, but last year quite a few presentations were made available BY non-attendees FOR non-attendees.&amp;#160; You can follow their twitter feed as well via the hashtag #notatpdc &lt;/li&gt; &lt;/ul&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9922656" width="1" height="1"&gt;</description></item><item><title>Getting Up to Speed With .NET 4.0</title><link>http://blogs.msdn.com/jimoneil/archive/2009/11/08/getting-up-to-speed-with-net-4-0.aspx</link><pubDate>Sun, 08 Nov 2009 17:59:30 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9919263</guid><dc:creator>joneil</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jimoneil/comments/9919263.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jimoneil/commentrss.aspx?PostID=9919263</wfw:commentRss><description>&lt;table border="0" cellspacing="0" cellpadding="2" width="100%"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="middle" width="250" align="center"&gt;&lt;a href="http://www.microsoft.com/visualstudio/en-us/products/2010/default.mspx"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Visual Studio 2010" border="0" alt="Visual Studio 2010" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/GettingUptoSpeedWith.NET4.0_B610/VS2010_v_rgb_r_3.png" width="219" height="67" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign="bottom" width="250" align="center"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title=".NET Framework 4" border="0" alt=".NET Framework 4" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/GettingUptoSpeedWith.NET4.0_B610/NET-Frmwrk_h_rgb_r_3.png" width="176" height="56" /&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;   &lt;br /&gt;You’re probably aware that the Beta 2 release of &lt;a href="http://www.microsoft.com/visualstudio/en-us/products/2010/default.mspx"&gt;Visual Studio 2010 and .NET 4.0&lt;/a&gt; became available a couple of weeks ago.&amp;#160; Did you know there’s a “Go Live” license?&amp;#160; … you can build and deploy your application even before Visual Studio 2010 is released next March.&amp;#160; &lt;/p&gt;  &lt;p&gt;That’s even more reason to not delay and get a head start diving into the new features and technologies.&amp;#160; Our friends at &lt;a href="http://www.develop.com/"&gt;DevelopMentor&lt;/a&gt; are hosting a free series of .NET 4.0 Webcasts in the coming weeks, including the following: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Introducing MVC        &lt;br /&gt;&lt;/strong&gt;Presenter: Brock Allen       &lt;br /&gt;Thursday November 12th, 12 noon- &lt;a href="http://bit.ly/intromvc"&gt;Register Here&lt;/a&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Building Modern Websites in ASP.NET Webforms&lt;/strong&gt;       &lt;br /&gt;Presenter: Michael Kennedy       &lt;br /&gt;Monday November 23rd, 12 noon - &lt;a href="http://bit.ly/aspwebforms"&gt;Register Here&lt;/a&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Meet The New Workflow: WF4        &lt;br /&gt;&lt;/strong&gt;Presenter: Maurice De Beijer       &lt;br /&gt;Tuesday December 1st, 12 noon - &lt;a href="http://bit.ly/meetwf4"&gt;Register Here&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;   &lt;br /&gt;Don’t forget too the &lt;a href="http://channel9.msdn.com/shows/10-4/"&gt;10-4 series on Channel 9&lt;/a&gt;, with 35 episodes thus far presenting overviews of specific new features that are coming with the new release of Visual Studio.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9919263" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item><item><title>Troy (NY &amp; area): Beware of Geeks Bearing Gifts</title><link>http://blogs.msdn.com/jimoneil/archive/2009/11/05/troy-ny-area-beware-of-geeks-bearing-gifts.aspx</link><pubDate>Thu, 05 Nov 2009 20:55:47 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9918236</guid><dc:creator>joneil</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jimoneil/comments/9918236.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jimoneil/commentrss.aspx?PostID=9918236</wfw:commentRss><description>&lt;p&gt;It’s going to be a busy week in the capital area of New York next week, and a great time to get knee deep in all things technical!&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; margin: 0px 0px 0px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Trojan Horse" border="0" alt="Trojan Horse" align="right" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/TroyNYareaBewareofGeeksBearingGifts_DFFA/image_3.png" width="160" height="240" /&gt; &lt;a href="http://www.techvalleycodecamp.com/"&gt;&lt;strong&gt;Tech Valley Code Camp&lt;/strong&gt;&lt;/a&gt; – Saturday, Nov. 7th at &lt;a href="http://www.techvalleycodecamp.com/Home/Directions"&gt;SUNY Albany&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;There’s 20 sessions and over 100 signed up thus far!&amp;#160; I hope to see you there as I deliver my “7 on 7” spiel.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://www.tvug.net/"&gt;&lt;strong&gt;Tech Valley User Group&lt;/strong&gt;&lt;/a&gt; – Tuesday, Nov. 10th at &lt;a href="http://www.bing.com/maps/#JnE9eXAuNCtCcml0aXNoK0FtZXJpY2FuK0JsdmQrTGF0aGFtJTJjK05ZKzEyMTEwJTdlc3N0LjAlN2VwZy4xJmJiPTU3LjE4MzkwMTg1ODMxMTklN2UtMzUuOTQ3MjY1NjI1JTdlMjIuOTk4ODUxNTk0MTQyOSU3ZS0xMDYuMzQ3NjU2MjU="&gt;VersaTrans in Latham&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;For the group’s monthly meeting, Rob Fisch, Director of Global Technology at &lt;a href="http://www.kaz.com/"&gt;Kaz, Inc&lt;/a&gt;, is speaking on &lt;em&gt;Getting Started with Reporting Services&lt;/em&gt;.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032429331&amp;amp;Culture=en-US"&gt;&lt;strong&gt;Northeast Roadshow&lt;/strong&gt;&lt;/a&gt; – Thursday, Nov. 12th at &lt;a href="http://blogs.msdn.com/jimoneil/pages/rpi-troy-ny.aspx"&gt;RPI&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Chris and I are bringing you the “Don’t Fear the Coder” tour with topics including Silverlight and MVVM, ASP.NET, LINQ, and WCF.&amp;#160; (We’re taking the show to &lt;a href="http://blogs.msdn.com/jimoneil/archive/2009/10/30/east-coast-roadshow-series.aspx"&gt;six other venues&lt;/a&gt; as well!)&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9918236" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jimoneil/archive/tags/New+York/default.aspx">New York</category><category domain="http://blogs.msdn.com/jimoneil/archive/tags/User+Group/default.aspx">User Group</category></item><item><title>Bringing the Cloud Down to Earth</title><link>http://blogs.msdn.com/jimoneil/archive/2009/11/02/bringing-the-cloud-down-to-earth.aspx</link><pubDate>Mon, 02 Nov 2009 19:35:39 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9916325</guid><dc:creator>joneil</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jimoneil/comments/9916325.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jimoneil/commentrss.aspx?PostID=9916325</wfw:commentRss><description>&lt;p&gt;With all the talk about &lt;a href="http://azure.com"&gt;Windows Azure&lt;/a&gt; and hosting your application in the “cloud”, it’s easy to forget that somewhere there’s a computer, or perhaps thousands, that are actually running your application.&lt;/p&gt;  &lt;p&gt;There’s a &lt;a href="http://news.cnet.com/8301-13860_3-10371840-56.html?tag=rtcol;txt"&gt;fascinating write-up&lt;/a&gt; and &lt;a href="http://news.cnet.com/2300-10805_3-10001679-1.html?tag=mncol"&gt;photo series&lt;/a&gt; on CNET about the new Microsoft data center in Chicago.&amp;#160; Here are some of the cool facts I lifted from the article (with some help from &lt;a href="http://www.wolframalpha.com/"&gt;Wolfram Alpha&lt;/a&gt;) followed by a video interview featuring Daniel Costello and Christian Belady of Microsoft.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;700,000 sq. ft. – 20% larger than the base of the &lt;a href="http://en.wikipedia.org/wiki/Great_Pyramid_of_Giza"&gt;Great Pyramid of Giza&lt;/a&gt;, or roughly &lt;a href="http://ezinearticles.com/?Standard-Soccer-Field-Size&amp;amp;id=1314515"&gt;11 soccer fields&lt;/a&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;30 megawatts of capacity – that’s over 40000 horses, enough to power up to 10,000 American homes (but still only 1/400th of the power of generated at a &lt;a href="http://www.kennedyspacecenter.com/events-launches.aspx"&gt;Space Shuttle launch&lt;/a&gt;!)       &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;7.5 miles of piping for cooling (via chilled water) – the length of which exceeds both the highest (&lt;a href="http://www.panoramas.dk/fullscreen2/full22.html"&gt;Mount Everest&lt;/a&gt;) and lowest points on the earth (&lt;a href="http://en.wikipedia.org/wiki/Challenger_Deep"&gt;The Challenger Deep&lt;/a&gt; in the &lt;a href="http://www.marianatrench.com/"&gt;Mariana Trench&lt;/a&gt;). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p align="center"&gt;&lt;object width="364" height="280"&gt;&lt;param name="movie" value="http://www.cnet.com/av/video/flv/universalPlayer/universalSmall.swf" /&gt;&lt;param name="wmode" value="transparent" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="FlashVars" value="playerType=embedded&amp;amp;type=id&amp;amp;value=50077986" /&gt;&lt;embed src="http://www.cnet.com/av/video/flv/universalPlayer/universalSmall.swf" type="application/x-shockwave-flash" wmode="transparent" width="364" height="280" allowFullScreen="true" FlashVars="playerType=embedded&amp;type=id&amp;value=50077986" /&gt;&lt;/object&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9916325" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Azure/default.aspx">Azure</category></item><item><title>East Coast Roadshow Series</title><link>http://blogs.msdn.com/jimoneil/archive/2009/10/30/east-coast-roadshow-series.aspx</link><pubDate>Fri, 30 Oct 2009 16:33:24 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9915346</guid><dc:creator>joneil</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jimoneil/comments/9915346.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jimoneil/commentrss.aspx?PostID=9915346</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://tinyurl.com/NortheastRoadshow"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Thanks to my New York Metro colleague, &lt;a href="http://blogs.msdn.com/peterlau"&gt;Peter Laudati&lt;/a&gt;, for pulling all of these events together in one place.&amp;#160; While &lt;a href="http://blogs.msdn.com/cbowen"&gt;Chris&lt;/a&gt; and I are rather partial to the &lt;a href="http://blogs.msdn.com/cbowen/archive/2009/10/13/northeast-msdn-roadshow-don-t-fear-the-coder-tour.aspx"&gt;Northeast Roadshow&lt;/a&gt; :), we realize a number of you prefer the warmer climes this time of year, and so we wanted you to be aware of all great work being done up and down the East coast.&amp;#160; &lt;/p&gt;  &lt;p&gt;Across the board, this is a pretty amazing opportunity for deep technical content -and, of course, unique brands of humor courtesy of your local developer evangelist(a)s.&amp;#160; For the price of FREE, it’s definitely a few of your hours of your day well spent.&lt;/p&gt;  &lt;p&gt;Note, &lt;a href="http://microsoftpdc.com/"&gt;PDC&lt;/a&gt; is happening in the middle of our series (say hi to Chris and me if you’re coming to LA), so we are primed for last minute updates at our December talks as well!&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Psst…&lt;/em&gt; &lt;a href="http://msdnevents.com/"&gt;register&lt;/a&gt; with the code &lt;strong&gt;WIN7&lt;/strong&gt; and you may receive one of seven free copies of the &lt;a href="http://www.amazon.com/MCTS-Self-Paced-Training-Exam-70-536/dp/tags-on-product/0735626197"&gt;MCTS Self-Paced Training Kit (Exam 70-536): Microsoft .NET Framework Application Development Foundation&lt;/a&gt;.       &lt;br /&gt;      &lt;br /&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;hr width="90%" /&gt;  &lt;table border="0" cellspacing="4" cellpadding="4" width="100%"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="135"&gt;&lt;a href="http://channel9.msdn.com/northeast"&gt;&lt;img title="n_east_roadshow_120x120" border="0" alt="n_east_roadshow_120x120" src="http://blogs.msdn.com/blogfiles/peterlau/WindowsLiveWriter/MSDNRoadshowscomingtoanEastCoastcitynear_9174/n_east_roadshow_120x120_3.png" width="120" height="120" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="365"&gt;         &lt;p&gt;&lt;a href="http://blogs.msdn.com/cbowen/archive/2009/10/13/northeast-msdn-roadshow-don-t-fear-the-coder-tour.aspx"&gt;MSDN Northeast Roadshow: ”Don’t Fear the Coder”&lt;/a&gt;             &lt;br /&gt;Piloted by &lt;a href="http://blogs.msdn.com/cbowen/"&gt;Chris Bowen&lt;/a&gt; &amp;amp; &lt;a href="http://blogs.msdn.com/jimoneil/"&gt;Jim O’Neil&lt;/a&gt; &lt;/p&gt;          &lt;p&gt;Cities &amp;amp; Dates: &lt;/p&gt;          &lt;ul&gt;           &lt;li&gt;11/10/2009 – &lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032429327&amp;amp;Culture=en-US"&gt;Burlington, VT&lt;/a&gt; &lt;/li&gt;            &lt;li&gt;11/12/2009 – &lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032429331&amp;amp;Culture=en-US"&gt;Troy, NY&lt;/a&gt; &lt;/li&gt;            &lt;li&gt;11/13/2009 – &lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032429332&amp;amp;Culture=en-US"&gt;Rochester, NY&lt;/a&gt; &lt;/li&gt;            &lt;li&gt;12/3/2009 – &lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032429333&amp;amp;Culture=en-US"&gt;Farmington, CT&lt;/a&gt; &lt;/li&gt;            &lt;li&gt;12/8/2009 – &lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032429334&amp;amp;Culture=en-US"&gt;Waltham, MA&lt;/a&gt; &lt;/li&gt;            &lt;li&gt;12/9/2009 – &lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032429335&amp;amp;Culture=en-US"&gt;Providence, RI&lt;/a&gt; &lt;/li&gt;            &lt;li&gt;12/15/2009 – &lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032429336&amp;amp;Culture=en-US"&gt;Augusta, ME&lt;/a&gt; &lt;/li&gt;         &lt;/ul&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="135"&gt;&lt;a href="http://blogs.msdn.com/peterlau/archive/2009/10/19/msdn-metro-roadshow-fall-2009-series.aspx"&gt;&lt;img title="metro_roadshow_120x120" border="0" alt="metro_roadshow_120x120" src="http://blogs.msdn.com/blogfiles/peterlau/WindowsLiveWriter/MSDNRoadshowscomingtoanEastCoastcitynear_9174/metro_roadshow_120x120_3.png" width="120" height="120" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="365"&gt;         &lt;p&gt;&lt;a href="http://blogs.msdn.com/peterlau/archive/2009/10/19/msdn-metro-roadshow-fall-2009-series.aspx"&gt;MSDN Metro Roadshow&lt;/a&gt;             &lt;br /&gt;Piloted by &lt;a href="http://www.peterlaudati.com"&gt;Peter Laudati&lt;/a&gt; &amp;amp; &lt;a href="http://www.slingalibi.com/"&gt;Asli Bilgin&lt;/a&gt;             &lt;br /&gt;&lt;/p&gt;          &lt;p&gt;Cities &amp;amp; Dates: &lt;/p&gt;          &lt;ul&gt;           &lt;li&gt;11/12/2009 – Parsippany, NJ &lt;/li&gt;            &lt;li&gt;12/10/2009 – East Windsor, NJ &lt;/li&gt;            &lt;li&gt;12/15/2009 – New York, NY &lt;/li&gt;         &lt;/ul&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="135"&gt;&lt;a href="http://code.msdn.microsoft.com/MidAtlantic"&gt;&lt;img title="mid_atl_roadshow_120x120" border="0" alt="mid_atl_roadshow_120x120" src="http://blogs.msdn.com/blogfiles/peterlau/WindowsLiveWriter/MSDNRoadshowscomingtoanEastCoastcitynear_9174/mid_atl_roadshow_120x120_3.png" width="120" height="120" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="365"&gt;         &lt;p&gt;&lt;a href="http://code.msdn.microsoft.com/MidAtlantic "&gt;MSDN Mid-Atlantic Roadshow&lt;/a&gt;             &lt;br /&gt;Piloted by &lt;a href="http://blogs.msdn.com/gduthie"&gt;G. Andrew Duthie&lt;/a&gt;, &lt;a href="http://www.smallandmighty.net/"&gt;Dani Diaz&lt;/a&gt;, and             &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;a href="http://coolstuffwith.net/"&gt;Dave Isbitski&lt;/a&gt;             &lt;br /&gt;&lt;/p&gt;          &lt;p&gt;Cities &amp;amp; Dates: &lt;/p&gt;          &lt;ul&gt;           &lt;li&gt;11/12/2009 – Pittsburgh, Pa &lt;/li&gt;            &lt;li&gt;12/1/2009 – Harrisburg, Pa &lt;/li&gt;            &lt;li&gt;12/3/2009 – Reston, Va &lt;/li&gt;            &lt;li&gt;12/8/2009 – Roanoke, Va &lt;/li&gt;            &lt;li&gt;12/10/2009 – Malvern, Pa &lt;/li&gt;         &lt;/ul&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="135"&gt;&lt;a href="http://tinyurl.com/SouthernFried"&gt;&lt;img title="s_fried_roadshow_120x120" border="0" alt="s_fried_roadshow_120x120" src="http://blogs.msdn.com/blogfiles/peterlau/WindowsLiveWriter/MSDNRoadshowscomingtoanEastCoastcitynear_9174/s_fried_roadshow_120x120_3.png" width="120" height="120" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="365"&gt;         &lt;p&gt;&lt;a href="http://tinyurl.com/SouthernFried "&gt;MSDN Southern Fried Roadshow&lt;/a&gt;             &lt;br /&gt;Piloted by &lt;a href="http://www.structuretoobig.com/home/"&gt;Brian Hitney&lt;/a&gt; &amp;amp; &lt;a href="http://blogs.msdn.com/glengordon/"&gt;Glen Gordon&lt;/a&gt;             &lt;br /&gt;&lt;/p&gt;          &lt;p&gt;Cities &amp;amp; Dates: &lt;/p&gt;          &lt;ul&gt;           &lt;li&gt;11/4/2009 – Greensboro, NC &lt;/li&gt;            &lt;li&gt;11/5/2009 – Raleigh, NC &lt;/li&gt;            &lt;li&gt;11/6/2009 – Columbia, SC &lt;/li&gt;            &lt;li&gt;12/8/2009 – Atlanta, GA &lt;/li&gt;            &lt;li&gt;12/9/2009 – Montgomery, AL &lt;/li&gt;         &lt;/ul&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="135"&gt;&lt;a href="http://www.devfish.net/fullblogitemview.aspx?blogid=709"&gt;&lt;img title="tiki_roadshow_120x120" border="0" alt="tiki_roadshow_120x120" src="http://blogs.msdn.com/blogfiles/peterlau/WindowsLiveWriter/MSDNRoadshowscomingtoanEastCoastcitynear_9174/tiki_roadshow_120x120_3.png" width="120" height="120" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="365"&gt;         &lt;p&gt;&lt;a href="http://www.devfish.net/fullblogitemview.aspx?blogid=709"&gt;MSDN Tiki Hut Roadshow&lt;/a&gt;             &lt;br /&gt;Piloted by &lt;a href="http://www.devfish.net/"&gt;Joe Healy&lt;/a&gt; &amp;amp; &lt;a href="http://blogs.msdn.com/rfustino/"&gt;Russ Fustino&lt;/a&gt;             &lt;br /&gt;&lt;/p&gt;          &lt;p&gt;Cities &amp;amp; Dates: &lt;/p&gt;          &lt;ul&gt;           &lt;li&gt;11/30/2009 – Tampa, FL &lt;/li&gt;            &lt;li&gt;12/2/2009 – Fort Lauderdale, FL &lt;/li&gt;            &lt;li&gt;12/14/2009 – Orlando, FL &lt;/li&gt;         &lt;/ul&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;   &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/peterlau/archive/2009/10/19/msdn-metro-roadshow-fall-2009-series.aspx"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://code.msdn.microsoft.com/MidAtlantic"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://tinyurl.com/SouthernFried"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.devfish.net/fullblogitemview.aspx?blogid=709"&gt;&amp;#160;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9915346" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Northeast+Roadshow/default.aspx">Northeast Roadshow</category></item><item><title>7 on 7: The Index</title><link>http://blogs.msdn.com/jimoneil/archive/2009/10/30/7-on-7-the-index.aspx</link><pubDate>Fri, 30 Oct 2009 11:07:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9913124</guid><dc:creator>joneil</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jimoneil/comments/9913124.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jimoneil/commentrss.aspx?PostID=9913124</wfw:commentRss><description>&lt;p&gt;Here’s a one-stop shopping spot for the 7 on 7 blog series from the past week (each image leads to a post on a specific technology).&amp;#160; Hopefully, the series has given you great ideas on how to start leveraging the new Windows 7 features in your own applications.&amp;#160; And if you’re doing something especially cool with Windows 7, drop me a line; I’d love to hear about it.&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/jimoneil/archive/2009/10/22/7-on-7.aspx"&gt;&lt;strong&gt;7 on 7 Intro Post&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/jimoneil/archive/2009/10/17/code-camp-12-7-on-7-resources.aspx"&gt;&lt;strong&gt;7 on 7 Code Camp Presentation Links&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="0" width="100%"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="67"&gt;&lt;a href="http://blogs.msdn.com/jimoneil/archive/2009/10/23/7-on-7-windows-xp-mode.aspx"&gt;&lt;img style="display: inline" title="XP Mode" border="0" alt="XP Mode" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7XPMode_7EB/image_12.png" width="63" height="79" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="67"&gt;&lt;a href="http://blogs.msdn.com/jimoneil/archive/2009/10/24/7-on-7-taskbar.aspx"&gt;&lt;img style="display: inline" title="Taskbar" border="0" alt="Taskbar" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7Taskbar_12C75/image_8.png" width="63" height="79" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="67"&gt;&lt;a href="http://blogs.msdn.com/jimoneil/archive/2009/10/25/7-on-7-federated-search.aspx"&gt;&lt;img style="display: inline" title="Federated Search" border="0" alt="Federated Search" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7ON7FederatedSearch_14072/image_3.png" width="63" height="79" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="67"&gt;&lt;a href="http://blogs.msdn.com/jimoneil/archive/2009/10/26/7-on-7-extended-linguistic-services.aspx"&gt;&lt;img style="display: inline" title="Extended Linguistic Services" border="0" alt="Extended Linguistic Services" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7ExtendedLinquisticServices_A989/image_3.png" width="63" height="79" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="67"&gt;&lt;a href="http://blogs.msdn.com/jimoneil/archive/2009/10/27/7-on-7-direct2d-and-directwrite.aspx"&gt;&lt;img style="display: inline" title="Direct2D and DirectWrite" border="0" alt="Direct2D and DirectWrite" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7Direct2DandDirectWrite_37B/image_4.png" width="63" height="79" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="67"&gt;&lt;a href="http://blogs.msdn.com/jimoneil/archive/2009/10/28/7-on-7-sensor-and-location-api.aspx"&gt;&lt;img style="display: inline" title="Sensor and Location API" border="0" alt="Sensor and Location API" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7SensorandLocationAPI_991A/image_18.png" width="63" height="79" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="67"&gt;&lt;a href="http://blogs.msdn.com/jimoneil/archive/2009/10/29/7-on-7-windows-multitouch.aspx"&gt;&lt;img style="display: inline" title="Multitouch" border="0" alt="Multitouch" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7WindowsMultiTouch_12E5E/image_3.png" width="63" height="79" /&gt;&lt;/a&gt; &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9913124" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Windows+7/default.aspx">Windows 7</category></item><item><title>7 on 7: Windows Multitouch</title><link>http://blogs.msdn.com/jimoneil/archive/2009/10/29/7-on-7-windows-multitouch.aspx</link><pubDate>Thu, 29 Oct 2009 11:07:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9913108</guid><dc:creator>joneil</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/jimoneil/comments/9913108.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jimoneil/commentrss.aspx?PostID=9913108</wfw:commentRss><description>&lt;P&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; MARGIN: 0px 0px 0px 10px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Windows 7" border=0 alt="Windows 7" align=right src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7WindowsMultiTouch_12E5E/image_3.png" width=139 height=174 mce_src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7WindowsMultiTouch_12E5E/image_3.png"&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/dd562197(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd562197(VS.85).aspx"&gt;Windows Multitouch&lt;/A&gt;, in my opinion, is the most emotive new feature of Windows 7.&amp;nbsp; From the kids at home to the audiences to whom I’m demoed Windows 7, there’s something fresh and fun about being able to manipulate an application with simple hand gestures.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;We’ve all used touch screens in some form before, whether it be a tablet PC, your ATM, or a mall kiosk, but generally you’re just substituting your finger for a mouse.&amp;nbsp; Multitouch is different; it mimics the way we work with physical objects and as such opens up a new world of user interaction scenarios.&lt;/P&gt;
&lt;P&gt;When characterizing existing or new applications running on a multitouch device, three categories of the user experience emerge: good, better, and best.&amp;nbsp; As we examine those categories in this post, you should get a good idea of the technical aspects that enable these experiences as well.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;The Good Experience&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Legacy applications will automatically provide a touch experience on touch devices, even though those applications were not designed for the Windows 7 touch capabilities.&amp;nbsp; Basic interactions like panning with one or two fingers, resizing using a pinch gesture, and right clicking with a tap-and-press gesture are automatically translated by Windows 7 into analogous mouse messages, such as &lt;A href="http://msdn.microsoft.com/en-us/library/bb787577(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/bb787577(VS.85).aspx"&gt;WM_VSCROLL&lt;/A&gt; and &lt;A href="http://msdn.microsoft.com/en-us/library/bb787575(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/bb787575(VS.85).aspx"&gt;WM_HSCROLL&lt;/A&gt;.&amp;nbsp; As a result, applications like Microsoft Word 2007 will ‘do the right thing’:&amp;nbsp; when you pan the document, it scrolls; when you use the resize gesture, it changes the zoom factor as if you’d used the slider at the bottom right or the ribbon’s Zoom option.&lt;/P&gt;
&lt;P&gt;You may want to check out the MSDN article &lt;A href="http://msdn.microsoft.com/en-us/library/dd562171(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd562171(VS.85).aspx"&gt;&lt;EM&gt;Legacy Support for Panning with Scroll Bars&lt;/EM&gt;&lt;/A&gt; for additional guidance to ensure your legacy application works well with the ‘out-of-the box’ touch capabilities.&amp;nbsp; &lt;A href="http://msdn.microsoft.com/en-us/library/dd693088(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd693088(VS.85).aspx"&gt;&lt;EM&gt;Troubleshooting Applications&lt;/EM&gt;&lt;/A&gt; also has good tips for diagnosing unexpected behaviors in touch-enabled applications; for example, disabling flicks is generally recommended.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;The Better Experience&lt;/H2&gt;
&lt;P&gt;Windows 7 introduces three new notifications and messages to support touch-enabled applications; two of these notifications (&lt;A href="http://msdn.microsoft.com/en-us/library/dd353243(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd353243(VS.85).aspx"&gt;WM_GESTURENOTIFY&lt;/A&gt; and &lt;A href="http://msdn.microsoft.com/en-us/library/dd353242(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd353242(VS.85).aspx"&gt;WM_GESTURE&lt;/A&gt;) form the basis of “the better experience” for multitouch.&amp;nbsp; To respond to these new messages, managed developers need to include code in &lt;A href="http://msdn.microsoft.com/en-us/library/system.windows.forms.control.wndproc.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.windows.forms.control.wndproc.aspx"&gt;WndProc&lt;/A&gt; since the the .NET Framework classes do not include explicit touch events. Additionally be sure to filter these message up the chain, via &lt;A href="http://msdn.microsoft.com/en-us/library/ms633572(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/ms633572(VS.85).aspx"&gt;DefWindowProc&lt;/A&gt; (unmanaged) or a call to the &lt;A href="http://msdn.microsoft.com/en-us/library/system.windows.forms.control.wndproc.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.windows.forms.control.wndproc.aspx"&gt;WndProc&lt;/A&gt; of the base class in managed code.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/dd353243(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd353243(VS.85).aspx"&gt;&lt;STRONG&gt;WM_GESTURENOTIFY&lt;/STRONG&gt;&lt;/A&gt; is your opportunity to indicate which of the built-in gestures that your application supports.&amp;nbsp; Respond to this message via a call to &lt;A href="http://msdn.microsoft.com/en-us/library/dd353241(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd353241(VS.85).aspx"&gt;SetGestureConfig&lt;/A&gt;, passing in an array of &lt;A href="http://msdn.microsoft.com/en-us/library/dd353231(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd353231(VS.85).aspx"&gt;GESTURECONFIG&lt;/A&gt; structures that detail which gestures your application will recognize.&amp;nbsp;&amp;nbsp; There are five specific gestures:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;TABLE border=1 cellSpacing=0 cellPadding=2 width="100%"&gt;
&lt;TBODY&gt;
&lt;TR bgColor=#c0c0c0 color="#000000"&gt;
&lt;TD vAlign=top width=100&gt;&lt;FONT color=#000000&gt;&lt;STRONG&gt;Gesture&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=100&gt;&lt;FONT color=#000000&gt;&lt;STRONG&gt;ID&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=190&gt;&lt;FONT color=#000000&gt;&lt;STRONG&gt;Behavior&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD vAlign=top&gt;&lt;FONT color=#000000&gt;&lt;STRONG&gt;Gesture Diagram&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=100&gt;GID_ZOOM&lt;/TD&gt;
&lt;TD vAlign=top width=100 align=middle&gt;3&lt;/TD&gt;
&lt;TD vAlign=top width=190&gt;zoom&lt;/TD&gt;
&lt;TD vAlign=top width=10&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; MARGIN: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Zoom gesture" border=0 alt="Zoom gesture" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7WindowsMultiTouch_12E5E/image_15.png" width=161 height=125 mce_src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7WindowsMultiTouch_12E5E/image_15.png"&gt; &lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=100&gt;GID_PAN&lt;/TD&gt;
&lt;TD vAlign=top width=100 align=middle&gt;4&lt;/TD&gt;
&lt;TD vAlign=top width=190&gt;pan / scroll&lt;/TD&gt;
&lt;TD vAlign=top width=10&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; MARGIN: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Pan gesture" border=0 alt="Pan gesture" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7WindowsMultiTouch_12E5E/image_16.png" width=203 height=113 mce_src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7WindowsMultiTouch_12E5E/image_16.png"&gt; &lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=100&gt;GID_ROTATE&lt;/TD&gt;
&lt;TD vAlign=top width=100 align=middle&gt;5&lt;/TD&gt;
&lt;TD vAlign=top width=190&gt;rotate&lt;/TD&gt;
&lt;TD vAlign=top width=10&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; MARGIN: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Rotate gesture" border=0 alt="Rotate gesture" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7WindowsMultiTouch_12E5E/image_17.png" width=240 height=112 mce_src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7WindowsMultiTouch_12E5E/image_17.png"&gt; &lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=100&gt;GID_TWOFINGERTAP&lt;/TD&gt;
&lt;TD vAlign=top width=100 align=middle&gt;6&lt;/TD&gt;
&lt;TD vAlign=top width=190&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=10&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; MARGIN: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Two-finger tap gesture" border=0 alt="Two-finger tap gesture" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7WindowsMultiTouch_12E5E/image_18.png" width=240 height=99 mce_src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7WindowsMultiTouch_12E5E/image_18.png"&gt; &lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=100&gt;GID_PRESSANDTAP&lt;/TD&gt;
&lt;TD vAlign=top width=100 align=middle&gt;7&lt;/TD&gt;
&lt;TD vAlign=top width=190&gt;right click&lt;/TD&gt;
&lt;TD vAlign=top width=10&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; MARGIN: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Press-and-tap gesture" border=0 alt="Press-and-tap gesture" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7WindowsMultiTouch_12E5E/image_19.png" width=240 height=98 mce_src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7WindowsMultiTouch_12E5E/image_19.png"&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The ID numbers in the chart above refer to the dwID field of the &lt;A href="http://msdn.microsoft.com/en-us/library/dd353232(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd353232(VS.85).aspx"&gt;GESTUREINFO&lt;/A&gt; structure, which you would retrieve via the &lt;A href="http://msdn.microsoft.com/en-us/library/dd353235(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd353235(VS.85).aspx"&gt;GetGestureInfo&lt;/A&gt; method as part of the message processing loop.&amp;nbsp; Two other ID values, GID_START (1) and GID_END (2), complete the list and enable detecting the beginning and end of a long-running gesture, like panning across a document.&amp;nbsp;&amp;nbsp; The GESTUREINFO structure contains additional fields (ptsLocation and ullArguments) that store data pertinent to a specific gesture, like the center point of a rotation or the distance between two fingers.&lt;/P&gt;
&lt;P&gt;Putting this all together, below is a bit of code from the &lt;A href="http://msdn.microsoft.com/en-us/library/dd940544(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd940544(VS.85).aspx"&gt;MTGestures&lt;/A&gt; sample provided with the &lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c17ba869-9671-4330-a63e-1fd44e0e2505&amp;amp;displaylang=en" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c17ba869-9671-4330-a63e-1fd44e0e2505&amp;amp;displaylang=en"&gt;Windows 7 SDK&lt;/A&gt;.&amp;nbsp; The two cases for the WndProc function (lines 8 and 22) handle the two new notifications for gesture handling.&amp;nbsp; Here, the application subscribes to all of the gestures (line 13), and defers the gesture handling to the DecodeGesture method (line 23).&amp;nbsp; Each gesture has its own case within the switch statement (lines 46, 49, 52, 80, 102, 127, and 132) where gesture-specific code accesses the additional information in ptsLocation and ullArguments to carry out the processing.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;protected&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;override&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; WndProc(&lt;SPAN class=kwrd&gt;ref&lt;/SPAN&gt; Message m)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;{&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;bool&lt;/SPAN&gt; handled;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;    handled = &lt;SPAN class=kwrd&gt;false&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;switch&lt;/SPAN&gt; (m.Msg)&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;case&lt;/SPAN&gt; WM_GESTURENOTIFY:&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;            {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;                GESTURECONFIG gc = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; GESTURECONFIG();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;                gc.dwID = 0;    &lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;                gc.dwWant = GC_ALLGESTURES; &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;                gc.dwBlock = 0;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;                &lt;SPAN class=kwrd&gt;bool&lt;/SPAN&gt; bResult = SetGestureConfig( Handle,  0,   1, &lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;                     &lt;SPAN class=kwrd&gt;ref&lt;/SPAN&gt; gc,  _gestureConfigSize);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;            }&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;            handled = &lt;SPAN class=kwrd&gt;true&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  21:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  22:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;case&lt;/SPAN&gt; WM_GESTURE:&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  23:  &lt;/SPAN&gt;            handled = DecodeGesture(&lt;SPAN class=kwrd&gt;ref&lt;/SPAN&gt; m);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  24:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  25:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  26:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;default&lt;/SPAN&gt;:&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  27:  &lt;/SPAN&gt;            handled = &lt;SPAN class=kwrd&gt;false&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  28:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  29:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  30:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;base&lt;/SPAN&gt;.WndProc(&lt;SPAN class=kwrd&gt;ref&lt;/SPAN&gt; m);&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  31:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  32:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (handled)&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  33:  &lt;/SPAN&gt;          m.Result = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; System.IntPtr(1);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  34:  &lt;/SPAN&gt;}&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  35:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  36:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  37:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;bool&lt;/SPAN&gt; DecodeGesture(&lt;SPAN class=kwrd&gt;ref&lt;/SPAN&gt; Message m)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  38:  &lt;/SPAN&gt;{&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  39:  &lt;/SPAN&gt;    GESTUREINFO gi;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  40:  &lt;/SPAN&gt;    gi = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; GESTUREINFO();&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  41:  &lt;/SPAN&gt;    gi.cbSize = _gestureInfoSize;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  42:  &lt;/SPAN&gt;    GetGestureInfo(m.LParam,&lt;SPAN class=kwrd&gt;ref&lt;/SPAN&gt; gi)&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  43:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  44:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;switch&lt;/SPAN&gt; (gi.dwID)&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  45:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  46:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;case&lt;/SPAN&gt; GID_BEGIN:&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  47:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  48:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  49:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;case&lt;/SPAN&gt; GID_END:&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  50:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  51:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  52:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;case&lt;/SPAN&gt; GID_ZOOM:&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  53:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;switch&lt;/SPAN&gt; (gi.dwFlags)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  54:  &lt;/SPAN&gt;            {&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  55:  &lt;/SPAN&gt;                &lt;SPAN class=kwrd&gt;case&lt;/SPAN&gt; GF_BEGIN:&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  56:  &lt;/SPAN&gt;                    _iArguments = (&lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt;)(gi.ullArguments &amp;amp; &lt;BR&gt;                                  ULL_ARGUMENTS_BIT_MASK);&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  57:  &lt;/SPAN&gt;                    _ptFirst.X = gi.ptsLocation.x;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  58:  &lt;/SPAN&gt;                    _ptFirst.Y = gi.ptsLocation.y;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  59:  &lt;/SPAN&gt;                    _ptFirst = PointToClient(_ptFirst);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  60:  &lt;/SPAN&gt;                    &lt;SPAN class=kwrd&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  61:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  62:  &lt;/SPAN&gt;                &lt;SPAN class=kwrd&gt;default&lt;/SPAN&gt;:&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  63:  &lt;/SPAN&gt;                    _ptSecond.X = gi.ptsLocation.x;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  64:  &lt;/SPAN&gt;                    _ptSecond.Y = gi.ptsLocation.y;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  65:  &lt;/SPAN&gt;                    _ptSecond = PointToClient(_ptSecond);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  66:  &lt;/SPAN&gt;                    Point ptZoomCenter = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Point(&lt;/PRE&gt;&lt;PRE&gt;                               (_ptFirst.X + _ptSecond.X) / 2,&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  67:  &lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (_ptFirst.Y + _ptSecond.Y) / 2);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  68:  &lt;/SPAN&gt;                    &lt;SPAN class=kwrd&gt;double&lt;/SPAN&gt; k =  (&lt;SPAN class=kwrd&gt;double&lt;/SPAN&gt;)(gi.ullArguments &amp;amp; &lt;/PRE&gt;&lt;PRE&gt;                               ULL_ARGUMENTS_BIT_MASK) / &lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  69:  &lt;/SPAN&gt;                        (&lt;SPAN class=kwrd&gt;double&lt;/SPAN&gt;)(_iArguments);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  70:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  71:  &lt;/SPAN&gt;                   _dwo.Zoom(k, ptZoomCenter.X, ptZoomCenter.Y)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  72:  &lt;/SPAN&gt;                    Invalidate();&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  73:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  74:  &lt;/SPAN&gt;                    _ptFirst = _ptSecond;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  75:  &lt;/SPAN&gt;                    _iArguments = (&lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt;)(gi.ullArguments &amp;amp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULL_ARGUMENTS_BIT_MASK);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  76:  &lt;/SPAN&gt;                    &lt;SPAN class=kwrd&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  77:  &lt;/SPAN&gt;            }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  78:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  79:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  80:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;case&lt;/SPAN&gt; GID_PAN:&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  81:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;switch&lt;/SPAN&gt; (gi.dwFlags)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  82:  &lt;/SPAN&gt;            {&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  83:  &lt;/SPAN&gt;                &lt;SPAN class=kwrd&gt;case&lt;/SPAN&gt; GF_BEGIN:&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  84:  &lt;/SPAN&gt;                    _ptFirst.X = gi.ptsLocation.x;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  85:  &lt;/SPAN&gt;                    _ptFirst.Y = gi.ptsLocation.y;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  86:  &lt;/SPAN&gt;                    _ptFirst = PointToClient(_ptFirst);&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  87:  &lt;/SPAN&gt;                    &lt;SPAN class=kwrd&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  88:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  89:  &lt;/SPAN&gt;                &lt;SPAN class=kwrd&gt;default&lt;/SPAN&gt;:&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  90:  &lt;/SPAN&gt;                     _ptSecond.X = gi.ptsLocation.x;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  91:  &lt;/SPAN&gt;                    _ptSecond.Y = gi.ptsLocation.y;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  92:  &lt;/SPAN&gt;                    _ptSecond = PointToClient(_ptSecond);&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  93:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  94:  &lt;/SPAN&gt;                    _dwo.Move(_ptSecond.X - _ptFirst.X, &lt;BR&gt;                                     _ptSecond.Y - _ptFirst.Y);&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  95:  &lt;/SPAN&gt;                    Invalidate();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  96:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  97:  &lt;/SPAN&gt;                    _ptFirst = _ptSecond;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  98:  &lt;/SPAN&gt;                    &lt;SPAN class=kwrd&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  99:  &lt;/SPAN&gt;            }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt; 100:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt; 101:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt; 102:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;case&lt;/SPAN&gt; GID_ROTATE:&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt; 103:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;switch&lt;/SPAN&gt; (gi.dwFlags)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt; 104:  &lt;/SPAN&gt;            {&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt; 105:  &lt;/SPAN&gt;                &lt;SPAN class=kwrd&gt;case&lt;/SPAN&gt; GF_BEGIN:&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt; 106:  &lt;/SPAN&gt;                    _iArguments = 0;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt; 107:  &lt;/SPAN&gt;                    &lt;SPAN class=kwrd&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt; 108:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt; 109:  &lt;/SPAN&gt;                &lt;SPAN class=kwrd&gt;default&lt;/SPAN&gt;:&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt; 110:  &lt;/SPAN&gt;                    _ptFirst.X = gi.ptsLocation.x;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt; 111:  &lt;/SPAN&gt;                    _ptFirst.Y = gi.ptsLocation.y;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt; 112:  &lt;/SPAN&gt;                    _ptFirst = PointToClient(_ptFirst);&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt; 113:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt; 114:  &lt;/SPAN&gt;                    _dwo.Rotate(&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt; 115:  &lt;/SPAN&gt;                        ArgToRadians(gi.ullArguments &amp;amp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULL_ARGUMENTS_BIT_MASK) &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt; 116:  &lt;/SPAN&gt;                        - ArgToRadians(_iArguments),&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt; 117:  &lt;/SPAN&gt;                        _ptFirst.X, _ptFirst.Y&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt; 118:  &lt;/SPAN&gt;                    );&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt; 119:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt; 120:  &lt;/SPAN&gt;                    Invalidate();&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt; 121:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt; 122:  &lt;/SPAN&gt;                    _iArguments = (&lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt;)(gi.ullArguments &amp;amp; &lt;BR&gt;                                                 ULL_ARGUMENTS_BIT_MASK);&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt; 123:  &lt;/SPAN&gt;                    &lt;SPAN class=kwrd&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt; 124:  &lt;/SPAN&gt;            }&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt; 125:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt; 126:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt; 127:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;case&lt;/SPAN&gt; GID_TWOFINGERTAP:&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt; 128:  &lt;/SPAN&gt;            _dwo.ToggleDrawDiagonals();&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt; 129:  &lt;/SPAN&gt;            Invalidate();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt; 130:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt; 131:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt; 132:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;case&lt;/SPAN&gt; GID_PRESSANDTAP:&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt; 133:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (gi.dwFlags == GF_BEGIN)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt; 134:  &lt;/SPAN&gt;            {&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt; 135:  &lt;/SPAN&gt;                _dwo.ShiftColor();&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt; 136:  &lt;/SPAN&gt;                Invalidate();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt; 137:  &lt;/SPAN&gt;            }&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt; 138:  &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt; 139:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt; 140:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt; 141:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;true&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt; 142:  &lt;/SPAN&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;STYLE type=text/css&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;The Best Experience&lt;/H2&gt;
&lt;P&gt;Gestures (“the better experience”) are limited in that they cannot be combined, so while you can rotate or zoom, you can’t rotate &lt;EM&gt;&lt;STRONG&gt;and&lt;/STRONG&gt;&lt;/EM&gt; zoom.&amp;nbsp; Additionally, you can’t manipulate more than one object at a time, like say drag two pictures on a photo album application.&amp;nbsp; To ratchet up the experience another level, applications need to opt into handling the raw touch messages, namely &lt;A href="http://msdn.microsoft.com/en-us/library/dd317341(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd317341(VS.85).aspx"&gt;WM_TOUCH&lt;/A&gt;, by registering each window subject to touch treatment via the &lt;A href="http://msdn.microsoft.com/en-us/library/dd317326(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd317326(VS.85).aspx"&gt;RegisterTouchWindow&lt;/A&gt; method.&lt;/P&gt;
&lt;P&gt;As with the WM_GESTURE message, WM_TOUCH messages should be intercepted in the WndProc and the &lt;A href="http://msdn.microsoft.com/en-us/library/dd371582(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd371582(VS.85).aspx"&gt;GetTouchInputInfo&lt;/A&gt; method used to return information about the current touch event.&amp;nbsp; That information is returned within an array of &lt;A href="http://msdn.microsoft.com/en-us/library/dd317334(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd317334(VS.85).aspx"&gt;TOUCHINPUT&lt;/A&gt; structures, in much the same way as the GESTUREINFO structure was leveraged above, but this time returning information about multiple touch points.&lt;/P&gt;
&lt;P&gt;Below is some code from the &lt;A href="http://msdn.microsoft.com/en-us/library/dd940546(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd940546(VS.85).aspx"&gt;MTScratchPadWMTouch&lt;/A&gt; example from the &lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c17ba869-9671-4330-a63e-1fd44e0e2505&amp;amp;displaylang=en" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c17ba869-9671-4330-a63e-1fd44e0e2505&amp;amp;displaylang=en"&gt;Windows 7 SDK&lt;/A&gt;.&amp;nbsp; Similar the above code sample, DecodeTouch is used to extract information from the WM_TOUCH message and carry out appropriate actions.&amp;nbsp; In lines 15 though 20, the dwFlags information for &lt;STRONG&gt;&lt;EM&gt;each&lt;/EM&gt;&lt;/STRONG&gt; touch point is consulted and an associated event handler assigned: Touchdown if the touch message indicates a touch was initiated; Touchup if a finger was removed from the screen; and TouchMove if a finger was moved.&amp;nbsp; Once the action is complete (handlers are executed in line 39), the touch handle, which comes from the LPARAM of the WM_TOUCH message, must be closed (line 44).&lt;BR&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;bool&lt;/SPAN&gt; DecodeTouch(&lt;SPAN class=kwrd&gt;ref&lt;/SPAN&gt; Message m)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;{&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; inputCount = LoWord(m.WParam.ToInt32()); &lt;SPAN class=rem&gt;// # of inputs&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;    TOUCHINPUT[] inputs;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;    inputs = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; TOUCHINPUT[inputCount];&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;    GetTouchInputInfo(m.LParam, inputCount, inputs, touchInputSize);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;bool&lt;/SPAN&gt; handled = &lt;SPAN class=kwrd&gt;false&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; (&lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; i = 0; i &amp;lt; inputCount; i++)&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;        TOUCHINPUT ti = inputs[i];&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;         EventHandler&amp;lt;WMTouchEventArgs&amp;gt; handler = &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;;  &lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; ((ti.dwFlags &amp;amp; TOUCHEVENTF_DOWN) != 0)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;            handler = Touchdown;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;else&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; ((ti.dwFlags &amp;amp; TOUCHEVENTF_UP) != 0)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;            handler = Touchup;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;else&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; ((ti.dwFlags &amp;amp; TOUCHEVENTF_MOVE) != 0)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  20:  &lt;/SPAN&gt;            handler = TouchMove;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  21:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  22:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (handler != &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  23:  &lt;/SPAN&gt;        {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  24:  &lt;/SPAN&gt;            WMTouchEventArgs te = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; WMTouchEventArgs();&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  25:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  26:  &lt;/SPAN&gt;            te.ContactY = ti.cyContact/100;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  27:  &lt;/SPAN&gt;            te.ContactX = ti.cxContact/100;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  28:  &lt;/SPAN&gt;            te.Id = ti.dwID;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  29:  &lt;/SPAN&gt;            {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  30:  &lt;/SPAN&gt;                Point pt = PointToClient(&lt;/PRE&gt;&lt;PRE&gt;                                          &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Point(ti.x/100, ti.y/100));&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  31:  &lt;/SPAN&gt;                te.LocationX = pt.X;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  32:  &lt;/SPAN&gt;                te.LocationY = pt.Y;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  33:  &lt;/SPAN&gt;            }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  34:  &lt;/SPAN&gt;            te.Time = ti.dwTime;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  35:  &lt;/SPAN&gt;            te.Mask = ti.dwMask;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  36:  &lt;/SPAN&gt;            te.Flags = ti.dwFlags;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  37:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  38:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  39:  &lt;/SPAN&gt;            handler(&lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt;, te);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  40:  &lt;/SPAN&gt;            handled = &lt;SPAN class=kwrd&gt;true&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  41:  &lt;/SPAN&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  42:  &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  43:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  44:  &lt;/SPAN&gt;    CloseTouchInputHandle(m.LParam);&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  45:  &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; handled;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  46:  &lt;/SPAN&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This example is a simple paint application, so the events track individual strokes on a canvas.&amp;nbsp; Touchdown, for instance, initiates a stroke and assigns it a color.&amp;nbsp; Touchup removes the stroke for a collection of active strokes, and TouchMove draws the stroke corresponding to the given touch point on the canvas.&amp;nbsp;&amp;nbsp; Below is the code for the TouchMove handler:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   1:  &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; OnTouchMoveHandler(&lt;SPAN class=kwrd&gt;object&lt;/SPAN&gt; sender, &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;      WMTouchEventArgs e)&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;{&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;    &lt;SPAN class=rem&gt;// Find the stroke in the collection of the strokes in drawing.&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;    Stroke stroke = ActiveStrokes.Get(e.Id);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;    Debug.Assert(stroke != &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;    &lt;SPAN class=rem&gt;// Add contact point to the stroke&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;    stroke.Add(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Point(e.LocationX, e.LocationY));&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;    &lt;SPAN class=rem&gt;// Partial redraw: only the last line segment&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;    Graphics g = &lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt;.CreateGraphics();&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;    stroke.DrawLast(g);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/dd317309(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd317309(VS.85).aspx"&gt;Manipulations and Inertia&lt;/A&gt;&lt;/H2&gt;
&lt;P&gt;While WM_TOUCH provides all the low level details, the jump from translating individual touch messages to end-user interactions like rotating and resizing may seem a bit overwhelming.&amp;nbsp; That’s where the manipulation and inertia processors come in.&lt;/P&gt;
&lt;P&gt;The manipulation processor (&lt;A href="http://msdn.microsoft.com/en-us/library/dd372579(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd372579(VS.85).aspx"&gt;IManipulationProcessor&lt;/A&gt; and &lt;A href="http://msdn.microsoft.com/en-us/library/dd317344(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd317344(VS.85).aspx"&gt;_IManipulationEvents&lt;/A&gt;) takes as input the raw WM_TOUCH messages and converts them into 2-d &lt;A href="http://en.wikipedia.org/wiki/Affine_transformation" mce_href="http://en.wikipedia.org/wiki/Affine_transformation"&gt;affine transformations&lt;/A&gt;, combining scale, rotation, and translation, essentially providing a superset of the more basic gesture support.&amp;nbsp; IManipulationProcessor exposes a &lt;A href="http://msdn.microsoft.com/en-us/library/dd317319(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd317319(VS.85).aspx"&gt;number of methods&lt;/A&gt; depending on the source gesture.&amp;nbsp; For instance, you’d call &lt;A href="http://msdn.microsoft.com/en-us/library/dd562165(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd562165(VS.85).aspx"&gt;ProcessMoveWithTime&lt;/A&gt; to feed the manipulation processor information on the movement of a finger on the screen as reported by one of the WM_TOUCH messages.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;As you’re feeding raw touch information into the processor, it’s firing events defined on the _IManipulationEvents interface, namely &lt;A href="http://msdn.microsoft.com/en-us/library/dd317347(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd317347(VS.85).aspx"&gt;ManipulationStarted&lt;/A&gt;, &lt;A href="http://msdn.microsoft.com/en-us/library/dd317346(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd317346(VS.85).aspx"&gt;ManipulationDelta&lt;/A&gt;, and &lt;A href="http://msdn.microsoft.com/en-us/library/dd317345(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd317345(VS.85).aspx"&gt;ManipulationCompleted&lt;/A&gt;.&amp;nbsp; The ManipulationDelta event gives you access to the affine transformation, so you can carry out whatever update is required to the object being manipulated.&lt;/P&gt;
&lt;P&gt;Most high-end touch applications will also want to take advantage of &lt;A href="http://msdn.microsoft.com/en-us/library/dd562169(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd562169(VS.85).aspx"&gt;inertia mechanics&lt;/A&gt;.&amp;nbsp; As users interact with objects on the screen in a tactile fashion, they expect objects to behave with similar physics to the real world.&amp;nbsp; Flick a photo across the screen, and you expect it to move fast at the start and then slow down, and you may expect it to bounce gently off the edge of the screen if it reaches the perimeter of the display.&amp;nbsp;&amp;nbsp; That’s where the inertia processor (&lt;A href="http://msdn.microsoft.com/en-us/library/dd372061(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd372061(VS.85).aspx"&gt;IInertiaProcessor&lt;/A&gt;) comes in.&lt;/P&gt;
&lt;P&gt;Similar to the manipulation processor (with which is shares the _IManipulationEvents interface), you instantiate a reference to the processor and invoke the &lt;A href="http://msdn.microsoft.com/en-us/library/dd372123(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd372123(VS.85).aspx"&gt;Process&lt;/A&gt; or &lt;A href="http://msdn.microsoft.com/en-us/library/dd372125(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd372125(VS.85).aspx"&gt;ProcessTime&lt;/A&gt; method to carry out the physics calculations and raise the &lt;A href="http://msdn.microsoft.com/en-us/library/dd317346(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd317346(VS.85).aspx"&gt;ManipulationDelta&lt;/A&gt; or perhaps &lt;A href="http://msdn.microsoft.com/en-us/library/dd317345(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd317345(VS.85).aspx"&gt;ManipulationCompleted&lt;/A&gt; event, just as the manipulation processor does.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;WPF 4 and the Evolution of Multitouch&lt;/H2&gt;
&lt;P&gt;The touch capabilities in Windows 7 are obviously implemented at the core operating system level, namely via COM objects.&amp;nbsp; Managed code developers tend to want to operate at a higher level of abstraction, and currently, if you’re using WPF, you would likely do so by integrating with the &lt;A href="http://msdn.microsoft.com/en-us/library/ms701683(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/ms701683(VS.85).aspx"&gt;Real-Time Stylus&lt;/A&gt; interface.&amp;nbsp; For example, the MTScratchpad I described above has an &lt;A href="http://msdn.microsoft.com/en-us/library/dd940548(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd940548(VS.85).aspx"&gt;alternative implementation&lt;/A&gt; in the SDK as well, one using stylus events and other functionality enabled by the &lt;A href="http://msdn.microsoft.com/en-us/library/dd372995(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd372995(VS.85).aspx"&gt;IRealTimeStylus3&lt;/A&gt; and &lt;A href="http://msdn.microsoft.com/en-us/library/dd373001(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd373001(VS.85).aspx"&gt;ITablet3&lt;/A&gt; interfaces.&lt;/P&gt;
&lt;P&gt;You may also be familiar with &lt;A href="http://www.microsoft.com/surface/" mce_href="http://www.microsoft.com/surface/"&gt;Microsoft Surface&lt;/A&gt;, the multi-touch, multi-user tabletop device that you’ve seen on &lt;A href="http://extratv.warnerbros.com/" mce_href="http://extratv.warnerbros.com/"&gt;Extra Entertainment&lt;/A&gt;, Boston's &lt;A href="http://www.whdh.com/"&gt;Channel 7&lt;/A&gt;, or perhaps in the &lt;A href="http://www.starwoodhotels.com/sheraton/property/overview/index.html?propertyID=430" mce_href="http://www.starwoodhotels.com/sheraton/property/overview/index.html?propertyID=430"&gt;Sheraton Boston&lt;/A&gt; lobby.&amp;nbsp; The Surface is based on Windows Vista and the .NET Framework 3.5, and its touch capability is provided via a Surface-specific SDK and controls.&amp;nbsp; On the traditional computing end, Windows 7 provides a native touch API, and WPF 3.5 can tap into it via either interop or the real-time stylus functionality. In pictures, it’s something like the following; the key point to take away is that a touch application for Surface will not run on Windows 7 and vice-versa… today, anyway.&lt;BR&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: block; FLOAT: none; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: auto; BORDER-LEFT-WIDTH: 0px; MARGIN-RIGHT: auto" title="Multitouch scenario today" border=0 alt="Multitouch scenario today" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7WindowsMultiTouch_12E5E/image_10.png" width=367 height=223 mce_src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7WindowsMultiTouch_12E5E/image_10.png"&gt; &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;With &lt;A href="http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx" mce_href="http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx"&gt;.NET 4&lt;/A&gt; and the next iteration of Microsoft Surface, there will be considerable interoperability.&amp;nbsp; The architecture changes from the above to what you see below.&amp;nbsp; Most notably, both devices will be built on a core of Windows 7.&amp;nbsp; Additionally, WPF 4 has been enhanced to support touch events directly on the core UI classes, &lt;A href="http://msdn.microsoft.com/en-us/library/system.windows.uielement(VS.100).aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.windows.uielement(VS.100).aspx"&gt;UIElement&lt;/A&gt; and &lt;A href="http://msdn.microsoft.com/en-us/library/system.windows.uielement3d(VS.100).aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.windows.uielement3d(VS.100).aspx"&gt;UIElement3D&lt;/A&gt;, so implementation via interop or the stylus events will no longer be necessary.&amp;nbsp; Of course, Surface will still deliver additional functionality and controls relevant for that device’s use and form factor, but presuming you confine your application to core .NET 4 (and WPF 4) functionality, you should have nearly seamless interoperability.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: block; FLOAT: none; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: auto; BORDER-LEFT-WIDTH: 0px; MARGIN-RIGHT: auto" title="Multitouch scenarios post .NET 4" border=0 alt="Multitouch scenarios post .NET 4" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7WindowsMultiTouch_12E5E/image_20.png" width=367 height=223 mce_src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7WindowsMultiTouch_12E5E/image_20.png"&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;If you’re considering building multitouch capabilities into your WPF applications, there’s no time like the present.&amp;nbsp; You can &lt;A href="http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx" mce_href="http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx"&gt;download the Beta 2 release of Visual Studio 2010 and .NET Framework 4&lt;/A&gt; now (it was just released last week), and there is a &lt;A href="http://blogs.msdn.com/jeffbe/archive/2009/10/19/going-live-with-visual-studio-2010-beta-2.aspx" mce_href="http://blogs.msdn.com/jeffbe/archive/2009/10/19/going-live-with-visual-studio-2010-beta-2.aspx"&gt;go-live license&lt;/A&gt;!&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;More Hands-On (pun intended!) Information&lt;/H2&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/dd562197(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd562197(VS.85).aspx"&gt;Windows Touch&lt;/A&gt; (MSDN)&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/dd693088(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd693088(VS.85).aspx"&gt;Troubleshooting Applications&lt;/A&gt; (MSDN)&lt;/P&gt;
&lt;P&gt;&lt;A href="http://code.msdn.microsoft.com/WindowsTouch" mce_href="http://code.msdn.microsoft.com/WindowsTouch"&gt;Windows Touch: Developer Resources&lt;/A&gt; (CodeGallery)&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/en-us/magazine/ee336016.aspx" mce_href="http://msdn.microsoft.com/en-us/magazine/ee336016.aspx"&gt;&lt;EM&gt;MultiTouch Capabilities in Windows 7&lt;/EM&gt;&lt;/A&gt; (MSDN Magazine)&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.microsoft.com/surface/touch-pack/en-US/touch-pack.aspx" mce_href="http://www.microsoft.com/surface/touch-pack/en-US/touch-pack.aspx"&gt;Windows Touch Pack for Windows 7&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://on10.net/blogs/larry/Where-the-Multitouch-Devices-Are/" mce_href="http://on10.net/blogs/larry/Where-the-Multitouch-Devices-Are/"&gt;Where the Multitouch Devices Are&lt;/A&gt; (Channel 10 blog)&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9913108" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Windows+7/default.aspx">Windows 7</category></item><item><title>7 on 7: Sensor and Location API</title><link>http://blogs.msdn.com/jimoneil/archive/2009/10/28/7-on-7-sensor-and-location-api.aspx</link><pubDate>Wed, 28 Oct 2009 23:07:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9912698</guid><dc:creator>joneil</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jimoneil/comments/9912698.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jimoneil/commentrss.aspx?PostID=9912698</wfw:commentRss><description>&lt;p&gt;&lt;img style="border-right-width: 0px; margin: 0px 0px 5px 15px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Windows 7" border="0" alt="Windows 7" align="right" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7SensorandLocationAPI_991A/image_18.png" width="139" height="174" /&gt;You just arrived in LA from Boston, and when you get to your hotel and pop open your laptop, the weather widget on your desktop notes the local temperature on this bright sunny day, and when you search for a coffee shop in Santa Monica the nearest one 10 miles away, not 3000.&amp;#160; Once you get to the coffee shop, the only table is near a window, and while the glare is awful, your laptop adjusts to the ambient lighting so you can use your applications with ease.&amp;#160; What’s the secret?&amp;#160; sensors and location awareness.&lt;/p&gt;  &lt;p&gt;Depending on the source, notebook sales eclipsed desktop sales as long ago as 2006, and with the Netbook phenomenon, we are only becoming more and more mobile, computing-wise.&amp;#160; *We* know where we are, why shouldn’t our computer?&amp;#160; That’s the primary scenario that the &lt;a href="http://www.microsoft.com/whdc/device/sensors/default.mspx"&gt;Windows 7 Sensor and Location Platform&lt;/a&gt; enables.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; margin: 0px 10px 0px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Sensor and Location Framework" border="0" alt="Sensor and Location Framework" align="left" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7SensorandLocationAPI_991A/image_4.png" width="228" height="240" /&gt; You can almost think of the API as “ODBC for sensors.”&amp;#160; Just as ODBC provided a common API to access essentially any relational (and some not) data sources, the new API provides a common approach for both driver vendors and software developers to tap into the power of devices like GPS, accelerometers, temperature sensors, biometric devices, and so on.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a name="diagram"&gt;As&lt;/a&gt; you can see on the left, vendors can build sensor drivers, which amount to COM objects, via the &lt;a href="http://msdn.microsoft.com/en-us/library/aa510961.aspx"&gt;User-Mode Driver Framework&lt;/a&gt; along with a specific&amp;#160; &lt;a href="http://msdn.microsoft.com/en-us/library/cc974533.aspx"&gt;Sensor Class Extension&lt;/a&gt; that simplifies the effort and amount of code required.&amp;#160; If you’re looking to build your own driver, I’d recommend the &lt;a href="http://www.microsoft.com/whdc/DevTools/WDK/default.mspx"&gt;Windows Hardware Developer Center&lt;/a&gt; as a start, where you can download the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=2105564e-1a9a-4bf4-8d74-ec5b52da3d00&amp;amp;displaylang=en"&gt;Windows Driver Kit&lt;/a&gt; specifically.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; margin: 0px 0px 0px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Virtual light sensor" border="0" alt="Virtual light sensor" align="right" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7SensorandLocationAPI_991A/image_5.png" width="273" height="130" /&gt;If you just want to experiment with an existing sensor, there’s a couple of options.&amp;#160; The Windows 7 SDK includes a &lt;a href="http://msdn.microsoft.com/en-us/library/dd318911(VS.85).aspx"&gt;virtual light sensor&lt;/a&gt; (look in the Bin directory), which provides a simple user interface to simulate various lighting conditions.&amp;#160; If you have an application that interacts with the sensor API, this a quick way to test.&lt;/p&gt;  &lt;p&gt;Another option is the &lt;a href="http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=JMBADGE"&gt;Freescale JM Badge&lt;/a&gt; board, which includes a light-sensor, accelerometer, and capacitive touch sensors.&amp;#160; &lt;a href="http://blogs.msdn.com/bobfamiliar/pages/windows-7-sensor-and-location-api-getting-started.aspx"&gt;Bob’s blog post&lt;/a&gt; will lead you through the setup and installation of the driver and hardware, so you can do cool things like play around with the &lt;a href="http://blogs.msdn.com/pietrobr/archive/2009/09/24/having-fun-with-windows-7-sensor-api-xna-game-studio.aspx"&gt;XNA Racing Game&lt;/a&gt;!&lt;/p&gt;  &lt;p&gt;When you’ve installed a sensor, it surfaces in the Control Panel under Hardware and Sound &amp;gt; Location and Other Sensors, where you can enable or disable the sensor hardware.&amp;#160; If you select a sensor from the list, you can even provide access policies, specifying which users and groups have access to that sensor.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Location and Sensor control panel" border="0" alt="Location and Sensor control panel" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7SensorandLocationAPI_991A/image11.png" width="498" height="296" /&gt; &lt;a href="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7SensorandLocationAPI_991A/image17.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Sensor access" border="0" alt="Sensor access" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7SensorandLocationAPI_991A/image17_thumb.png" width="308" height="333" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Now that you’ve got a sensor installed, how can you use it within your applications?&amp;#160; The Sensor API standardizes access by formalizing&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Sensor categories, types and properties &lt;/li&gt;    &lt;li&gt;Data formats &lt;/li&gt;    &lt;li&gt;COM interfaces &lt;/li&gt;    &lt;li&gt;Event mechanisms for asynchronously receiving sensor data &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;so you’re left with really just three steps:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;p&gt;The entry point into the Sensor API is the Sensor Manager (COM: &lt;a href="http://msdn.microsoft.com/en-us/library/dd318946(VS.85).aspx"&gt;ISensorManager&lt;/a&gt; interface; managed: SensorManger class).&amp;#160;&amp;#160; Via the Sensor Manager you can enumerate all of the sensors present on the machine, get a list of a specific class of sensors (say all accelerometers), or a pointer to a specific sensor.&amp;#160; In the unmanaged world, you’ll end up with either a &lt;a href="http://msdn.microsoft.com/en-us/library/dd318941(VS.85).aspx"&gt;ISensorCollection&lt;/a&gt; or a specific &lt;a href="http://msdn.microsoft.com/en-us/library/dd318938(VS.85).aspx"&gt;ISensor&lt;/a&gt; pointer.&amp;#160; With the &lt;a href="http://code.msdn.microsoft.com/WindowsAPICodePack#"&gt;Windows API Code Pack&lt;/a&gt;, static methods on the Sensor Manager classes return either a generic SensorList or an instance of the Sensor class.&lt;/p&gt;      &lt;p&gt;As you might expect, ISensor and the managed Sensor class, allow access to a number of properties of the sensor including type, friendly name, manufacturer, serial number, and so on.&amp;#160; The managed Sensor class includes a SensorChangedEvent (use &lt;a href="http://msdn.microsoft.com/en-us/library/dd318862(VS.85).aspx"&gt;ISensorEvent.OnStateChanged&lt;/a&gt; in the COM API) to enable your code to respond to state changes like ready, not available, error, etc.; these are defined by the &lt;a href="http://msdn.microsoft.com/en-us/library/dd318905(VS.85).aspx"&gt;SensorState&lt;/a&gt; enumeration.&lt;/p&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;     &lt;p&gt;The main event here is DataReportChanged (exposed in COM as &lt;a href="http://msdn.microsoft.com/en-us/library/dd318859(VS.85).aspx"&gt;ISensorEvent.OnDataUpdated&lt;/a&gt;), which fires when the sensor has information to share with the host application.&amp;#160; In the handler for DataReportChanged, you’ll get a SensorReport as one of the event arguments; the report includes a timestamp, the sensor that collected the information, and essentially a property bag of information pertinent to that sensor.&amp;#160; &lt;br /&gt;        &lt;br /&gt;Properties are defined in the SensorPropertyKeys class of the Windows API Code Pack, and they map back to the GUIDs defined in the sensors.h header of the Windows 7 SDK.&amp;#160; The managed API Code Pack abstracts these property keys somewhat by providing specific inherited classes for light and motion sensors, so they expose the data relevant to that sensor as named properties.         &lt;br /&gt;&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;The only thing you’re left to do then is react to the contents of the data report (or the current state of the sensor) when the DataReportChanged event fires.&amp;#160; Keep in mind, events may be firing quickly, so you may want to incorporate asynchronous patterns within your code to provide the responsiveness a user will expect.&lt;/p&gt;      &lt;blockquote&gt;&lt;/blockquote&gt;      &lt;p&gt;&lt;/p&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;One example you may have seen that highlights the sensor API is the &lt;a href="http://code.msdn.microsoft.com/msdnreader"&gt;MSDN Reader&lt;/a&gt;, a WPF application that is light-aware.&amp;#160; In low light conditions, text tends to shrink, and the color scheme matches the MSDN brand.&amp;#160; In extreme light conditions, the text grows, and the contrast increases to the point that the interface is rendered in black and white – to provide better readability outdoors, for instance.&amp;#160; Below you can see the difference in the rendering based on changing the ambient lighting as recorded through my JM Badge board.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="MSDN Reader - normal lighting" border="0" alt="MSDN Reader - normal lighting" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7SensorandLocationAPI_991A/image_10.png" width="452" height="279" /&gt; &lt;/p&gt;  &lt;p align="center"&gt;&lt;em&gt;MSDN Reader in normal light conditions&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7SensorandLocationAPI_991A/image_14.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="MSDN Reader - intense lighting" border="0" alt="MSDN Reader - intense lighting" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7SensorandLocationAPI_991A/image_thumb_1.png" width="456" height="283" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;em&gt;MSDN Reader in intense lighting conditions&lt;/em&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;The code for this is actually pretty simple, and in this case localized to a LightSensorProvider class.&amp;#160; Per the three steps above, the first action is to enumerate the sensors so we can get a handle to the light sensor.&amp;#160; Here the application actually attaches to all of the available light sensors (Line 4) and then ‘averages’ the output, but since I have only one sensor board, it’s not doing much.     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:0b479dc7-6a76-4c93-9950-8c4ea5194983" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;try&lt;/span&gt; {&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af"&gt;SensorManager&lt;/span&gt;.SensorsChanged += OnSensorChanged;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#008000"&gt;// get a collection of ambient light sensors&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;var&lt;/span&gt; sensorCollection = &lt;span style="color:#2b91af"&gt;SensorManager&lt;/span&gt;.GetSensorsByTypeId&amp;lt;&lt;span style="color:#2b91af"&gt;AmbientLightSensor&lt;/span&gt;&amp;gt;();&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;AddSensorCollection(sensorCollection);&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;}&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;catch&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;SensorPlatformException&lt;/span&gt; ex) {&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;System.Diagnostics.&lt;span style="color:#2b91af"&gt;Debug&lt;/span&gt;.WriteLine(ex.Message);&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;In Line 5 above, the sensor collection is passed to a method for initialization, which looks like the following; it’s in Line 10 that we’re performing Step 2 of our setup, assigning a handler to the DataReportChanged event.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:fd3882da-b334-4fc4-b9e4-bb0cc344efd4" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; AddSensorCollection(&lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;AmbientLightSensor&lt;/span&gt;&amp;gt; sensorCollection) {&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;foreach&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;AmbientLightSensor&lt;/span&gt; sensor &lt;span style="color:#0000ff"&gt;in&lt;/span&gt; sensorCollection) {&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;AddSensor(sensor);&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; AddSensor(&lt;span style="color:#2b91af"&gt;AmbientLightSensor&lt;/span&gt; sensor) {&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;if&lt;/span&gt;(sensor != &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;) {&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;System.Diagnostics.&lt;span style="color:#2b91af"&gt;Debug&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515"&gt;&amp;quot;AddSensor: &amp;quot;&lt;/span&gt; + sensor.FriendlyName);&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;sensor.DataReportChanged += OnDataUpdated;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Sensors.Add(sensor);&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Here’s what happens in DataReportChanged (delegating to OnDataUpdated), Step 3 of the process.&amp;#160; The data report isn’t actually used here since all that’s needed is to access the sensor’s current intensity at line 8.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:34b51b30-fc3d-4bda-bf51-7d71c09e5137" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;void&lt;/span&gt; OnDataUpdated(&lt;span style="color:#2b91af"&gt;Sensor&lt;/span&gt; sensor, &lt;span style="color:#2b91af"&gt;EventArgs&lt;/span&gt; e) {&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;var&lt;/span&gt; alsReport = sensor.DataReport;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;if&lt;/span&gt;(alsReport != &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;) {&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;System.Diagnostics.&lt;span style="color:#2b91af"&gt;Debug&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515"&gt;&amp;quot;Data event timestamp: &amp;quot;&lt;/span&gt; + alsReport.TimeStamp.ToString());&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;var&lt;/span&gt; alsSensor = (&lt;span style="color:#2b91af"&gt;AmbientLightSensor&lt;/span&gt;)sensor;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#008000"&gt;// get the illuminance property value&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;double&lt;/span&gt; lightLux = alsSensor.CurrentLuminousIntensity.Intensity;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#008000"&gt;// Get the sensor id so we can associate the sensor lux value&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#008000"&gt;// with a specific sensor id in our collection&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af"&gt;Guid&lt;/span&gt; sensorId = (&lt;span style="color:#2b91af"&gt;Guid&lt;/span&gt;)sensor.SensorId;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;if&lt;/span&gt;(sensorId != &lt;span style="color:#2b91af"&gt;Guid&lt;/span&gt;.Empty) {&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#008000"&gt;// Set the sensor light value&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;SetSensorLightLuxValue(sensorId, lightLux);&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;There’s a bit of code I’m leaving out at that point, code that aggregates the multiple light sensors (if there are multiple ones) and handles a timer and threshold values to prevent reacting too much.&amp;#160; &lt;/p&gt;  &lt;p&gt;Ultimately though a dependency property on the class comprising the sensor (LightSensorProvider) is set to a lux value.&amp;#160; From that point, the UI update – this is WPF remember – is handled via a simple binding.&amp;#160;&amp;#160; On line 4 below is the XAML to address the change in font size according to the value of that dependency property: LightSensorProvider.LuxValue.&amp;#160; The magic of data binding in WPF takes over, and the application adjusts itself based on the ambient lighting.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:6c3a8b7a-6b95-45ba-8bcb-0e5b1ab75d02" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#a31515"&gt;&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Window.Resources&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&lt;span style="color:#a31515"&gt;&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style&lt;/span&gt;&lt;span style="color:#ff0000"&gt; x&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000"&gt;Key&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;StoryPhotoCredit&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000"&gt; TargetType&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515"&gt;x&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;Type&lt;/span&gt;&lt;span style="color:#ff0000"&gt; TextBlock}&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515"&gt;&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Setter&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;FontFamily&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Value&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Arial&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515"&gt;&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Setter&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;FontSize&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Value&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515"&gt;Binding&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Source&lt;/span&gt;&lt;span style="color:#0000ff"&gt;={&lt;/span&gt;&lt;span style="color:#a31515"&gt;StaticResource&lt;/span&gt;&lt;span style="color:#ff0000"&gt; LightSensorProvider}&lt;/span&gt;&lt;span style="color:#0000ff"&gt;,&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Path&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=LuxValue,&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Converter&lt;/span&gt;&lt;span style="color:#0000ff"&gt;={&lt;/span&gt;&lt;span style="color:#a31515"&gt;StaticResource&lt;/span&gt;&lt;span style="color:#ff0000"&gt; LightLevelToFontSizeConverter}&lt;/span&gt;&lt;span style="color:#0000ff"&gt;,&lt;/span&gt;&lt;span style="color:#ff0000"&gt; ConverterParameter&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;8&lt;span style="color:#0000ff"&gt;pt}&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515"&gt;&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Setter&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;TextAlignment&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Value&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Right&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515"&gt;&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Setter&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Foreground&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Value&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515"&gt;DynamicResource&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Brush_ChromeSolidColor}&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&lt;span style="color:#a31515"&gt;&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Location API&lt;/h2&gt;  &lt;p&gt;Now what about the &lt;a href="http://msdn.microsoft.com/en-us/library/dd464636(VS.85).aspx"&gt;Location API&lt;/a&gt;?&amp;#160; As you can see from &lt;a href="#diagram"&gt;the diagram&lt;/a&gt; at the top of this post, the location API is an abstraction of the lower level sensor API.&amp;#160; It extends the sensor API to provide a couple of new interfaces (in the COM world).&amp;#160; Specifically it provides two specialized data reports, one containing a latitude/longitude pair and the other containing a civic (street) address for the detected location. &lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2" align="center"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="140"&gt;&lt;strong&gt;COM Interface&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="339"&gt;&lt;strong&gt;Purpose&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="140"&gt;ILocation&lt;/td&gt;        &lt;td valign="top" width="339"&gt;main sensor class&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="140"&gt;ILatLongReport&lt;/td&gt;        &lt;td valign="top" width="339"&gt;report of lat/long location&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="140"&gt;ICivicAddressReport&lt;/td&gt;        &lt;td valign="top" width="339"&gt;report of location as street address&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="140"&gt;IDefaultLocation&lt;/td&gt;        &lt;td valign="top" width="339"&gt;access to default location&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="140"&gt;ILocationEvents&lt;/td&gt;        &lt;td valign="top" width="339"&gt;events to handle change in sensor status and location&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Note, at this point, a managed interface for the Location API has not yet been released as part of the Windows API Code Pack.&amp;#160; There is, however, an alternative interoperability library at the &lt;a href="http://code.msdn.microsoft.com/SensorsAndLocation"&gt;Windows Sensor and Location Platforms project&lt;/a&gt; on Code Gallery.&lt;/p&gt;  &lt;p&gt;What’s cool with the Location API is that you can &lt;a href="http://msdn.microsoft.com/en-us/library/dd317749(VS.85).aspx"&gt;control it as well via JavaScript&lt;/a&gt;, and since desktop widgets are merely combinations of JavaScript, CSS, and HTML, you can quickly create some location aware widgets for the desktop, like the weather and places of interest.&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="511"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="200"&gt;&lt;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="Weather widget" border="0" alt="Weather widget" align="left" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7SensorandLocationAPI_991A/image_15.png" width="231" height="160" /&gt;&lt;/td&gt;        &lt;td valign="top" width="309"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7SensorandLocationAPI_991A/image_17.png"&gt;&lt;img style="border-right-width: 0px; margin: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Places widget" border="0" alt="Places widget" align="right" src="http://blogs.msdn.com/blogfiles/jimoneil/WindowsLiveWriter/7on7SensorandLocationAPI_991A/image_thumb_4.png" width="223" height="286" /&gt;&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;   &lt;br /&gt;&lt;/p&gt;  &lt;h2&gt;Links to Get You Started&lt;/h2&gt;  &lt;p&gt;Here’s a few more links to get help you start integrating the Sensor and Location API with your own applications.&amp;#160; Have fun!&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=JMBADGE"&gt;Freescale JM Badge board&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=SensorsAndLocation&amp;amp;DownloadId=5856"&gt;Sensor Development Kit&lt;/a&gt; (for use with Freescale board)&lt;/p&gt;    &lt;p&gt;&lt;a href="http://code.msdn.microsoft.com/WindowsAPICodePack#"&gt;Windows API Code Pack (managed wrapper for Sensor library)&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://code.msdn.microsoft.com/SensorsAndLocation"&gt;Windows Sensor and Location Platforms (Code Gallery)&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd318953(VS.85).aspx"&gt;Sensor API (MSDN)&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd464636(VS.85).aspx"&gt;Location API (MSDN)&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://blogs.msdn.com/gavingear/"&gt;Gavin Gear’s Tech Blog&lt;/a&gt; (MSDN Blogs)&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9912698" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jimoneil/archive/tags/Windows+7/default.aspx">Windows 7</category></item></channel></rss>