<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.microsoft.co.il/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>Just code - Tamir Khason : Vista, WPF</title><link>http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Vista/WPF/default.aspx</link><description>Tags: Vista, WPF</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>New year – new blog or how to migrate Community Server to any other engine, supports XML-RPC</title><link>http://blogs.microsoft.co.il/blogs/tamir/archive/2009/01/01/new-year-new-blog-or-how-to-migrate-community-server-to-any-other-engine-supports-xml-rpc.aspx</link><pubDate>Fri, 02 Jan 2009 02:33:04 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:205248</guid><dc:creator>Tamir Khason</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Please update your bookmarks, because the new url of this blog is &lt;a href="http://khason.net/"&gt;http://khason.net/&lt;/a&gt; (you have not update RSS feeds, it will be done automatically). Why I did it? Why I decided to go to “stand-alone”… Well. there are some reasons. Generally, I do not want to explain all those here, but trust me, there are some. The main reason is, that there is no responsible person in charge for this blog platform in Microsoft Israel. This why, if your blog is popular and you have a respect to your blog visitors, you cannot host it here… Take a look into new comments notifications in my inbox. Would you answer your readers with such “small amount” of SPAM and capcha, that cannot be fixed already for three years in this platform? This how my inbox looks like for last three years. So now, you should not ask me, why I not answered your email or comments. Aren’t you? :)&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Capture" border="0" alt="Capture" src="http://blogs.microsoft.co.il/blogs/tamir/Capture_1D7350A7.jpg" width="354" height="397" /&gt; &lt;/p&gt;  &lt;p&gt;Currently, all comments in this blog are disabled, so if you want to comment, please use new url of posts (this will appear shortly in the beginning of each post). Also, this post will not be syndicated in RSS.&lt;/p&gt;  &lt;p&gt;So, this post is the last. I loved this platform, and loved people started it. But, unfortunately, it seemed, that bloggers community is not important enough for new platform managers. &lt;/p&gt;  &lt;p&gt;Also, If you want to learn &lt;a target="_blank" href="http://khason.net/dev/how-to-migrate-from-cs2007-to-wordpress-movable-type-or-any-other-blog-engine-supports-xml-rpc-with-c/"&gt;how to use C# and XML-RCP to migrate from CS2007, used in this platform, visit my new home&lt;/a&gt; :)&lt;/p&gt;  &lt;p&gt;Have a great year and, as always, be good people. This post marked with all possible tags automatically. Sorry.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=205248" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/soft/default.aspx">soft</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/blogging+tools/default.aspx">blogging tools</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/tutorial/default.aspx">tutorial</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Tips+and+Tricks/default.aspx">Tips and Tricks</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Performance/default.aspx">Performance</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WPF+crossbow/default.aspx">WPF crossbow</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/source/default.aspx">source</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Mobile/default.aspx">Mobile</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/help/default.aspx">help</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Windows+Gadgets/default.aspx">Windows Gadgets</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/promo/default.aspx">promo</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Vista/default.aspx">Vista</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/thoughts/default.aspx">thoughts</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/tools/default.aspx">tools</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/events/default.aspx">events</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/demos/default.aspx">demos</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WPF_2F00_E/default.aspx">WPF/E</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/download/default.aspx">download</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/jobs/default.aspx">jobs</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/VSTS/default.aspx">VSTS</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Web/default.aspx">Web</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Accessibility/default.aspx">Accessibility</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Blogging+rules/default.aspx">Blogging rules</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/blogging+general/default.aspx">blogging general</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/fun/default.aspx">fun</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Vista+Battery+Saver/default.aspx">Vista Battery Saver</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/SkyDrive/default.aspx">SkyDrive</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Windows+Live+Writer/default.aspx">Windows Live Writer</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Windows+Live/default.aspx">Windows Live</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Dell/default.aspx">Dell</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/DevAcademy2/default.aspx">DevAcademy2</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WPF+quiz/default.aspx">WPF quiz</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/x64/default.aspx">x64</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WF/default.aspx">WF</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/SVG/default.aspx">SVG</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/XPS/default.aspx">XPS</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/TechedIsrael2008/default.aspx">TechedIsrael2008</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/teched/default.aspx">teched</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/XNA/default.aspx">XNA</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/PLINQ/default.aspx">PLINQ</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Micro+Framework/default.aspx">Micro Framework</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/SAP/default.aspx">SAP</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/XLINQ/default.aspx">XLINQ</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/DirectX/default.aspx">DirectX</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Work+process/default.aspx">Work process</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Linux/default.aspx">Linux</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Mono/default.aspx">Mono</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/DevAcademy3/default.aspx">DevAcademy3</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Math/default.aspx">Math</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/GIS/default.aspx">GIS</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Algorithms/default.aspx">Algorithms</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/TECH/default.aspx">TECH</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Windows+7/default.aspx">Windows 7</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Charity/default.aspx">Charity</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/OFFTOPIC/default.aspx">OFFTOPIC</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Hardware/default.aspx">Hardware</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Interop/default.aspx">Interop</category></item><item><title>Read and use FM radio (or any other USB HID device) from C#</title><link>http://blogs.microsoft.co.il/blogs/tamir/archive/2008/12/30/read-and-use-fm-radio-or-any-other-usb-hid-device-from-c.aspx</link><pubDate>Wed, 31 Dec 2008 01:42:18 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:204291</guid><dc:creator>Tamir Khason</dc:creator><slash:comments>1</slash:comments><description>&lt;h3&gt;[This blog was migrated. You will not be able to comment here.&lt;br /&gt;The new URL of this post is &lt;a href="http://khason.net/blog/read-and-use-fm-radio-or-any-other-usb-hid-device-from-c/"&gt;http://khason.net/blog/read-and-use-fm-radio-or-any-other-usb-hid-device-from-c/&lt;/a&gt;]&lt;/h3&gt;&lt;hr /&gt;&lt;p&gt;Last time &lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/2008/12/12/reading-and-decoding-rds-radio-data-system-in-c.aspx"&gt;we spoke about reading and decoding RDS information from FM receivers&lt;/a&gt;. Also &lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/2008/12/25/capturing-and-streaming-sound-by-using-directsound-with-c.aspx"&gt;we already know how to stream sound from DirectSound compatible devices&lt;/a&gt;. However, before we can do it, we should be able to “speak” with such devices. So, today we’ll spoke about detection and reading information from Radio USB adapters (actually from any Human Input Devices). Let’s start.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="USB FM HID" border="0" alt="USB FM HID" src="http://blogs.microsoft.co.il/blogs/tamir/image_460DCF0B.png" width="240" height="211" /&gt; &lt;/p&gt;  &lt;p&gt;First, if you want to do it, go and buy such device. The are not a lot of alternatives, but if you’ll seek, you’ll find it very quickly.&lt;/p&gt;  &lt;p&gt;So, let’s start. First of all, we’ll use platform invoke to get and set the information. Also, we have to preserve handle of the device from being collected by GC. After we’ll finish using the device, we’ll have to dispose it. Thus it makes sense to inherit from SafeHandle and IDisposable.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;[SecurityPermission(SecurityAction.InheritanceDemand, UnmanagedCode = true)]     &lt;br /&gt;[SecurityPermission(SecurityAction.Demand, UnmanagedCode = true)]      &lt;br /&gt;public class USBDevice : SafeHandleZeroOrMinusOneIsInvalid, IDisposable {&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Next, we’ll set a number of arguments, that will be in use during the device lifetime.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;public uint ProductID { get; private set; }     &lt;br /&gt;public uint VendorID { get; private set; }      &lt;br /&gt;public uint VersionNumber { get; private set; }      &lt;br /&gt;public string Name { get; private set; }      &lt;br /&gt;public string SerialNumber { get; private set; }      &lt;br /&gt;public override bool IsInvalid { get { return !isValid; } } &lt;/p&gt;    &lt;p&gt;internal ushort FeatureReportLength { get; private set; }     &lt;br /&gt;internal ushort[] Registers { get; set; }&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Now, we have to find it. The best way of detection human input devices is by product and vendor IDs. Those values are always unique for certain device type.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;[SecurityPermission(SecurityAction.Demand, UnmanagedCode = true)]     &lt;br /&gt;internal USBDevice(uint pid, uint vid) : base(true) { findDevice(pid, vid); }&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Next step is to find a device. To do this, we have to provide extern interfaces to methods of hid.dll and setupapi.dll. Here all methods we will use in our class&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;[SuppressUnmanagedCodeSecurity()]     &lt;br /&gt;internal static class Native {      &lt;br /&gt;&amp;#160;&amp;#160; #region methods      &lt;br /&gt;&amp;#160;&amp;#160; [DllImport(&amp;quot;hid.dll&amp;quot;, SetLastError = true)]      &lt;br /&gt;&amp;#160;&amp;#160; internal static extern void HidD_GetHidGuid(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ref Guid lpHidGuid); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; [DllImport(&amp;quot;hid.dll&amp;quot;, SetLastError = true)]     &lt;br /&gt;&amp;#160;&amp;#160; internal static extern bool HidD_GetAttributes(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IntPtr hDevice,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; out HIDD_ATTRIBUTES Attributes); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; [DllImport(&amp;quot;hid.dll&amp;quot;, SetLastError = true)]     &lt;br /&gt;&amp;#160;&amp;#160; internal static extern bool HidD_GetPreparsedData(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IntPtr hDevice,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; out IntPtr hData); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; [DllImport(&amp;quot;hid.dll&amp;quot;, SetLastError = true)]     &lt;br /&gt;&amp;#160;&amp;#160; internal static extern bool HidD_FreePreparsedData(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IntPtr hData); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; [DllImport(&amp;quot;hid.dll&amp;quot;, SetLastError = true)]     &lt;br /&gt;&amp;#160;&amp;#160; internal static extern bool HidP_GetCaps(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IntPtr hData,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; out HIDP_CAPS capabilities); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; [DllImport(&amp;quot;hid.dll&amp;quot;, SetLastError = true, CallingConvention = CallingConvention.StdCall)]     &lt;br /&gt;&amp;#160;&amp;#160; internal static extern bool HidD_GetFeature(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IntPtr hDevice,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IntPtr hReportBuffer,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; uint ReportBufferLength); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; [DllImport(&amp;quot;hid.dll&amp;quot;, SetLastError = true, CallingConvention = CallingConvention.StdCall)]     &lt;br /&gt;&amp;#160;&amp;#160; internal static extern bool HidD_SetFeature(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IntPtr hDevice,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IntPtr ReportBuffer,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; uint ReportBufferLength); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; [DllImport(&amp;quot;hid.dll&amp;quot;, SetLastError = true, CallingConvention = CallingConvention.StdCall)]     &lt;br /&gt;&amp;#160;&amp;#160; internal static extern bool HidD_GetProductString(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IntPtr hDevice,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IntPtr Buffer,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; uint BufferLength); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; [DllImport(&amp;quot;hid.dll&amp;quot;, SetLastError = true, CallingConvention = CallingConvention.StdCall)]     &lt;br /&gt;&amp;#160;&amp;#160; internal static extern bool HidD_GetSerialNumberString(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IntPtr hDevice,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IntPtr Buffer,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; uint BufferLength); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; [DllImport(&amp;quot;setupapi.dll&amp;quot;, SetLastError = true)]     &lt;br /&gt;&amp;#160;&amp;#160; internal static extern IntPtr SetupDiGetClassDevs(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ref Guid ClassGuid,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [MarshalAs(UnmanagedType.LPTStr)] string Enumerator,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IntPtr hwndParent,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; UInt32 Flags); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; [DllImport(&amp;quot;setupapi.dll&amp;quot;, SetLastError = true)]     &lt;br /&gt;&amp;#160;&amp;#160; internal static extern bool SetupDiEnumDeviceInterfaces(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IntPtr DeviceInfoSet,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int DeviceInfoData,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ref&amp;#160; Guid lpHidGuid,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; uint MemberIndex,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ref&amp;#160; SP_DEVICE_INTERFACE_DATA lpDeviceInterfaceData); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; [DllImport(&amp;quot;setupapi.dll&amp;quot;, SetLastError = true)]     &lt;br /&gt;&amp;#160;&amp;#160; internal static extern bool SetupDiGetDeviceInterfaceDetail(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IntPtr DeviceInfoSet,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ref SP_DEVICE_INTERFACE_DATA lpDeviceInterfaceData,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IntPtr hDeviceInterfaceDetailData,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; uint detailSize,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; out uint requiredSize,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IntPtr hDeviceInfoData); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]     &lt;br /&gt;&amp;#160;&amp;#160; [DllImport(&amp;quot;kernel32.dll&amp;quot;, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]      &lt;br /&gt;&amp;#160;&amp;#160; internal static extern IntPtr CreateFile(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string lpFileName,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; uint dwDesiredAccess,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; uint dwShareMode,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IntPtr SecurityAttributes,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; uint dwCreationDisposition,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; uint dwFlagsAndAttributes,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IntPtr hTemplateFile); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]     &lt;br /&gt;&amp;#160;&amp;#160; [DllImport(&amp;quot;kernel32.dll&amp;quot;, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]      &lt;br /&gt;&amp;#160;&amp;#160; internal static extern bool CloseHandle(IntPtr hHandle);&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Also, we will need a number of structures, such as device attributes and capabilities.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;[StructLayout(LayoutKind.Sequential)]     &lt;br /&gt;internal struct SP_DEVICE_INTERFACE_DATA {      &lt;br /&gt;&amp;#160;&amp;#160; public int cbSize;      &lt;br /&gt;&amp;#160;&amp;#160; public Guid InterfaceClassGuid;      &lt;br /&gt;&amp;#160;&amp;#160; public int Flags;      &lt;br /&gt;&amp;#160;&amp;#160; public int Reserved;      &lt;br /&gt;} &lt;/p&gt;    &lt;p&gt;[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]     &lt;br /&gt;internal class PSP_DEVICE_INTERFACE_DETAIL_DATA {      &lt;br /&gt;&amp;#160;&amp;#160; public int cbSize;      &lt;br /&gt;&amp;#160;&amp;#160; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]      &lt;br /&gt;&amp;#160;&amp;#160; public string DevicePath;      &lt;br /&gt;} &lt;/p&gt;    &lt;p&gt;[StructLayout(LayoutKind.Sequential)]     &lt;br /&gt;internal struct HIDD_ATTRIBUTES {      &lt;br /&gt;&amp;#160;&amp;#160; public int Size; // = sizeof (struct _HIDD_ATTRIBUTES) = 10      &lt;br /&gt;&amp;#160;&amp;#160; public UInt16 VendorID;      &lt;br /&gt;&amp;#160;&amp;#160; public UInt16 ProductID;      &lt;br /&gt;&amp;#160;&amp;#160; public UInt16 VersionNumber;      &lt;br /&gt;}      &lt;br /&gt;[StructLayout(LayoutKind.Sequential)]      &lt;br /&gt;internal struct HIDP_CAPS {      &lt;br /&gt;&amp;#160;&amp;#160; public UInt16 Usage;      &lt;br /&gt;&amp;#160;&amp;#160; public UInt16 UsagePage;      &lt;br /&gt;&amp;#160;&amp;#160; public UInt16 InputReportByteLength;      &lt;br /&gt;&amp;#160;&amp;#160; public UInt16 OutputReportByteLength;      &lt;br /&gt;&amp;#160;&amp;#160; public UInt16 FeatureReportByteLength;      &lt;br /&gt;&amp;#160;&amp;#160; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 17)]      &lt;br /&gt;&amp;#160;&amp;#160; public UInt16[] Reserved;      &lt;br /&gt;&amp;#160;&amp;#160; public UInt16 NumberLinkCollectionNodes;      &lt;br /&gt;&amp;#160;&amp;#160; public UInt16 NumberInputButtonCaps;      &lt;br /&gt;&amp;#160;&amp;#160; public UInt16 NumberInputValueCaps;      &lt;br /&gt;&amp;#160;&amp;#160; public UInt16 NumberInputDataIndices;      &lt;br /&gt;&amp;#160;&amp;#160; public UInt16 NumberOutputButtonCaps;      &lt;br /&gt;&amp;#160;&amp;#160; public UInt16 NumberOutputValueCaps;      &lt;br /&gt;&amp;#160;&amp;#160; public UInt16 NumberOutputDataIndices;      &lt;br /&gt;&amp;#160;&amp;#160; public UInt16 NumberFeatureButtonCaps;      &lt;br /&gt;&amp;#160;&amp;#160; public UInt16 NumberFeatureValueCaps;      &lt;br /&gt;&amp;#160;&amp;#160; public UInt16 NumberFeatureDataIndices;      &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;And a number of system constants&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;internal const uint DIGCF_PRESENT = 0x00000002;     &lt;br /&gt;internal const uint DIGCF_DEVICEINTERFACE = 0x00000010;      &lt;br /&gt;internal const uint GENERIC_READ = 0x80000000;      &lt;br /&gt;internal const uint GENERIC_WRITE = 0x40000000;      &lt;br /&gt;internal const uint FILE_SHARE_READ = 0x00000001;      &lt;br /&gt;internal const uint FILE_SHARE_WRITE = 0x00000002;      &lt;br /&gt;internal const int OPEN_EXISTING = 3;      &lt;br /&gt;internal const int FILE_FLAG_OVERLAPPED = 0x40000000;      &lt;br /&gt;internal const uint MAX_USB_DEVICES = 16;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Now, we are ready to start. So let’s find all devices and get its information&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Native.HidD_GetHidGuid(ref _hidGuid);     &lt;br /&gt;hHidDeviceInfo = Native.SetupDiGetClassDevs(ref _hidGuid, null, IntPtr.Zero, Native.DIGCF_PRESENT | Native.DIGCF_DEVICEINTERFACE);&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Now, if a handle we get is valid, we should search our specific device. For this purpose, we have to read device interface information and then get details info about this device.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;if (hHidDeviceInfo.ToInt32() &amp;gt; -1) {     &lt;br /&gt;&amp;#160;&amp;#160; uint i = 0;      &lt;br /&gt;&amp;#160;&amp;#160; while (!isValid &amp;amp;&amp;amp; i &amp;lt; Native.MAX_USB_DEVICES) {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var hidDeviceInterfaceData = new Native.SP_DEVICE_INTERFACE_DATA();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; hidDeviceInterfaceData.cbSize = Marshal.SizeOf(hidDeviceInterfaceData);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (Native.SetupDiEnumDeviceInterfaces(hHidDeviceInfo, 0, ref _hidGuid, i, ref hidDeviceInterfaceData)) {&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Once we have all this and information is valid, let’s detect its capabilities&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;bool detailResult;     &lt;br /&gt;uint length, required;      &lt;br /&gt;Native.SetupDiGetDeviceInterfaceDetail(hHidDeviceInfo, ref hidDeviceInterfaceData, IntPtr.Zero, 0, out length, IntPtr.Zero);      &lt;br /&gt;var hidDeviceInterfaceDetailData = new Native.PSP_DEVICE_INTERFACE_DETAIL_DATA();      &lt;br /&gt;hidDeviceInterfaceDetailData.cbSize = 5; //DWORD cbSize (size 4) + Char[0] (size 1) for 32bit only!      &lt;br /&gt;var hDeviceInterfaceDetailData = Marshal.AllocHGlobal(Marshal.SizeOf(hidDeviceInterfaceDetailData));      &lt;br /&gt;Marshal.StructureToPtr(hidDeviceInterfaceDetailData, hDeviceInterfaceDetailData, true);      &lt;br /&gt;detailResult = Native.SetupDiGetDeviceInterfaceDetail(hHidDeviceInfo, ref hidDeviceInterfaceData, hDeviceInterfaceDetailData, length, out required, IntPtr.Zero);      &lt;br /&gt;Marshal.PtrToStructure(hDeviceInterfaceDetailData, hidDeviceInterfaceDetailData);      &lt;br /&gt;if (detailResult) {&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;To do this, we have to create memory file first and then share device attributes by using this file.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;base.handle = Native.CreateFile(hidDeviceInterfaceDetailData.DevicePath,      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Native.GENERIC_READ |      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Native.GENERIC_WRITE,      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Native.FILE_SHARE_READ |      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Native.FILE_SHARE_WRITE,       &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IntPtr.Zero,      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Native.OPEN_EXISTING,      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Native.FILE_FLAG_OVERLAPPED,       &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IntPtr.Zero);      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (base.handle.ToInt32() &amp;gt; -1) {      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Native.HIDD_ATTRIBUTES hidDeviceAttributes;      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (Native.HidD_GetAttributes(base.handle, out hidDeviceAttributes)) {&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;All the rest is straight forward. Just compare info retrieved with one we already have. And, of cause, release all resources were used (remember, we’re in win32 api world!)&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;if ((hidDeviceAttributes.VendorID == vid) &amp;amp;&amp;amp; (hidDeviceAttributes.ProductID == pid)) {     &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; isValid = true;      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ProductID = pid;      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; VendorID = vid;      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; VersionNumber = hidDeviceAttributes.VersionNumber;      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IntPtr buffer = Marshal.AllocHGlobal(126);//max alloc for string;      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (Native.HidD_GetProductString(this.handle, buffer, 126)) Name = Marshal.PtrToStringAuto(buffer);      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (Native.HidD_GetSerialNumberString(this.handle, buffer, 126)) SerialNumber = Marshal.PtrToStringAuto(buffer);      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Marshal.FreeHGlobal(buffer);      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var capabilities = new Native.HIDP_CAPS();      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IntPtr hPreparsedData;      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (Native.HidD_GetPreparsedData(this.handle, out hPreparsedData)) {      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (Native.HidP_GetCaps(hPreparsedData, out capabilities)) FeatureReportLength = capabilities.FeatureReportByteLength;      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Native.HidD_FreePreparsedData(hPreparsedData);      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&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;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;      &lt;br /&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;&amp;#160;&amp;#160;&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;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } else {      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Native.CloseHandle(base.handle);      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Marshal.FreeHGlobal(hDeviceInterfaceDetailData);      &lt;br /&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;&amp;#160;&amp;#160; }      &lt;br /&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;&amp;#160;&amp;#160; i++; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Now we have a handle to our device and can manipulate it. Like this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;using (var device = USBRadioDevice.FindDevice(0x0000, 0x1111)) {     &lt;br /&gt;…      &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;But we still have to provide methods for such usage. Here there are no very complicated code.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;public static USBDevice FindDevice(uint pid, uint vid) {     &lt;br /&gt;&amp;#160;&amp;#160; var device = new USBDevice(pid,vid);      &lt;br /&gt;&amp;#160;&amp;#160; var fillRegisters = device.InitRegisters();      &lt;br /&gt;&amp;#160;&amp;#160; if (!device.IsInvalid &amp;amp;&amp;amp; fillRegisters) return device;      &lt;br /&gt;&amp;#160;&amp;#160; else throw new ArgumentOutOfRangeException(string.Format(&amp;quot;Human input device {0} was not found.&amp;quot;, pid));      &lt;br /&gt;} &lt;/p&gt;    &lt;p&gt;public override string ToString() {     &lt;br /&gt;&amp;#160;&amp;#160; return string.Format(&amp;quot;{0} (Product:{1:x}, Vendor:{2:x}, Version:{3:x}, S/N:{4})&amp;quot;, Name, ProductID, VendorID, VersionNumber, SerialNumber);      &lt;br /&gt;} &lt;/p&gt;    &lt;p&gt;[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]     &lt;br /&gt;protected override bool ReleaseHandle() {      &lt;br /&gt;&amp;#160;&amp;#160; return Native.CloseHandle(base.handle);      &lt;br /&gt;} &lt;/p&gt;    &lt;p&gt;#region IDisposable Members     &lt;br /&gt;public void Dispose() {      &lt;br /&gt;&amp;#160;&amp;#160; Dispose(true);      &lt;br /&gt;&amp;#160;&amp;#160; GC.SuppressFinalize(this); &lt;/p&gt;    &lt;p&gt;}     &lt;br /&gt;[SecurityPermission(SecurityAction.Demand, UnmanagedCode = true)]      &lt;br /&gt;void IDisposable.Dispose() {      &lt;br /&gt;&amp;#160;&amp;#160; if (base.handle != null &amp;amp;&amp;amp; !base.IsInvalid) {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Free the handle      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; base.Dispose();      &lt;br /&gt;&amp;#160;&amp;#160; }      &lt;br /&gt;} &lt;/p&gt;    &lt;p&gt;#endregion&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;We done. Have a nice day and be good people.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=204291" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/tutorial/default.aspx">tutorial</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Tips+and+Tricks/default.aspx">Tips and Tricks</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WPF+crossbow/default.aspx">WPF crossbow</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/source/default.aspx">source</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Vista/default.aspx">Vista</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Work+process/default.aspx">Work process</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Windows+7/default.aspx">Windows 7</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Hardware/default.aspx">Hardware</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Interop/default.aspx">Interop</category></item><item><title>Programming for Windows 7</title><link>http://blogs.microsoft.co.il/blogs/tamir/archive/2008/11/09/programming-for-windows-7.aspx</link><pubDate>Sun, 09 Nov 2008 17:12:38 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:163503</guid><dc:creator>Tamir Khason</dc:creator><slash:comments>3</slash:comments><description>&lt;h3&gt;[This blog was migrated. You will not be able to comment here.&lt;br /&gt;The new URL of this post is &lt;a href="http://khason.net/blog/programming-for-windows-7/"&gt;http://khason.net/blog/programming-for-windows-7/&lt;/a&gt;]&lt;/h3&gt;&lt;hr /&gt;&lt;p&gt;Well, Windows 7 is going to be released by the end of next year. This is great news, because it seemed, that Microsoft finally understand how to get the best of Windows Vista and make it to work not only on &lt;a href="http://www.top500.org/"&gt;monster machines&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;border-top:0px;border-right:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/ProgrammingforWindows7_10DE0/image_3.png" width="600" height="397" /&gt; &lt;/p&gt; &lt;p&gt;It even works on new brandy my wife&amp;#39;s pinky machine. And if it works there and my wife is happy with it, this OS going to be very impressive.&lt;/p&gt; &lt;p&gt;&lt;img border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/ProgrammingforWindows7_10DE0/image_58bf6973-bdc1-44d9-8649-f24e6255e65f.png" width="529" height="397" /&gt; &lt;/p&gt; &lt;p&gt;But from the other hand, we, as developers should be ready today to developer Windows 7 ready application (by the way, &lt;a target="_blank" href="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Vista+Battery+Saver/default.aspx"&gt;Vista Battery Saver&lt;/a&gt; works for Windows 7 as well as for Windows Vista, in spite of the fact, that power management in Windows 7 was improved dramatically). So let&amp;#39;s start!&lt;/p&gt; &lt;p&gt;First thing we need is to read big &lt;a target="_blank" href="http://code.msdn.microsoft.com/Win7DeveloperGuide/Release/ProjectReleases.aspx"&gt;Windows 7 Developer Guide&lt;/a&gt;. This document will explain most of new features for developers to build applications right. What is includes?&lt;/p&gt; &lt;h3&gt;Windows Driver Kit (WDK) 3.0&lt;/h3&gt; &lt;p&gt;Basically, Windows 7 works with Vista drivers, however, hibernation, power management, networking, PREfast will work much better. You also will have new WMI access for reliability monitors and ACPI. &lt;/p&gt; &lt;h3&gt;Management and deployment&lt;/h3&gt; &lt;p&gt;By default Windows 7 uses PowerShell 2.0 and Windows Installer. For PowerShell it includes enhanced cmdlets to manage Active Directory, IIS, etc. For Windows Installer, you finally can build &amp;quot;chainers&amp;quot; by yourself (the same approach, used for latest deployment of Microsoft products such as &lt;a target="_blank" href="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Silverlight/default.aspx"&gt;Silverlight&lt;/a&gt;, &lt;a target="_blank" href="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Visual+Studio/default.aspx"&gt;Visual Studio 2008 SP1&lt;/a&gt; etc.) Also, you can get advantage by using Windows Filtering Platform (Firewall) and User Account Control (UAC) from inside your application by using new APIs. &lt;/p&gt; &lt;h3&gt;Performance&lt;/h3&gt; &lt;p&gt;The most significant change in Windows 7 for end-user point of view is improved performance. Windows 7 kernel is much smaller, that kernel of Windows Vista. Also it uses specific patterns to decrease background activities on low power, based on system triggers. New user-mode and kernel-mode APIs are used by Windows Drivers Foundation much more efficiently. Also system services are much smarter. For example, DCIA starts only when you connect new hardware. After drivers were installed the service shuts down. The same approach used by domain join, GP changes, new IP fetching etc. Windows 7 knows to run and stop services, based on system events, which decreases average work load and enhances whole system performance. &lt;/p&gt; &lt;h3&gt;Multi-touch gestures and Interia API and used interface in general&lt;/h3&gt; &lt;p&gt;Yes, you can use this API for your applications. Finally we can have more, then just mouse. And it is not only about multiple mouse devices. We can use single finder panning, raw touch input data, internal multitouch ink recognition, which is also supports math. Also it uses build-in MathML export feature. &lt;/p&gt; &lt;p&gt;There are a lot of other enhancements, such as smart bars, windows&amp;#39; stacking, gadget desktop (it does not eat battery as external process anymore), system ribbon menu integration. etc&lt;/p&gt; &lt;h3&gt;Graphics&lt;/h3&gt; &lt;p&gt;Direct 11, new Direct2D, DirectWrite (we can turn text anti-aliasing for small fonts, hurrah!), improved WIC, DX/GDI interoperability on system level with automatic fallback for weak hardware (yes, you should not be worry about it anymore). Also new video and audio format support with &lt;u&gt;human readable interfaces&lt;/u&gt;. Yes, no more DirectDraw hacks. We can use new high level interfaces such as MFPlay to manage playbacks, Source Reader for decoding, Sink Writer for transcoders and re-coding compressions.&lt;/p&gt; &lt;h3&gt;Web and communication&lt;/h3&gt; &lt;p&gt;WCF is inside, as well as distributed routing table for peer-to-peer operations. BranchCache - new technology to reduce WAN traffic and latency. &lt;/p&gt; &lt;p&gt;Also Windows 7 is compatible with &lt;a target="_blank" href="http://www.opensearch.org"&gt;OpenSearch&lt;/a&gt; (I told, that Microsoft does not know to build search engines). Sharepoint integration and environment sensors platform, that can be used either for desktop and web applications. &lt;/p&gt; &lt;p&gt;There are much more features, that makes Windows 7 to pretend to be very good operation system. If you want to learn more about all those Windows 7 new features, I highly advice you to &lt;a target="_blank" href="http://code.msdn.microsoft.com/Win7DeveloperGuide/Release/ProjectReleases.aspx"&gt;download and read this document&lt;/a&gt;. It includes most of new features of new OS with explanations and screenshots to make your learn and understand what can your future application do with all those new features.&lt;/p&gt; &lt;p&gt;Have a nice day and be good people.&lt;/p&gt; &lt;p&gt;BTW, if you have PDC version of Windows 7 and want to unlock it for using of some cool features, &lt;a target="_blank" href="http://channel9.msdn.com/pdc2008/KYN02/"&gt;introduced during keynotes&lt;/a&gt;, it worth &lt;a target="_blank" href="http://www.withinwindows.com/2008/11/02/flashy-windows-7-bits-protected-by-elaborate-scheme-workaround/"&gt;to visit here&lt;/a&gt; and learn how to :)&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Download &lt;/strong&gt;&lt;a href="http://code.msdn.microsoft.com/Win7DeveloperGuide"&gt;&lt;strong&gt;Windows 7 Developer Guide&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; and start programming.&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=163503" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/tutorial/default.aspx">tutorial</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/promo/default.aspx">promo</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Vista/default.aspx">Vista</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/demos/default.aspx">demos</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/download/default.aspx">download</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/blogging+general/default.aspx">blogging general</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Vista+Battery+Saver/default.aspx">Vista Battery Saver</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/XPS/default.aspx">XPS</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/DirectX/default.aspx">DirectX</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/TECH/default.aspx">TECH</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Windows+7/default.aspx">Windows 7</category></item><item><title>What’s new in MSDN Downloads?</title><link>http://blogs.microsoft.co.il/blogs/tamir/archive/2008/05/20/what-s-new-in-msdn-downloads.aspx</link><pubDate>Tue, 20 May 2008 18:02:41 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:90693</guid><dc:creator>Tamir Khason</dc:creator><slash:comments>4</slash:comments><description>&lt;h3&gt;[This blog was migrated. You will not be able to comment here.&lt;br /&gt;The new URL of this post is &lt;a href="http://khason.net/blog/what%e2%80%99s-new-in-msdn-downloads/"&gt;http://khason.net/blog/what%e2%80%99s-new-in-msdn-downloads/&lt;/a&gt;]&lt;/h3&gt;&lt;hr /&gt;&lt;p&gt;Just look how many new releases those days in MSDN Download web site.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Virtual PC 2007 SP1 – &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=28c97d22-6eb8-4a09-a7f7-f6c7a1f000b5&amp;amp;displaylang=en&amp;amp;tm" target="_blank"&gt;download&lt;/a&gt; and &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=9f3d3eb5-5e03-4712-999c-e96f91bdf128&amp;amp;displaylang=en&amp;amp;tm" target="_blank"&gt;release notes&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Scriptomatic 2.0 - &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=d87daf50-e487-4b0b-995c-f36a2855016e&amp;amp;displaylang=en&amp;amp;tm" target="_blank"&gt;download&lt;/a&gt; (uses PowerShell 1.0)&lt;/li&gt;    &lt;li&gt;Windows PowerShell V2 CTP2 - &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=7c8051c2-9bfc-4c81-859d-0864979fa403&amp;amp;displaylang=en&amp;amp;tm" target="_blank"&gt;download&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Office Live Update 1.1 - &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=98df1962-f351-4bd2-9ed2-eaafed67996d&amp;amp;displaylang=en&amp;amp;tm" target="_blank"&gt;download&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;.NET Framework 3.5 SP1 beta – &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=23516c63-2db2-4e7f-aaba-32b12d6e025c&amp;amp;displaylang=en&amp;amp;tm" target="_blank"&gt;download&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Visual Studio 2008 SP1 beta - &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=cf99c752-1391-4bc3-babc-86bc0b9e8e5a&amp;amp;displaylang=en&amp;amp;tm" target="_blank"&gt;download&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Microsoft Expression Blend 2.5 March 2008 Preview - &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=32a3e916-e681-4955-bc9f-cfba49273c7c&amp;amp;displaylang=en&amp;amp;tm" target="_blank"&gt;download&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Microsoft Office for MAC SP1 – &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=395d1487-a3a6-4106-a0f8-4d6e1d6d89d2&amp;amp;displaylang=en&amp;amp;tm" target="_blank"&gt;download&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Windows XP SP3 – download as &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=2FCDE6CE-B5FB-4488-8C50-FE22559D164E&amp;amp;displaylang=en" target="_blank"&gt;ISO&lt;/a&gt; or as &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=5B33B5A8-5E76-401F-BE08-1E1555D4F3D4&amp;amp;displaylang=en" target="_blank"&gt;NEP&lt;/a&gt; + &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=60807C3A-8969-4DDF-BEB2-8BFAC9ED416B&amp;amp;displaylang=en" target="_blank"&gt;release notes&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Symbols package for Microsoft XP Service Pack 3 – &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=e0991ed0-eae0-4730-89a9-3a3b383fb3e1&amp;amp;displaylang=en&amp;amp;tm" target="_blank"&gt;download&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Outlook 2007/2003/2002 Add-in for Personal Folder Backup – &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=8b081f3a-b7d0-4b16-b8af-5a6322f4fd01&amp;amp;displaylang=en&amp;amp;tm" target="_blank"&gt;download&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;XNA Game Studio 3.0 CTP – &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=df4af56a-58a7-474c-bfd0-7cf8ed3036a3&amp;amp;displaylang=en&amp;amp;tm" target="_blank"&gt;download&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Too much – too cool. Turn your download managers on&lt;/p&gt;  &lt;p&gt;&lt;img title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/WhatsnewinMSDNDownloads_C577/image_af0d591e-8091-4528-97ee-114ffe41a816.png" width="332" height="232" /&gt; &lt;/p&gt;  &lt;p&gt;Have a nice day&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=90693" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/soft/default.aspx">soft</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/promo/default.aspx">promo</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Vista/default.aspx">Vista</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/tools/default.aspx">tools</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/download/default.aspx">download</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/VSTS/default.aspx">VSTS</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Web/default.aspx">Web</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category></item><item><title>Using Vista Preview Handlers in WPF application</title><link>http://blogs.microsoft.co.il/blogs/tamir/archive/2008/04/18/using-vista-preview-handlers-in-wpf-application.aspx</link><pubDate>Fri, 18 Apr 2008 18:08:56 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:80309</guid><dc:creator>Tamir Khason</dc:creator><slash:comments>2</slash:comments><description>&lt;h3&gt;[This blog was migrated. You will not be able to comment here.&lt;br /&gt;The new URL of this post is &lt;a href="http://khason.net/blog/using-vista-preview-handlers-in-wpf-application/"&gt;http://khason.net/blog/using-vista-preview-handlers-in-wpf-application/&lt;/a&gt;]&lt;/h3&gt;&lt;hr /&gt;&lt;p&gt;First of all what is Preview Handler? &lt;a href="http://msdn2.microsoft.com/en-us/library/bb776867.aspx" target="_blank"&gt;Preview Handler&lt;/a&gt; is COM object, that called when you want to display the preview of your item. Other words, Preview Handlers are lightweight, rich and read-only previews of file&amp;#8217;s content in a reading pane. You can find preview handlers in Microsoft Outlook 2007, Windows Vista and, even sometimes in XP. Can we use preview handlers within your WPF application? Probably we can. Let&amp;#8217;s see how we can do it.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/UsingVistaPreviewHandlersinWPFapplicatio_C6E7/image_58e0c4d5-f2ad-4cb8-91e7-ed10aaa17fd2.png" width="610" height="259" /&gt; &lt;/p&gt;  &lt;p&gt;Let&amp;#8217;s create simple WPF window, that displays file list from left and preview of items in right side. We&amp;#8217;ll use simple file list string collection as our datasource, bind it to Listbox Items and then bind selected item to some contentpresenter. I &lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/2008/03/05/binding-to-current-item-external-collection-management-datatemplates-and-datatriggers.aspx" target="_blank"&gt;blogged about this approach earlier&lt;/a&gt;.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;Grid DataContext={StaticResource files}&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Grid.ColumnDefinitions&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ColumnDefinition Width=&amp;quot;.2*&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ColumnDefinition Width=&amp;quot;.8*&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Grid.ColumnDefinitions&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ListBox ItemsSource={Binding} IsSynchronizedWithCurrentItem=&amp;quot;True&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ContentPresenter Grid.Column=&amp;#8221;1&amp;#8221; Content={Binding Path=/}/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;GridSplitter Width=&amp;quot;5&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Grid&amp;gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Our data source should be updated automatically within changes of file system. So, this is very good chance to use FileSystemWatcher object.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;class ListManager:ThreadSafeObservableCollection&amp;lt;string&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string dir = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public ListManager()      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; FileSystemWatcher fsw = new FileSystemWatcher(dir);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fsw.NotifyFilter = NotifyFilters.FileName | NotifyFilters.Size | NotifyFilters.LastWrite;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fsw.Created += new FileSystemEventHandler(fsw_Created);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fsw.Deleted += new FileSystemEventHandler(fsw_Deleted); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fsw.EnableRaisingEvents = true; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string[] files = Directory.GetFiles(dir);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (int i = 0; i &amp;lt; files.Length; i++)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160; base.Add(files[i]);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; void fsw_Deleted(object sender, FileSystemEventArgs e)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; base.Remove(e.FullPath);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; void fsw_Created(object sender, FileSystemEventArgs e)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; base.Add(e.FullPath);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Now, after applying simple DataTemplate, we can see file list in the left pane of our application. It will be updated automatically upon files change in certain directory.&lt;/p&gt;  &lt;p&gt;Next step is to understand how to use Preview Handlers within custom application. After all, preview handler is regular COM object, that implements following interfaces&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;[ComImport]     &lt;br /&gt;[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]      &lt;br /&gt;[Guid(&amp;quot;8895b1c6-b41f-4c1c-a562-0d564250836f&amp;quot;)]      &lt;br /&gt;interface IPreviewHandler      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; void SetWindow(IntPtr hwnd, ref RECT rect);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; void SetRect(ref RECT rect);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; void DoPreview();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; void Unload();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; void SetFocus();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; void QueryFocus(out IntPtr phwnd);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [PreserveSig]      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; uint TranslateAccelerator(ref MSG pmsg);      &lt;br /&gt;} &lt;/p&gt;    &lt;p&gt;[ComImport]     &lt;br /&gt;[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]      &lt;br /&gt;[Guid(&amp;quot;b7d14566-0509-4cce-a71f-0a554233bd9b&amp;quot;)]      &lt;br /&gt;interface IInitializeWithFile      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; void Initialize([MarshalAs(UnmanagedType.LPWStr)] string pszFilePath, uint grfMode);      &lt;br /&gt;} &lt;/p&gt;    &lt;p&gt;[ComImport]     &lt;br /&gt;[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]      &lt;br /&gt;[Guid(&amp;quot;b824b49d-22ac-4161-ac8a-9916e8fa3f7f&amp;quot;)]      &lt;br /&gt;interface IInitializeWithStream      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; void Initialize(IStream pstream, uint grfMode);      &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;In order to find and attach preview handler to specific file type, all we have to do is to look into HKEY_CLASSES_ROOT and find COM Guid of preview handler (8895b1c6-b41f-4c1c-a562-0d564250836f). The default value of this key will be the Guid of COM object, that actually can preview this type of files. Let&amp;#8217;s do it&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;string CLSID = &amp;quot;8895b1c6-b41f-4c1c-a562-0d564250836f&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Guid g = new Guid(CLSID);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string[] exts = fileName.Split(&amp;#39;.&amp;#39;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string ext = exts[exts.Length - 1];      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; using (RegistryKey hk = Registry.ClassesRoot.OpenSubKey(string.Format(@&amp;quot;.{0}\ShellEx\{1:B}&amp;quot;, ext, g)))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160; if (hk != null)      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; g = new Guid(hk.GetValue(&amp;quot;&amp;quot;).ToString());&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Now, we know, that this file can be previewed, thus let&amp;#8217;s initialize appropriate COM instance for preview handler&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Type a = Type.GetTypeFromCLSID(g, true);     &lt;br /&gt;object o = Activator.CreateInstance(a);&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;There are two kinds of initializations for preview handlers &amp;#8211; file and stream based. Each one has it&amp;#8217;s own interface. So, we can only check if the object created implements this interface to be able to initialize the handler&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;IInitializeWithFile fileInit = o as IInitializeWithFile;     &lt;br /&gt;IInitializeWithStream streamInit = o as IInitializeWithStream; &lt;/p&gt;    &lt;p&gt;bool isInitialized = false;     &lt;br /&gt;if (fileInit != null)      &lt;br /&gt; {      &lt;br /&gt;&amp;#160;&amp;#160; fileInit.Initialize(fileName, 0);      &lt;br /&gt;&amp;#160;&amp;#160; isInitialized = true;      &lt;br /&gt;&amp;#160; }      &lt;br /&gt; else if (streamInit != null)      &lt;br /&gt;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; COMStream stream = new COMStream(File.Open(fileName, FileMode.Open));      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; streamInit.Initialize((IStream)streamInit, 0);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; isInitialized = true;      &lt;br /&gt;&amp;#160; }&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;After we initialized the handler we can set handle to the window we want the handler to sit in. Also we should provide bounds of region of the window to handler be placed in.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;if (isInitialized)     &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pHandler = o as IPreviewHandler;      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (pHandler != null)      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RECT r = new RECT(viewRect);      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pHandler.SetWindow(handler, ref r);      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pHandler.SetRect(ref r); &lt;/p&gt;    &lt;p&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pHandler.DoPreview();     &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So far so good, but we&amp;#8217;re in WPF. Thus ContentPresenter we&amp;#8217;re using has no handle! That&amp;#8217;s right, but the main WPF application window has. So, let&amp;#8217;s first get the main application window handle, then create rectangle bounds of the region, occupied by ContentControl.&lt;/p&gt;  &lt;p&gt;In order to do it, we&amp;#8217;ll derive from ContentPresenter and will listen to ActualtHeight and ActualeWidth property of it. First get the window handler (it wont be changed during the application life cycle), then update layout of our WPF Preview Handler for region and bounds of the control.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;class WPFPreviewHandler : ContentPresenter     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IntPtr mainWindowHandle = IntPtr.Zero;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Rect actualRect = new Rect(); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (e.Property == ContentControl.ActualHeightProperty | e.Property == ContentControl.ActualWidthProperty)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160; if (mainWindowHandle == IntPtr.Zero)      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; HwndSource hwndSource = PresentationSource.FromVisual(App.Current.MainWindow) as HwndSource;      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; mainWindowHandle = hwndSource.Handle;      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Point p0 = this.TranslatePoint(new Point(),App.Current.MainWindow);      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Point p1 = this.TranslatePoint(new Point(this.ActualWidth,this.ActualHeight),App.Current.MainWindow);      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; actualRect = new Rect(p0, p1);      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; mainWindowHandle.InvalidateAttachedPreview(actualRect);      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#8230;      &lt;br /&gt;&lt;/p&gt;    &lt;p&gt;public static void InvalidateAttachedPreview(this IntPtr handler, Rect viewRect)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (pHandler != null)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160; RECT r = new RECT(viewRect);      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160; pHandler.SetRect(ref r);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Now, the only thing we have to do is to listen for ContentProperty change and attache the preview handlers for displayed file to the control&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;if (e.Property == ContentControl.ContentProperty)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&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;&amp;#160;&amp;#160;&amp;#160; mainWindowHandle.AttachPreview(e.NewValue.ToString(),actualRect);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;We done. Last thing to do is to implement IStream interface in our COMStream C# class in order to be able to load streaming content (for example for PDF previewer)&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;public sealed class COMStream : IStream, IDisposable     &lt;br /&gt; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Stream _stream; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ~COMStream()     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (_stream != null)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&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; _stream.Close();      &lt;br /&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; _stream.Dispose();      &lt;br /&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; _stream = null;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private COMStream() { } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public COMStream(Stream sourceStream)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _stream = sourceStream;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region IStream Members &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void Clone(out IStream ppstm)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new NotSupportedException();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void Commit(int grfCommitFlags)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new NotSupportedException();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void CopyTo(IStream pstm, long cb, IntPtr pcbRead, IntPtr pcbWritten)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new NotSupportedException();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void LockRegion(long libOffset, long cb, int dwLockType)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new NotSupportedException();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [SecurityCritical]     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void Read(byte[] pv, int cb, IntPtr pcbRead)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int count = this._stream.Read(pv, 0, cb);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (pcbRead != IntPtr.Zero)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&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; Marshal.WriteInt32(pcbRead, count);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void Revert()     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new NotSupportedException();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [SecurityCritical]     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void Seek(long dlibMove, int dwOrigin, IntPtr plibNewPosition)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SeekOrigin origin = (SeekOrigin)dwOrigin;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; long pos = this._stream.Seek(dlibMove, origin);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (plibNewPosition != IntPtr.Zero)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&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; Marshal.WriteInt64(plibNewPosition, pos);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void SetSize(long libNewSize)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this._stream.SetLength(libNewSize);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void Stat(out System.Runtime.InteropServices.ComTypes.STATSTG pstatstg, int grfStatFlag)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pstatstg = new System.Runtime.InteropServices.ComTypes.STATSTG();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pstatstg.type = 2;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pstatstg.cbSize = this._stream.Length;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pstatstg.grfMode = 0;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (this._stream.CanRead &amp;amp;&amp;amp; this._stream.CanWrite)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&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; pstatstg.grfMode |= 2;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else if (this._stream.CanWrite &amp;amp;&amp;amp; !_stream.CanRead)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&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; pstatstg.grfMode |= 1;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&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; throw new IOException();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void UnlockRegion(long libOffset, long cb, int dwLockType)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new NotSupportedException();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [SecurityCritical]     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void Write(byte[] pv, int cb, IntPtr pcbWritten)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this._stream.Write(pv, 0, cb);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (pcbWritten != IntPtr.Zero)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&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; Marshal.WriteInt32(pcbWritten, cb);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region IDisposable Members &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void Dispose()     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (this._stream != null)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&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; this._stream.Close();      &lt;br /&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; this._stream.Dispose();      &lt;br /&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; this._stream = null;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion     &lt;br /&gt; } &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;And now we finished. We can use unmanaged preview handlers to display content of our files, hold by WPF application. Also, if you want, you can &lt;a href="http://msdn2.microsoft.com/en-us/magazine/cc163487.aspx" target="_blank"&gt;create your own preview handlers&lt;/a&gt; and they&amp;#8217;ll appear in your WPF application as well as they&amp;#8217;ll magically appear in Outlook. Following full source code for this article&lt;/p&gt;  &lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:4c033bbc-1f2f-4686-a55f-26926c847a06:3f6b4e35-04e4-4892-a6ac-7691820e5b2a" class="wlWriterSmartContent"&gt;&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/UsingVistaPreviewHandlersinWPFapplicatio_C6E7/PreviewHandlerWPF_1.zip" title="PreviewHandlerWPF.zip [27.5 Kb]"&gt;PreviewHandlerWPF.zip [27.5 Kb]&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;  &lt;p&gt;Good day, Happy Passover and, as always, be good people.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=80309" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/tutorial/default.aspx">tutorial</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Tips+and+Tricks/default.aspx">Tips and Tricks</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WPF+crossbow/default.aspx">WPF crossbow</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/source/default.aspx">source</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Vista/default.aspx">Vista</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/XPS/default.aspx">XPS</category></item><item><title>Some new post-mix downloads</title><link>http://blogs.microsoft.co.il/blogs/tamir/archive/2008/03/11/some-new-post-mix-downloads.aspx</link><pubDate>Tue, 11 Mar 2008 14:01:44 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:65288</guid><dc:creator>Tamir Khason</dc:creator><slash:comments>4</slash:comments><description>&lt;h3&gt;[This blog was migrated. You will not be able to comment here.&lt;br /&gt;The new URL of this post is &lt;a href="http://khason.net/blog/some-new-post-mix-downloads/"&gt;http://khason.net/blog/some-new-post-mix-downloads/&lt;/a&gt;]&lt;/h3&gt;&lt;hr /&gt;Today is download day at MSDN. There are some very interesting things published. &lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;New release of Windows SDK (new classes for WPF 3.5, bugs fixes, and enhanced support for Windows Server 2008, including speech, error reporting and UAC). &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=e6e1c3df-a74f-4207-8586-711ebe331cdc&amp;amp;amp;DisplayLang=en"&gt;Download it here&lt;/a&gt;. For more information, &lt;a href="http://blogs.msdn.com/windowssdk/archive/2008/03/01/integrating-windows-sdk-and-vs-with-new-sdk-configuration-tool.aspx"&gt;visit SDK blog&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Windows XP SP3 RC2 (it&amp;#39;s not &lt;a target="_blank" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=68c48dad-bc34-40be-8d85-6bb4f56f5110&amp;amp;amp;DisplayLang=en"&gt;final release&lt;/a&gt;), but if you want to try it (not in production environment) &lt;a target="_blank" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=114f3599-12af-42b2-aab1-b969a62c68a7&amp;amp;amp;DisplayLang=en"&gt;download it here&lt;/a&gt;. As well as if you are ready to harm your system. Give a try to &lt;a target="_blank" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=1a2e3ddd-b38b-439d-bba7-f179a5d3ecaf&amp;amp;amp;DisplayLang=en"&gt;Windows Internet Explorer 8 Beta 1 for XP&lt;/a&gt; (or for &lt;a target="_blank" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c3c6e8c1-bd91-490b-86f5-f3652dd691de&amp;amp;amp;DisplayLang=en"&gt;Vista/Home Server 2008&lt;/a&gt;, or &lt;a target="_blank" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=f2e76e1f-7592-4d74-a558-3cca1d7b5592&amp;amp;amp;DisplayLang=en"&gt;Windows Server 2003 SP2&lt;/a&gt;).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There are &lt;a target="_blank" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=df80d533-ba87-40b4-abe2-1ef12ea506b7&amp;amp;amp;DisplayLang=en"&gt;some fixes for Microsoft XNA Game Studio 2.0&lt;/a&gt; (make sure, that you know what is it. If not, come to see my TechEd session). Also, you can &lt;a target="_blank" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=d6a69b9f-2aef-4125-b162-edf0ae922caf&amp;amp;amp;DisplayLang=en"&gt;download Games for Windows - LIVE redistributable&lt;/a&gt; .&lt;br /&gt;&lt;/li&gt;&lt;li&gt;If you are lucky Zune owner, you can &lt;a target="_blank" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=6136349f-2b32-4946-83b5-a09775531ef4&amp;amp;amp;DisplayLang=en"&gt;download PC software 2.3 for it&lt;/a&gt;&lt;/li&gt;&lt;li&gt;If you Virtual Earth fun, &lt;a target="_blank" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=e9298080-50c4-4f2e-9fc4-4009074996ba&amp;amp;amp;DisplayLang=en"&gt;add realistic 3D capabilities&lt;/a&gt; to use &lt;a target="_blank" href="http://maps.live.com"&gt;online Live Search Maps&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;If you still have no Silverlight Tools for VS2008, be sure &lt;a target="_blank" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=e0bae58e-9c0b-4090-a1db-f134d9f095fd&amp;amp;amp;DisplayLang=en"&gt;to download it&lt;/a&gt; (this is not chained installer, tools only)&lt;/li&gt;&lt;/ul&gt;Enough for this morning. Warm up your download machines and start downloading.&lt;br /&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=65288" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/soft/default.aspx">soft</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Vista/default.aspx">Vista</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/download/default.aspx">download</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/VSTS/default.aspx">VSTS</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Web/default.aspx">Web</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/blogging+general/default.aspx">blogging general</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Windows+Live/default.aspx">Windows Live</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/XNA/default.aspx">XNA</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/PLINQ/default.aspx">PLINQ</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>A couple of updates - mega update post</title><link>http://blogs.microsoft.co.il/blogs/tamir/archive/2007/12/07/a-couple-of-updates-mega-update-post.aspx</link><pubDate>Fri, 07 Dec 2007 15:37:55 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:40411</guid><dc:creator>Tamir Khason</dc:creator><slash:comments>1</slash:comments><description>&lt;h3&gt;[This blog was migrated. You will not be able to comment here.&lt;br /&gt;The new URL of this post is &lt;a href="http://khason.net/blog/a-couple-of-updates-mega-update-post/"&gt;http://khason.net/blog/a-couple-of-updates-mega-update-post/&lt;/a&gt;]&lt;/h3&gt;&lt;hr /&gt;&lt;p&gt;Today, only updates&lt;/p&gt;  &lt;p&gt;Yahoo &lt;a href="http://www.ymessengerblog.com/blog/2007/12/05/yahoo-messenger-for-vista-preview-release-available/"&gt;finally releases Yahoo! Messenger for Vista&lt;/a&gt; - this was one of very first prototypes, shown in Mix last year. I did not install it, however, here a couple of review &lt;a href="http://eric.burke.name/dotnetmania/2007/12/06/0.05.32"&gt;Erik Burke&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/tims/archive/2007/12/06/great-wpf-applications-16-yahoo-messenger-for-windows-vista.aspx"&gt;Tim Sneath&lt;/a&gt; and &lt;a href="http://blogs.zdnet.com/Stewart/?p=661"&gt;Ryan Stewart&lt;/a&gt;. As for me, they lost &amp;quot;wow effect&amp;quot; last year&lt;img src="http://www.ymessengerblog.com/images/vistapreview.jpg" align="right" border="0" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img height="188" alt="image" src="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/Acoupleofupdatesmegaupdatepost_9578/image_a3e84d4c-935f-407d-bf43-a44d30726460.png" width="162" align="left" border="0" /&gt; &lt;a href="http://www.microsoft.com/expression/products/download.aspx?key=blend2preview"&gt;Microsoft Expression Blend 2 - December Preview&lt;/a&gt;. What&amp;#39;s new? VS2008 integration, inheritance, no SL2.0 support (strange, maybe, because of &lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/2007/11/29/silverlight-2-0-it-s-time-to-golive.aspx"&gt;breaking changes toward near beta&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Vista SP1 RC1 available for MSDN subscribers (via &lt;a href="http://windowsvistablog.com/blogs/windowsvista/archive/2007/12/05/announcing-windows-vista-sp1-release-candidate-rc.aspx"&gt;Nick Whites&lt;/a&gt;). Nothing special, 40 minutes of installation, profile information loss and performance fixes&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Office 2007 SP1 is expected to ship 10-December week. This time it is not RC or Beta, but final product (via &lt;a href="http://blogs.zdnet.com/microsoft/?p=1007"&gt;Mary Jo Foley&lt;/a&gt;). Great work.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Windows XP SP3 is very close to RC1, but nothing about public beta yet.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Starting today, you can configure &lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/2007/11/07/windows-live-messenger-web-api.aspx"&gt;Messenger presence&lt;/a&gt;.&amp;#160; Some cool features become available (via &lt;a href="http://blogs.msdn.com/angus_logan/archive/2007/12/05/announcement-new-capabilities-in-messenger-apis-smooth-sign-up-for-sharing-presence-presence-api-color-configuration-on-im-control.aspx"&gt;Angus Logan&lt;/a&gt;). &lt;a href="http://msdn2.microsoft.com/en-us/library/aa905675.aspx"&gt;Here is how&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/pdc2008"&gt;PDC 2008&lt;/a&gt; (canceled last year) will be on October 27-30 in LA (hello, &lt;a href="http://peterkellner.net"&gt;Peter&lt;/a&gt;). It promised to be great event about the company&amp;#39;s emerging services platform efforts, .NET, Windows and Mobile technologies.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;img height="300" alt="image" src="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/Acoupleofupdatesmegaupdatepost_9578/image_7e144ca7-5a26-4cd0-a8ce-db3b2fa9fca9.png" width="307" align="right" border="0" /&gt;A little about mobile devices, while waiting for my new mega-device (more information soon): Dell is about to &lt;a href="http://www.intomobile.com/2007/12/06/dell-smartphones-coming-in-2008.html"&gt;enter mobile phone industry&lt;/a&gt; in 2008, Opera &lt;a href="http://www.opera.com/pressreleases/en/2004/11/17/index.dml"&gt;compiled&lt;/a&gt; their browser for Brew platform (hello, &lt;a href="http://pelephone.co.il"&gt;Pelephone&lt;/a&gt;), while Google create &lt;a href="http://m.google.com"&gt;their mobile version&lt;/a&gt; for IPhone.&amp;#160; Windows Mobile 6.1 is going to be cool. &lt;a href="http://www.boygeniusreport.com/gallery/handsets/windows-mobile-61"&gt;Here screenshorts&lt;/a&gt;. Meanwhile, you can &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=4b106c1f-51e2-42f0-ba32-69bb7e9a3814&amp;amp;displaylang=en&amp;amp;tm"&gt;update your Mobile Office to version 6.1&lt;/a&gt; for free or your Nokia (N-series) with &lt;a href="http://europe.nokia.com/A4668051"&gt;Internet Radio application&lt;/a&gt;. As for me, &lt;a href="http://gizmodo.com/gadgets/cellphones/philips-xenium-99u-gets-fcc-love-325993.php"&gt;8 hours speak time and 30 days standby, quad-band&lt;/a&gt;. Those are features, that you need from your handy.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Well, that&amp;#39;s it for now. Have a nice weekend.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now I have a question for you. What do you think, about such format of posts? Should ?I go on with it or continue to write post-per-event?&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Thank you&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=40411" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/soft/default.aspx">soft</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Mobile/default.aspx">Mobile</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/promo/default.aspx">promo</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Vista/default.aspx">Vista</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/tools/default.aspx">tools</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/events/default.aspx">events</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/VSTS/default.aspx">VSTS</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Web/default.aspx">Web</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/blogging+general/default.aspx">blogging general</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Windows+Live/default.aspx">Windows Live</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Dell/default.aspx">Dell</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/x64/default.aspx">x64</category></item><item><title>Seek and hide x64 or where my Sound Recoder?</title><link>http://blogs.microsoft.co.il/blogs/tamir/archive/2007/12/04/seek-and-hide-x64-or-where-my-sound-recoder.aspx</link><pubDate>Tue, 04 Dec 2007 16:07:01 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:39515</guid><dc:creator>Tamir Khason</dc:creator><slash:comments>2</slash:comments><description>&lt;h3&gt;[This blog was migrated. You will not be able to comment here.&lt;br /&gt;The new URL of this post is &lt;a href="http://khason.net/blog/seek-and-hide-x64-or-where-my-sound-recoder/"&gt;http://khason.net/blog/seek-and-hide-x64-or-where-my-sound-recoder/&lt;/a&gt;]&lt;/h3&gt;&lt;hr /&gt;&lt;p&gt;Everyone knows a useful Windows utilities, SoundRecorder.exe application. I believe, that most of you knows where this application in your disk. If not, it&amp;#39;s always possible to look into shortcut.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img height="210" alt="image" src="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/Seekandhidex64orwheremySoundRecoder_9C4B/image_184a6425-573a-42b9-b2a3-5e4d6cb07a06.png" width="339" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;So, let&amp;#39;s go to %SystemRoot%\system32 and look for the application&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img height="213" alt="image" src="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/Seekandhidex64orwheremySoundRecoder_9C4B/image_864ae9ad-7d7b-40c3-a5f6-f9cbfa65c255.png" width="470" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;So far so good. Now, let&amp;#39;s look for this file by using File.Exist method of C#&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;File.Exists(@&amp;quot;%SystemRoot%\system32\SoundRecorder.exe&amp;quot;);&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;It returns &lt;strong&gt;true&lt;/strong&gt;. Of course, the file SoundRecorder.exe &lt;strong&gt;is there&lt;/strong&gt;. As well as all other &amp;quot;smart&amp;quot; methods for seeking for system directories&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;File.Exists(Environment.SystemDirectory + @&amp;quot;\SoundRecorder.exe&amp;quot;);     &lt;br /&gt;File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.System) + @&amp;quot;\SoundRecorder.exe&amp;quot;);&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;All those &lt;strong&gt;are true&lt;/strong&gt;. Now let&amp;#39;s compile the file not for &amp;quot;Any CPU&amp;quot;, but for x64. It still works! Why now, it is there. Now, let&amp;#39;s try to compile for x86 or, just run our process from other 32 bit process (emulation!). You&amp;#39;ll get &lt;strong&gt;false&lt;/strong&gt;. Sound Recorder just disappears in x86...&lt;/p&gt;  &lt;p&gt;Actually, the &lt;a href="http://msdn2.microsoft.com/en-us/library/bb427430.aspx"&gt;problem is x64 file system and registry redirection&lt;/a&gt;. Actually, the file exists, but not in C:\Windows\System32. It is in C:\Windows\Sysnative directory, which actually not exists. According MSDN, it should be transparent for your applications. Actually, it&amp;#39;s transparent for those applications, which works not in WOW64 mode.&lt;/p&gt;  &lt;p&gt;&lt;img height="56" alt="image" src="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/Seekandhidex64orwheremySoundRecoder_9C4B/image_ee90681a-3dd0-44d0-ad40-96cd316500f7.png" width="352" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;In order to make it work, you should expand the actual location, by using &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;File.Exists(Environment.ExpandEnvironmentVariables(@&amp;quot;%systemroot%\Sysnative&amp;quot;) + @&amp;quot;\SoundRecorder.exe&amp;quot;);&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Now, the file exists, but not in x64 mode. What to do? Check both locations? Probably yes (don&amp;#39;t forget to check the target platform). You can either disable registry redirection, by using native method.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;[DllImport(&amp;quot;advapi32.dll&amp;quot;, SetLastError = true)]     &lt;br /&gt;static extern int RegDisableReflectionKey(IntPtr hBase);&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;One thing is for sure. We should &lt;a href="http://msdn2.microsoft.com/en-us/library/aa286481.aspx"&gt;learn more&lt;/a&gt; about &lt;a href="http://msdn2.microsoft.com/en-us/netframework/aa569597.aspx"&gt;x64 applications&lt;/a&gt;. Maybe in this case, &lt;a href="http://msdn2.microsoft.com/en-us/library/bb427430.aspx"&gt;our programs&lt;/a&gt; begin to work much faster, by utilizing double power of &lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/2007/11/29/as-promised-i-reinstall-my-laptop-with-windows-vista-64bit.aspx"&gt;x64 processors&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;For your convenience, here the list of system programs, that can &amp;quot;fool you&amp;quot; in x64 platforms (Vista):&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="2"&gt;alg.exe       &lt;br /&gt;bcdedit.exe        &lt;br /&gt;BitLockerWizard.exe        &lt;br /&gt;bridgeunattend.exe        &lt;br /&gt;change.exe        &lt;br /&gt;chglogon.exe        &lt;br /&gt;chgport.exe        &lt;br /&gt;chgusr.exe        &lt;br /&gt;cofire.exe        &lt;br /&gt;CompMgmtLauncher.exe        &lt;br /&gt;consent.exe        &lt;br /&gt;csrss.exe        &lt;br /&gt;Defrag.exe        &lt;br /&gt;DeviceEject.exe        &lt;br /&gt;DFDWiz.exe        &lt;br /&gt;dfsr.exe        &lt;br /&gt;dispdiag.exe        &lt;br /&gt;dpinst.exe        &lt;br /&gt;dwm.exe        &lt;br /&gt;fsquirt.exe        &lt;br /&gt;fvenotify.exe        &lt;br /&gt;FXSCOVER.exe        &lt;br /&gt;FXSSVC.exe        &lt;br /&gt;FXSUNATD.exe        &lt;br /&gt;irftp.exe        &lt;br /&gt;Locator.exe        &lt;br /&gt;logoff.exe        &lt;br /&gt;lpksetup.exe        &lt;br /&gt;lpremove.exe        &lt;br /&gt;lsass.exe        &lt;br /&gt;mblctr.exe        &lt;br /&gt;MdRes.exe        &lt;br /&gt;MdSched.exe        &lt;br /&gt;mrt.exe        &lt;br /&gt;msconfig.exe        &lt;br /&gt;msdtc.exe        &lt;br /&gt;msg.exe        &lt;br /&gt;Narrator.exe        &lt;br /&gt;netcfg.exe        &lt;br /&gt;NetProj.exe        &lt;br /&gt;ntoskrnl.exe        &lt;br /&gt;nvcolor.exe        &lt;br /&gt;nvcplui.exe        &lt;br /&gt;nvudisp.exe        &lt;br /&gt;nvuninst.exe        &lt;br /&gt;p2phost.exe        &lt;br /&gt;PkgMgr.exe        &lt;br /&gt;plasrv.exe        &lt;br /&gt;PnPUnattend.exe        &lt;br /&gt;PnPutil.exe        &lt;br /&gt;poqexec.exe        &lt;br /&gt;PresentationSettings.exe        &lt;br /&gt;PrintBrmUi.exe        &lt;br /&gt;printfilterpipelinesvc.exe        &lt;br /&gt;PushPrinterConnections.exe        &lt;br /&gt;qappsrv.exe        &lt;br /&gt;qprocess.exe        &lt;br /&gt;query.exe        &lt;br /&gt;quser.exe        &lt;br /&gt;qwinsta.exe        &lt;br /&gt;rdpclip.exe        &lt;br /&gt;RelPost.exe        &lt;br /&gt;reset.exe        &lt;br /&gt;rstrui.exe        &lt;br /&gt;rwinsta.exe        &lt;br /&gt;sdclt.exe        &lt;br /&gt;setupcl.exe        &lt;br /&gt;shadow.exe        &lt;br /&gt;sigverif.exe        &lt;br /&gt;SLLUA.exe        &lt;br /&gt;SLsvc.exe        &lt;br /&gt;SLUI.exe        &lt;br /&gt;smss.exe        &lt;br /&gt;SnippingTool.exe        &lt;br /&gt;snmptrap.exe        &lt;br /&gt;SoundRecorder.exe        &lt;br /&gt;spoolsv.exe        &lt;br /&gt;srdelayed.exe        &lt;br /&gt;StikyNot.exe        &lt;br /&gt;tabcal.exe        &lt;br /&gt;tscon.exe        &lt;br /&gt;tsdiscon.exe        &lt;br /&gt;tskill.exe        &lt;br /&gt;ucsvc.exe        &lt;br /&gt;UI0Detect.exe        &lt;br /&gt;vds.exe        &lt;br /&gt;VSJitDebugger.exe        &lt;br /&gt;VSSVC.exe        &lt;br /&gt;wbadmin.exe        &lt;br /&gt;wbengine.exe        &lt;br /&gt;wercon.exe        &lt;br /&gt;WFS.exe        &lt;br /&gt;wiawow64.exe        &lt;br /&gt;winload.exe        &lt;br /&gt;winresume.exe        &lt;br /&gt;WinSAT.exe        &lt;br /&gt;wisptis.exe        &lt;br /&gt;wpcumi.exe        &lt;br /&gt;wpnpinst.exe        &lt;br /&gt;wsqmcons.exe        &lt;br /&gt;wuauclt.exe        &lt;br /&gt;WUDFHost.exe&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;font size="2"&gt;Have a nice day&lt;/font&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=39515" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/tutorial/default.aspx">tutorial</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Tips+and+Tricks/default.aspx">Tips and Tricks</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Vista/default.aspx">Vista</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/x64/default.aspx">x64</category></item><item><title>DEV411 - WPF for developers: optimizing your WPF application</title><link>http://blogs.microsoft.co.il/blogs/tamir/archive/2007/11/26/dev411-wpf-for-developers-optimizing-your-wpf-application.aspx</link><pubDate>Mon, 26 Nov 2007 14:04:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:37268</guid><dc:creator>Tamir Khason</dc:creator><slash:comments>3</slash:comments><description>&lt;h3&gt;[This blog was migrated. You will not be able to comment here.&lt;br /&gt;The new URL of this post is &lt;a href="http://khason.net/blog/dev411-wpf-for-developers-optimizing-your-wpf-application/"&gt;http://khason.net/blog/dev411-wpf-for-developers-optimizing-your-wpf-application/&lt;/a&gt;]&lt;/h3&gt;&lt;hr /&gt;&lt;p&gt;Less, then 24 hours until &lt;a href="http://blogs.microsoft.co.il/tags/DevAcademy2/"&gt;Developer Academy 2&lt;/a&gt; a lot of &lt;a href="http://blogs.microsoft.co.il/blogs/yochayk/archive/2007/11/23/36672.aspx"&gt;pressure&lt;/a&gt; and &lt;a href="http://blogs.microsoft.co.il/blogs/yochayk/archive/2007/11/25/37194.aspx"&gt;stress&lt;/a&gt;. Last fixes to my presentation - it&amp;#39;s too long now. A lot of stuff, I want to speak about, a lot of demos (mostly very bad performing applications, I&amp;#39;m dealing with), three computers (one is really cool with 8.9 Vista score) and, of cause, a lot of code to write. But I have only 75 minutes to do it all. So, I have to think a lot about how to do it all together with such tight timeframe (do you remember? - &lt;u&gt;9:30&lt;/u&gt;) &lt;/p&gt;
&lt;p&gt;What I&amp;#39;ll speak about? I&amp;#39;ll speak about cool luxury cars, really.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First of all, the most common problem, WPF developers faced with -&amp;nbsp;&lt;strong&gt;performance&lt;/strong&gt;. No, WPF scales it, but you should know how to do it smart way. &lt;/li&gt;
&lt;li&gt;Next, practices. Yes, there are practices and it&amp;#39;s worth to learn wisdom by the follies of others. So, I&amp;#39;ll speak about those follies. &lt;/li&gt;
&lt;li&gt;Why sometimes, pixel is matter, and sometimes it is not? &lt;/li&gt;
&lt;li&gt;What two threads, you are working with? Are there really two? Where the application problems&amp;nbsp;are lying?&lt;/li&gt;
&lt;li&gt;What is tier? How to measure it? How to know when I&amp;#39;m working with GPU and when with CPU? How to influence it?&lt;/li&gt;
&lt;li&gt;How much memory (either computer and graphic card) I need?&lt;/li&gt;
&lt;li&gt;What&amp;#39;s the greatest evil of your WPF application (that is not your customer)?&lt;/li&gt;
&lt;li&gt;How to scale very large bitmaps or very large amount of controls?&lt;/li&gt;
&lt;li&gt;How to easily make data virtualization by your own hands?&lt;/li&gt;
&lt;li&gt;How to create your own UI threads? Yes - you can do it!&lt;/li&gt;
&lt;li&gt;How to make your ListBox x70 times smaller and faster, your data x20 smaller and x700 faster&lt;/li&gt;
&lt;li&gt;How manage layout and measurement engines&lt;/li&gt;
&lt;li&gt;How to do things in background without paying application fees&lt;/li&gt;
&lt;li&gt;How to manage dispatchers&lt;/li&gt;
&lt;li&gt;How to use visual and data performance measurement tools and how to analyze and profile unmanaged resources&lt;/li&gt;
&lt;li&gt;How to make your application starts x400 faster and load resources on demand&lt;/li&gt;
&lt;li&gt;How to load XAML without loading System.Xml.dll and using DOM or SAX&lt;/li&gt;
&lt;li&gt;How to run the same WPF application on P3 with 128MB RAM and internal graphic card and Core Duo 2 with 4GB RAM and GeForce 880 GTX and get the same behavior of fast running application&lt;/li&gt;
&lt;li&gt;...and much much more...&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Waiting for you tomorrow at 9:30 AM (this is almost night, kind of morning) at Arbel hall of Avenue at Airport City near Ben Gurion airport. Come an hour before.&lt;/p&gt;
&lt;p&gt;&lt;img height="329" alt="image" src="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/DEV411WPFfordevelopersoptimizingyourWPFa_7FA7/image_ede9bfa4-3823-4906-860d-cd338a360268.png" width="640" border="0" /&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=37268" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/promo/default.aspx">promo</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Vista/default.aspx">Vista</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/events/default.aspx">events</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/demos/default.aspx">demos</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/DevAcademy2/default.aspx">DevAcademy2</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category></item><item><title>How to use Windows Vista Search API from WPF application?</title><link>http://blogs.microsoft.co.il/blogs/tamir/archive/2007/08/07/How-to-use-Windows-Vista-Search-API-from-WPF-application_3F00_.aspx</link><pubDate>Tue, 07 Aug 2007 22:05:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:21776</guid><dc:creator>Tamir Khason</dc:creator><slash:comments>2</slash:comments><description>&lt;h3&gt;[This blog was migrated. You will not be able to comment here.&lt;br /&gt;The new URL of this post is &lt;a href="http://khason.net/blog/how-to-use-windows-vista-search-api-from-wpf-application/"&gt;http://khason.net/blog/how-to-use-windows-vista-search-api-from-wpf-application/&lt;/a&gt;]&lt;/h3&gt;&lt;hr /&gt;&lt;p&gt;Another great service, provided by Windows Vista is it&amp;#39;s integrated search. Can we use it from our WPF application? Sure we can. This how you&amp;#39;ll do it. &lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:ccab1457-d04b-4ce8-8f1f-1370057b960a" style="PADDING-RIGHT:0px;DISPLAY:inline;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
&lt;div id="c49d069f-a583-4377-bfa4-3e9db7d2d1e3" style="PADDING-RIGHT:0px;DISPLAY:inline;PADDING-LEFT:0px;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;
&lt;div&gt;&lt;a href="http://soapbox.msn.com/video.aspx?vid=51764489-a63d-4fa7-8a96-3be94aeda051&amp;amp;from=writer" target="_new"&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;
&lt;object codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" height="400" width="550" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"&gt;&lt;param name="_cx" value="14552"&gt;&lt;param name="_cy" value="10583"&gt;&lt;param name="FlashVars" value=""&gt;&lt;param name="Movie" value="http://images.soapbox.msn.com/flash/soapbox1_1.swf?c=v&amp;amp;v=51764489-a63d-4fa7-8a96-3be94aeda051"&gt;&lt;param name="Src" value="http://images.soapbox.msn.com/flash/soapbox1_1.swf?c=v&amp;amp;v=51764489-a63d-4fa7-8a96-3be94aeda051"&gt;&lt;param name="WMode" value="Window"&gt;&lt;param name="Play" value="0"&gt;&lt;param name="Loop" value="-1"&gt;&lt;param name="Quality" value="High"&gt;&lt;param name="SAlign" value="LT"&gt;&lt;param name="Menu" value="-1"&gt;&lt;param name="Base" value=""&gt;&lt;param name="AllowScriptAccess" value=""&gt;&lt;param name="Scale" value="NoScale"&gt;&lt;param name="DeviceFont" value="0"&gt;&lt;param name="EmbedMovie" value="0"&gt;&lt;param name="BGColor" value=""&gt;&lt;param name="SWRemote" value=""&gt;&lt;param name="MovieData" value=""&gt;&lt;param name="SeamlessTabbing" value="1"&gt;&lt;param name="Profile" value="0"&gt;&lt;param name="ProfileAddress" value=""&gt;&lt;param name="ProfilePort" value="0"&gt;&lt;param name="AllowNetworking" value="all"&gt;&lt;param name="AllowFullScreen" value="false"&gt;
&lt;embed type="application/x-shockwave-flash" src="http://images.soapbox.msn.com/flash/soapbox1_1.swf?c=v&amp;amp;v=51764489-a63d-4fa7-8a96-3be94aeda051" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" width="550" height="400" quality="High"&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;First of all you&amp;#39;ll need to find Windows Search API library inside Windows SDK. Locate SearchAPI.tlb and process it with tlbimp tool to create managed assembly to reference to. You&amp;#39;ll get file, named SeachAPILib.dll. This one, you need. In order to use it, refer to MSDN documentation of &lt;a href="http://msdn2.microsoft.com/en-us/library/aa965362.aspx" target="_blank"&gt;Windows Search API 3.0&lt;/a&gt;. Actually, using of search API is not much different then using database queries. However, this is not so trivial in core. Actually, the syntax of Windows Search (AQS - Advanced Query Syntax) &lt;a href="http://msdn2.microsoft.com/en-us/library/aa965711.aspx" target="_blank"&gt;is very different&lt;/a&gt;. But search team create brilliant work to make our life easier. CSearchManager and ISeachQueryHelper - those translate AQS to SQL and, even provide us with proper connection string. &lt;/p&gt;
&lt;p&gt;Let&amp;#39;s start. First of all, we&amp;#39;ll have to create CSeachManager&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;    &lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR:#00ff00;"&gt;CSearchManager&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; &lt;/span&gt;cManager = &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;new&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt; &lt;/span&gt;&lt;span style="COLOR:#00ff00;"&gt;CSearchManagerClass&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;();&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;     &lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Then, while you are in query, you&amp;#39;ll create new ISearchQueryHelper to help you with translations and query strings&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;    &lt;br /&gt;ISearchQueryHelper cHelper = cManager.GetCatalog(&lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;&amp;quot;SYSTEMINDEX&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;).GetQueryHelper();
      &lt;br /&gt;cHelper.QuerySelectColumns = &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;&amp;quot;\&amp;quot;System.ItemNameDisplay\&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;;    &lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Well done, now. Ask Vista with old good OleDB provider&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;    &lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;using&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; (cConnection = &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; &lt;/span&gt;&lt;span style="COLOR:#00ff00;"&gt;OleDbConnection&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;(&lt;/pre&gt;
&lt;p&gt;      &lt;br /&gt; cHelper.ConnectionString))      &lt;br /&gt; {
      &lt;br /&gt; cConnection.Open();
      &lt;br /&gt; &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;using&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; (&lt;/span&gt;&lt;span style="COLOR:#00ff00;"&gt;OleDbCommand&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; cmd = &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; &lt;/span&gt;&lt;span style="COLOR:#00ff00;"&gt;OleDbCommand&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;(
      &lt;br /&gt; cHelper.GenerateSQLFromUserQuery(      &lt;br /&gt; SearchString      &lt;br /&gt; ),
      &lt;br /&gt; cConnection))      &lt;br /&gt; {
      &lt;br /&gt; &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; (cConnection.State == &lt;/span&gt;&lt;span style="COLOR:#00ff00;"&gt;ConnectionState&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;.Open)
      &lt;br /&gt; {
      &lt;br /&gt; &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;using&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; (&lt;/span&gt;&lt;span style="COLOR:#00ff00;"&gt;OleDbDataReader&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; reader = cmd.ExecuteReader())
      &lt;br /&gt; {      &lt;br /&gt; m_results.Clear();
      &lt;br /&gt; &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; 
      &lt;br /&gt; &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;while&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; (!reader.IsClosed &amp;amp;&amp;amp; reader.Read())
      &lt;br /&gt; {      &lt;br /&gt; m_results.Add(reader[0].ToString());
      &lt;br /&gt; &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; }      &lt;br /&gt; reader.Close();
      &lt;br /&gt;      &lt;br /&gt; &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; }      &lt;br /&gt; }
      &lt;br /&gt;      &lt;br /&gt; }      &lt;br /&gt; cConnection.Close();      &lt;br /&gt; }&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR:#0000ff;"&gt;&lt;/span&gt;Brilliant. Let&amp;#39;s move it into WPF by creating DependencyObject, that provide us with all we need for search - search string and array of results&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;    &lt;br /&gt; &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;public&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt; &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;static&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt; &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;readonly&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt; &lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;DependencyProperty&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt; SearchTextProperty = &lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;DependencyProperty&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;.Register(&lt;/span&gt;&lt;span style="COLOR:#008000;"&gt;&amp;quot;SearchText&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;, &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;typeof&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;(&lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;string&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;), &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;typeof&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;(&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;VistaSearchProviderHelper&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;), &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;new&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt; &lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;UIPropertyMetadata&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;(&lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;default&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;(&lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;string&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;),
      &lt;br /&gt; &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;new&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt; &lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;PropertyChangedCallback&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;(OnSearchTextChanged)));
      &lt;br /&gt;

      &lt;br /&gt; &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;static&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt; &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;void&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt; OnSearchTextChanged(&lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;DependencyObject&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt; sender, &lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;DependencyPropertyChangedEventArgs&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt; e)
      &lt;br /&gt; {

      &lt;br /&gt; &lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;//change
      &lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt; ToAbortFlag = IsWorkingFlag;
      &lt;br /&gt;

      &lt;br /&gt; &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;if&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt; (workerCallback == &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;null&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;)
      &lt;br /&gt; workerCallback = &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;new&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt; &lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;WaitCallback&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;(doSearch);
      &lt;br /&gt;

      &lt;br /&gt; searchObjState.SearchString = e.NewValue.ToString();

      &lt;br /&gt; &lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;//if (searchObjState.SearchString.Length &amp;gt; 2)
      &lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt; {
      &lt;br /&gt; workerCallback.BeginInvoke(searchObjState, &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;null&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;, &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;null&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;);
      &lt;br /&gt; }

      &lt;br /&gt;

      &lt;br /&gt; }    &lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;    &lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; SearchText
      &lt;br /&gt; {

      &lt;br /&gt; &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; { &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; GetValue(SearchTextProperty).ToString(); }
      &lt;br /&gt; &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; { SetValue(SearchTextProperty, &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;value&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;); }
      &lt;br /&gt; }

      &lt;br /&gt;

      &lt;br /&gt; &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;static&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; &lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;ThreadSafeObservableCollection&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt; m_results;
      &lt;br /&gt; &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; &lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;ReadOnlyObservableCollection&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt; Results
      &lt;br /&gt; {

      &lt;br /&gt; &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; { &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; &lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;ReadOnlyObservableCollection&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;(m_results); }
      &lt;br /&gt; }&amp;nbsp;
    &lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I think you know &lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/2007/04/22/Thread-safe-observable-collection.aspx" target="_blank"&gt;where to get thread safe observable collection&lt;/a&gt; :)&lt;/p&gt;
&lt;p&gt;The only thing we should do now is to bind input and output to XAML presentation&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;    &lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; &amp;lt;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;StackPanel&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; &lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;FocusManager.FocusedElement&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;{Binding ElementName=searchStr}&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;
      &lt;br /&gt; &amp;lt;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;StackPanel.DataContext&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;
      &lt;br /&gt; &amp;lt;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;ObjectDataProvider&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; &lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;ObjectType&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;l:VistaSearchProviderHelper&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;/&amp;gt;
      &lt;br /&gt; &amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;StackPanel.DataContext&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;
      &lt;br /&gt; &amp;lt;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;TextBox&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; &lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;Name&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;searchStr&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; &lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;Text&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;{Binding Path=SearchText, UpdateSourceTrigger=PropertyChanged }&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; &lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;FontSize&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;30&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;/&amp;gt;
      &lt;br /&gt; &amp;lt;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;ListBox&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; &lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;ItemsSource&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;{Binding Path=Results}&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt; /&amp;gt;
      &lt;br /&gt; &amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;StackPanel&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;    &lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;We done. Now we can search our Windows Vista from custom WPF application. This is not final application for sure, there is a long way to go to make it work perfectly, but this is the beginning of how to do it.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/tamir/attachment/21776.ashx"&gt;Source code for this article&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=21776" width="1" height="1"&gt;</description><enclosure url="http://blogs.microsoft.co.il/blogs/tamir/attachment/21776.ashx" length="120315" type="application/x-zip-compressed" /><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/tutorial/default.aspx">tutorial</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Tips+and+Tricks/default.aspx">Tips and Tricks</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/source/default.aspx">source</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Vista/default.aspx">Vista</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/download/default.aspx">download</category></item><item><title>WPF controls library, WPF bloggers give away, Silverlight as Forms examples, Virtualization, Hardware Assessment 2.0 for Windows Vista and WPC</title><link>http://blogs.microsoft.co.il/blogs/tamir/archive/2007/07/10/WPF-controls-library_2C00_-WPF-bloggers-give-away_2C00_-Silverlight-as-Forms-examples_2C00_-Virtualization-and-WPC.aspx</link><pubDate>Wed, 11 Jul 2007 01:04:18 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:18665</guid><dc:creator>Tamir Khason</dc:creator><slash:comments>1</slash:comments><description>[This blog was migrated. You will not be able to comment here. The new URL of this post is http://khason.net/blog/wpf-controls-library-wpf-bloggers-give-away-silverlight-as-forms-examples-virtualization-hardware-assessment-20-for-windows-vista-and-wpc/ ] Mike Swanson keeps up-to-day his list of WPF Tools and Controls . Absolutely useful page. Charles Petzold, the author of great WPF books , asks WPF bloggers to send him their blog and postal address, &amp;#39;cos he think, that those, who write about...(&lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/2007/07/10/WPF-controls-library_2C00_-WPF-bloggers-give-away_2C00_-Silverlight-as-Forms-examples_2C00_-Virtualization-and-WPC.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=18665" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/promo/default.aspx">promo</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Vista/default.aspx">Vista</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/events/default.aspx">events</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>Visual Studio "Orcas" June 2007 CTP is available</title><link>http://blogs.microsoft.co.il/blogs/tamir/archive/2007/07/06/Visual-Studio-_2200_Orcas_2200_-June-2007-CTP-is-available.aspx</link><pubDate>Fri, 06 Jul 2007 16:56:35 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:18351</guid><dc:creator>Tamir Khason</dc:creator><slash:comments>2</slash:comments><description>[This blog was migrated. You will not be able to comment here. The new URL of this post is http://khason.net/blog/visual-studio-orcas-june-2007-ctp-is-available/ ] After a limited beta Visual Studio 2008 (&amp;quot;Orcas&amp;quot;) June CTP VPC is available to wide public. A lot of bugs fixed (thank you all those who tested it), some new features added. Nice work! Download VS2008 June 2007 CTP VPC Technorati Tags: orcas , visual Studio.beta , VSTS , download , CTP , .NET framework 3.5 , WPF , WCF , WF...(&lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/2007/07/06/Visual-Studio-_2200_Orcas_2200_-June-2007-CTP-is-available.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=18351" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/soft/default.aspx">soft</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/promo/default.aspx">promo</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Vista/default.aspx">Vista</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/download/default.aspx">download</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/VSTS/default.aspx">VSTS</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WCF/default.aspx">WCF</category></item><item><title>"Acropolis" July CTP available now</title><link>http://blogs.microsoft.co.il/blogs/tamir/archive/2007/07/05/_2200_Acropolis_2200_-July-CTP-available-now.aspx</link><pubDate>Thu, 05 Jul 2007 13:31:55 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:18172</guid><dc:creator>Tamir Khason</dc:creator><slash:comments>0</slash:comments><description>[This blog was migrated. You will not be able to comment here. The new URL of this post is http://khason.net/blog/acropolis-july-ctp-available-now/ ] July is the best CTP time ever (a lot of sun in Redmond) Katy Kam from Acropolis team announced that Acropolis July CTP is release and can be downloaded here New features: Transition Animation improvements - you can now add transitions when changing page in TabLayoutPanes Better design time support - you can now use Application designer to select themes...(&lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/2007/07/05/_2200_Acropolis_2200_-July-CTP-available-now.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=18172" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/soft/default.aspx">soft</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/promo/default.aspx">promo</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Vista/default.aspx">Vista</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/download/default.aspx">download</category></item><item><title>Orcas June CTP for limited beta is available</title><link>http://blogs.microsoft.co.il/blogs/tamir/archive/2007/07/04/Orcas-June-CTP-for-limited-beta-is-available.aspx</link><pubDate>Wed, 04 Jul 2007 19:33:37 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:18092</guid><dc:creator>Tamir Khason</dc:creator><slash:comments>2</slash:comments><description>[This blog was migrated. You will not be able to comment here. The new URL of this post is http://khason.net/blog/orcas-june-ctp-for-limited-beta-is-available/ ] After releasing June CTP of .NET framework 3.5, June CTP bits of Visual Studio 2008 (Team Suite and Visual Web Developer) are also ready for limited beta as Layout or VPC image. If you want to test it, please let me know via comments or by contacting me directly. Technorati Tags: Orcas , Visual Studio , VSTS , beta , download , CTP , .NET...(&lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/2007/07/04/Orcas-June-CTP-for-limited-beta-is-available.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=18092" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/soft/default.aspx">soft</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/promo/default.aspx">promo</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Vista/default.aspx">Vista</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/download/default.aspx">download</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/VSTS/default.aspx">VSTS</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WCF/default.aspx">WCF</category></item><item><title>Roxio central in WPF</title><link>http://blogs.microsoft.co.il/blogs/tamir/archive/2007/02/23/Roxio-central-in-WPF.aspx</link><pubDate>Fri, 23 Feb 2007 16:48:05 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:8734</guid><dc:creator>Tamir Khason</dc:creator><slash:comments>0</slash:comments><description>[This blog was migrated. You will not be able to comment here. The new URL of this post is http://khason.net/blog/roxio-central-in-wpf/ ] More and more companies move their products to WPF. Actually, why now? Great technology, which able us to create outstanding UI with no time. FX-effects, geek-oriented user experience. New version of CD/DVD burning software from Roxio proofs my claims. Look yourself to free Roxio Central (beta) , build completely with WPF. Great work....(&lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/2007/02/23/Roxio-central-in-WPF.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=8734" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/soft/default.aspx">soft</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/promo/default.aspx">promo</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Vista/default.aspx">Vista</category></item></channel></rss>