<?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</title><link>http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Vista/default.aspx</link><description>Tags: Vista</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>Asus R50A UMPC review</title><link>http://blogs.microsoft.co.il/blogs/tamir/archive/2008/11/13/asus-r50a-umpc-review.aspx</link><pubDate>Thu, 13 Nov 2008 18:26:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:165513</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/asus-r50a-umpc-review/"&gt;http://khason.net/blog/asus-r50a-umpc-review/&lt;/a&gt;]&lt;/h3&gt;&lt;hr /&gt;&lt;p&gt;So, I got new branded &lt;a href="http://www.asus.com/products.aspx?l1=5&amp;amp;l2=25&amp;amp;l3=722&amp;amp;l4=0&amp;amp;model=2295&amp;amp;modelmenu=1" target="_blank"&gt;Asus R50A UMPC&lt;/a&gt; for test. This ultra mobile machine with 5.6&amp;quot; WSVGA (1024x768) screen, based on Intel US15W chipset, comes with Intel Atom Z520 (1.33 Ghz, 533Mhz) processor, 1Gb of RAM and 20GB SSD. Also it has 3.5G mobile unit, integrated 802.11b/g network card and GPS. First impression was very cool. Slick design, big screen build in fingerprint reader.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://www.flickr.com/photos/dedjo/3027945780/" target="_blank"&gt;&lt;img src="http://farm4.static.flickr.com/3034/3027945780_697d7fff14.jpg" alt="" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;a href="http://www.flickr.com/photos/dedjo/3027224451/" target="_blank"&gt;&lt;img src="http://farm4.static.flickr.com/3191/3027224451_296000114b.jpg" alt="" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;What in the box? Power adapter (110/220V), compact keyboard, bunch of cables, extra stilus and handling strap.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.flickr.com/photos/dedjo/3027970572" target="_blank"&gt;&lt;img src="http://farm4.static.flickr.com/3007/3027970572_feba1fdcc8.jpg" alt="" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;What else this machine has? Microcard reader, three mini-usb sockets, one regular USB and camera. Looks like pretty fine machine, but not for €1K+ price tag. But who cares when we buy real good gadget? However, my euphoria disappears during 6 minutes startup (this was not first startup - first took more, then 15 minutes).&lt;/p&gt; &lt;p&gt;It was preinstalled with Windows Vista SP1 Ultimate (for this tiny machine) aside with huge amount of Asus junkware, so it was was even unable even to calculate Vista experience score&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.flickr.com/photos/dedjo/3027956200/" target="_blank"&gt;&lt;img src="http://farm4.static.flickr.com/3140/3027956200_c13d658754.jpg" alt="" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Also it has no drivers for strange device, named &amp;quot;Mini Card&amp;quot; (with factory branded Asus OS installation)&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.flickr.com/photos/dedjo/3027130301/" target="_blank"&gt;&lt;img src="http://farm4.static.flickr.com/3026/3027130301_fb08e0b099.jpg" alt="" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Well, it&amp;#39;s probably because I&amp;#39;m still not connected to internet... Let&amp;#39;s connect office WiFi... Err... It has some troubles with wireless network discovery - 2 bars for 12 feet distance from access point (my W500 has all 5) and no other networks (with 4 and less bars on another machine). Let&amp;#39;s connect it. Hm, &amp;quot;unable to connect&amp;quot;... Weird. Leave it by now. This is multimedia device, so, probably, video will play better? Well, it failed also with playback of Windows sample movie. So maybe it has great battery life? Not really. Without doing anything new 2 cells, 2600mAh battery enough for less, then two hours (with &lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Vista+Battery+Saver/default.aspx" target="_blank"&gt;vista battery saver&lt;/a&gt; it extended to 3, while this device does not support aero interface).&lt;/p&gt; &lt;p&gt;But the final accord was this one (one again - this is branded Asus installation):&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/AsusR50AUMPCreview_11F63/image_dcd4f35d-1091-4cd4-a3da-81d8da693e6d.png" alt="image" width="529" border="0" height="397" /&gt; &lt;/p&gt; &lt;p&gt;Bottom line: 0&lt;b&gt;/5. I paid $360 for my wife&amp;#39;s pink &lt;a href="http://www.amazon.com/gp/product/B001DL2BUM?ie=UTF8&amp;amp;tag=israkniga-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B001DL2BUM"&gt;Acer Aspire One&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=israkniga-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=B001DL2BUM" style="margin:0px;" alt="" width="1" border="0" height="1" /&gt; and got much better computer (it even has camera).&lt;/b&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://twitpic.com/photos/tamir"&gt;&lt;img src="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/AsusR50AUMPCreview_11F63/image_4.png" alt="image" width="529" border="0" height="397" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;The only thing remains enigma for me is &lt;u&gt;why, the hell, this piece of crap costs more, then €1,000&lt;/u&gt;&lt;u&gt;?&lt;/u&gt;&lt;/p&gt; &lt;p&gt;Have a nice day and be good people - do not buy this machine!&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=165513" width="1" height="1"&gt;</description><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/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/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/OFFTOPIC/default.aspx">OFFTOPIC</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Hardware/default.aspx">Hardware</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>The Original Tetris on Windows Vista</title><link>http://blogs.microsoft.co.il/blogs/tamir/archive/2008/07/13/the-original-tetris-on-windows-vista.aspx</link><pubDate>Mon, 14 Jul 2008 02:12:07 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:115881</guid><dc:creator>Tamir Khason</dc:creator><slash:comments>5</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/the-original-tetris-on-windows-vista/"&gt;http://khason.net/blog/the-original-tetris-on-windows-vista/&lt;/a&gt;]&lt;/h3&gt;&lt;hr /&gt;&lt;p&gt;For last days I’m very busy with &lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Work+process/default.aspx"&gt;Bidi support for Silverlight development&lt;/a&gt;. Working a lot of hours in order to finish it until &lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/2008/06/13/presenting-at-teched-developers-south-africa-2008-durban.aspx"&gt;TechEd&lt;/a&gt;. So, I’m very tired and need relaxation. What can be better, then Tetris? But, there are millions of Tetrises. What to choose? What’s the question? &lt;a href="http://vadim.oversigma.com/Tetris.htm"&gt;The original one&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;&lt;img title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/TheOriginalTetrisonWindowsVista_13824/image_a0fdc6d7-c89c-4ad2-bf3e-b909e181019d.png" width="600" height="480" /&gt; &lt;/p&gt;  &lt;p&gt;This genius game was developed by Vadim Gerasimov, Alexey Pajitnov and Dmitry Pavlovsky about 20 years ago and it still working on Windows PC (even in Vista). This how to &lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/2007/12/03/software-is-sucks-probably-it-really-is.aspx"&gt;build software&lt;/a&gt;. As far as I know, today Vadim works in Google, Alexey in WildSnake and Vadim is commercial director somewhere in Russia.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;So, &lt;a href="http://vadim.oversigma.com/Tetris3.zip"&gt;download and play Tetris&lt;/a&gt; now. Unfourchantely, 16 bit &lt;a href="http://vadim.oversigma.com/Antix.zip"&gt;Antrix&lt;/a&gt; requires full screen emulation, that is not supported on Vista.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=115881" 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/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/download/default.aspx">download</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></item><item><title>How to consume WCF or Webservice from Vista Sidebar gadget by using Silverlight?</title><link>http://blogs.microsoft.co.il/blogs/tamir/archive/2008/06/23/how-to-consume-wcf-or-webservice-from-vista-sidebar-gadget-by-using-silverlight.aspx</link><pubDate>Tue, 24 Jun 2008 01:37:10 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:107795</guid><dc:creator>Tamir Khason</dc:creator><slash:comments>7</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-consume-wcf-or-webservice-from-vista-sidebar-gadget-by-using-silverlight/"&gt;http://khason.net/blog/how-to-consume-wcf-or-webservice-from-vista-sidebar-gadget-by-using-silverlight/&lt;/a&gt;]&lt;/h3&gt;&lt;hr /&gt;&lt;p&gt;The challenge today is really simple. All we have to do is to write &lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Silverlight/default.aspx"&gt;Silverlight&lt;/a&gt;&amp;#160;&lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Windows+Gadgets/default.aspx"&gt;Vista Sidebar Gadget&lt;/a&gt;, that consumes either &lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WCF/default.aspx"&gt;WCF&lt;/a&gt;, &lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/ASP.NET/default.aspx"&gt;ASMX&lt;/a&gt; or &lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Web/default.aspx"&gt;REST&lt;/a&gt; based service. Really simple, isn’t it? Let’s start&lt;/p&gt;  &lt;p&gt;&lt;img title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/HowtoconsumeWCForWebservicefromVistaSide_13000/image_b882e2d3-27ca-43d7-8549-cf3f0e48d342.png" width="401" height="103" /&gt; &lt;/p&gt;  &lt;h3&gt;Build server side services&lt;/h3&gt;  &lt;p&gt;We should start from services. This is very straight forward mission. Here the logic I want to implement&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;public string Echo(string input)     &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; return string.Format(&amp;quot;ACK from {0}&amp;quot;, input);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Well, WCF? We should mark service and operation contracts. That’s all&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;[ServiceContract(Namespace = &amp;quot;&amp;quot;)]     &lt;br /&gt;public class EchoService      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [OperationContract]      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public string Echo(string input)      &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; return string.Format(&amp;quot;ACK from WCF with {0}&amp;quot;, input);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;    &lt;p&gt; }&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This does not works. Why? Silverlight knows only consumes ASP.NET compatible (simplified) web services, thus we should add following attribute to the our class attributes collection&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;[ServiceContract(Namespace = &amp;quot;&amp;quot;)]     &lt;br /&gt;[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]      &lt;br /&gt;public class EchoService      &lt;br /&gt;{&lt;/p&gt; &lt;/blockquote&gt;  &lt;div&gt;   &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;Now, the service is discoverable and accessible by Silverlight. Great news. Now let’s put it into our shared host. Hmm, we got strange error: “Deploying WCF Services: This collection already contains an address with scheme http.” What the hell is it?&lt;/p&gt;    &lt;p&gt;This is shared hosting problem. Your host provider uses virtual IP and host addresses and has number of different web services, sitting on the same shared host. How to solve it? &lt;/p&gt;    &lt;p&gt;Simple, all you have to do is to specify your own service host factory. Here the example of classes to put into code behind&lt;/p&gt;    &lt;blockquote&gt;     &lt;p&gt;class SLHostFactory : ServiceHostFactory       &lt;br /&gt;{        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)        &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; SLHost customServiceHost =        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new SLHost(serviceType, new Uri(&amp;quot;[Your URL goes here]&amp;quot;,UriKind.Absolute));        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return customServiceHost;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;} &lt;/p&gt;      &lt;p&gt;class SLHost : ServiceHost       &lt;br /&gt;{        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public SLHost(Type serviceType, params Uri[] baseAddresses)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : base(serviceType, baseAddresses)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; { }        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; protected override void ApplyConfiguration()        &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; base.ApplyConfiguration();        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;}&lt;/p&gt;   &lt;/blockquote&gt;    &lt;p&gt;And one attribute into your service tag&lt;/p&gt;    &lt;blockquote&gt;     &lt;p&gt;Factory=&amp;quot;SLHostFactory&amp;quot; &lt;/p&gt;   &lt;/blockquote&gt;    &lt;p&gt;Now it works. So what’s next? Build ASMX web service. This is even simpler&lt;/p&gt;    &lt;blockquote&gt;     &lt;p&gt;[WebMethod]       &lt;br /&gt;public string Echo(string input)        &lt;br /&gt;{        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return string.Format(&amp;quot;ACK from web service with {0}&amp;quot;, input);        &lt;br /&gt;}&lt;/p&gt;   &lt;/blockquote&gt;    &lt;p&gt;We done, now either WCF and Web services are accessible from your Silverlight application. So, add Service reference and consume it&lt;/p&gt;    &lt;h3&gt;Building client side&lt;/h3&gt;    &lt;p&gt;Inside code behind of your Silverlight project, you should define two proxies – one for Web Service and another for WCF service. Bother services implements the same interface, so it should not be a problem&lt;/p&gt;    &lt;blockquote&gt;     &lt;p&gt;ServerEcho.EchoServiceClient proxy;       &lt;br /&gt;WebServiceEcho.EchoWebServiceSoapClient wsProxy;        &lt;br /&gt;private void UserControl_Loaded(object sender, RoutedEventArgs e)        &lt;br /&gt;{        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; proxy = new ServerEcho.EchoServiceClient();        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; proxy.EchoCompleted += new EventHandler&amp;lt;ServerEcho.EchoCompletedEventArgs&amp;gt;(proxy_EchoCompleted); &lt;/p&gt;      &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; wsProxy = new SLGadget.WebServiceEcho.EchoWebServiceSoapClient();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; wsProxy.EchoCompleted += new EventHandler&amp;lt;SLGadget.WebServiceEcho.EchoCompletedEventArgs&amp;gt;(wsProxy_EchoCompleted);        &lt;br /&gt;}&lt;/p&gt;   &lt;/blockquote&gt;    &lt;p&gt;Silverlight work only asynchronously, thus you should begin to understand, that synchronous programming is for pussies :). Consume it&lt;/p&gt;    &lt;blockquote&gt;     &lt;p&gt;private void WCF_Click(object sender, RoutedEventArgs 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; proxy.EchoAsync(txt.Text);        &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; private void WS_Click(object sender, RoutedEventArgs 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; wsProxy.EchoAsync(txt.Text);        &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;And Update output&lt;/p&gt;    &lt;blockquote&gt;     &lt;p&gt;void wsProxy_EchoCompleted(object sender, SLGadget.WebServiceEcho.EchoCompletedEventArgs 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; txt.Text = e.Error == null ? e.Result : (e.Error.InnerException != null ? e.Error.InnerException.ToString() : e.Error.Message);        &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 proxy_EchoCompleted(object sender, ServerEcho.EchoCompletedEventArgs 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; txt.Text = e.Error == null ? e.Result : (e.Error.InnerException != null ? e.Error.InnerException.ToString() : e.Error.Message);        &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 let’s run it. What? Another error? Security? Access denied? Of cause you have no crossdomain.xml. &lt;/p&gt;    &lt;blockquote&gt;     &lt;pre&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;
&amp;lt;!DOCTYPE cross-domain-policy SYSTEM &amp;quot;http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd&amp;quot;&amp;gt;
&amp;lt;cross-domain-policy&amp;gt;
   &amp;lt;allow-access-from domain=&amp;quot;*&amp;quot; /&amp;gt;
&amp;lt;/cross-domain-policy&amp;gt;&lt;/pre&gt;
  &lt;/blockquote&gt;

  &lt;p&gt;What? You have it and still getting the same error? Look into sniffer. You application is looking for other file, named clientaccesspolicy.xml. Why? According the documentation, you can use either… Hm, another bug with WCF consuming. Never mind, let’s put it too&lt;/p&gt;

  &lt;blockquote&gt;
    &lt;pre&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;access-policy&amp;gt;
  &amp;lt;cross-domain-access&amp;gt;
    &amp;lt;policy&amp;gt;
      &amp;lt;allow-from http-request-headers=&amp;quot;*&amp;quot;&amp;gt;
        &amp;lt;domain uri=&amp;quot;*&amp;quot;/&amp;gt;
      &amp;lt;/allow-from&amp;gt;
      &amp;lt;grant-to&amp;gt;
        &amp;lt;resource path=&amp;quot;/&amp;quot; include-subpaths=&amp;quot;true&amp;quot;/&amp;gt;
      &amp;lt;/grant-to&amp;gt;&lt;/pre&gt;

    &lt;pre&gt;    &amp;lt;/policy&amp;gt;
  &amp;lt;/cross-domain-access&amp;gt;
&amp;lt;/access-policy&amp;gt;&lt;/pre&gt;
  &lt;/blockquote&gt;

  &lt;p&gt;Very well, now we are ready to run our application. It works! So, the only thing we should do is to pack it into MyGadget.gadget directory and put inside &lt;em&gt;%userprofile%\appdata\local\microsoft\windows sidebar\gadgets&lt;/em&gt; together with gadget.xml manifest. &lt;/p&gt;

  &lt;p&gt;But… It stopped working… What’s the problem?&lt;/p&gt;

  &lt;h3&gt;Very client side networking in Silverlight&lt;/h3&gt;

  &lt;p&gt;The problem is, that SideBar executes it’s gadgets with local path, not with network path. Silverlight cannot use any network provider, when running locally. Why? Actually I do not know (maybe to prevent local applications development). so what to do?&lt;/p&gt;

  &lt;p&gt;Simple! Microsoft SideBar knows to run cross domain AJAX without any warnings and problems. So why not to use external XmlHttp from JavaScript for network access. Let’s do it&lt;/p&gt;

  &lt;p&gt;First we should initialize XMLHttpRequest object in JavaSctipt&lt;/p&gt;

  &lt;blockquote&gt;
    &lt;p&gt;var xObj;
      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; function getEchoWCF(text) {

      &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(xObj == null) {&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; xObj = new XMLHttpRequest();

      &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; else if(xObj) {

      &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; xObj.abort();

      &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;Then create SOAP request to WCF or WebService&lt;/p&gt;

  &lt;blockquote&gt;
    &lt;p&gt;var sURL = &amp;quot;[Path yo your service]&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; //Build SOAP

      &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; var sReq = &amp;quot;&amp;lt;s:Envelope xmlns:s=\&amp;quot;http://schemas.xmlsoap.org/soap/envelope/\&amp;quot;&amp;gt;&amp;lt;s:Body&amp;gt;&amp;lt;Echo&amp;gt;&amp;lt;input&amp;gt;&amp;quot;+text+&amp;quot;&amp;lt;/input&amp;gt;&amp;lt;/Echo&amp;gt;&amp;lt;/s:Body&amp;gt;&amp;lt;/s:Envelope&amp;gt;&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; xObj.open(&amp;quot;POST&amp;quot;, sURL, 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; xObj.setRequestHeader( &amp;quot;Content-Type&amp;quot;, &amp;quot;text/xml; charset=utf-8&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; xObj.setRequestHeader( &amp;quot;Cache-Control&amp;quot;, &amp;quot;no-cache&amp;quot; );

      &lt;br /&gt;…

      &lt;br /&gt;xObj.send(sReq);&lt;/p&gt;
  &lt;/blockquote&gt;

  &lt;p&gt;After the request created and send we should handle result. So we need an access from HTML page, hosting Silverlight object to Silverlight. Simple. “ScriptableMember - ScriptableType”, remember?&lt;/p&gt;

  &lt;p&gt;[ScriptableType]
    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public partial class Page : UserControl

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {

    &lt;br /&gt;…

    &lt;br /&gt;&lt;/p&gt;

  &lt;p&gt;[ScriptableMember]
    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void UpdateResponse(string result)

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;

  &lt;p&gt;Now return the result&lt;/p&gt;

  &lt;blockquote&gt;
    &lt;p&gt;xObj.onreadystatechange = function() {
      &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 (xObj.readyState === 4) {

      &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 (xObj.status &amp;amp;&amp;amp; xObj.status === 200) {&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; var control = document.getElementById(&amp;quot;silverlightControl&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; control.Content.Page.UpdateResponse(xObj.responseText);

      &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;/p&gt;
  &lt;/blockquote&gt;

  &lt;p&gt;But this is not enough. We also should know to call Javascript from Silverlight… This is really simple&lt;/p&gt;

  &lt;blockquote&gt;
    &lt;p&gt;private void JS_Click(object sender, RoutedEventArgs 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; HtmlPage.Window.Invoke(&amp;quot;getEchoWCF&amp;quot;, txt.Text);

      &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;We done. Now you can pack your &lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Silverlight/default.aspx"&gt;Silverlight control&lt;/a&gt;, together with hosting HTML and Javascript into &lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Windows+Gadgets/default.aspx"&gt;windows sidebar gadget&lt;/a&gt; and use it even with external network support.&lt;/p&gt;

  &lt;p&gt;Have a good day and be nice people.&lt;/p&gt;

  &lt;p&gt;&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=107795" width="1" height="1"&gt;</description><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/Windows+Gadgets/default.aspx">Windows Gadgets</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/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/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/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Backup and restore your wireless networks settings by using WirelessMigrator</title><link>http://blogs.microsoft.co.il/blogs/tamir/archive/2008/06/05/backup-and-restore-your-wireless-networks-settings-by-using-wirelessmigrator.aspx</link><pubDate>Fri, 06 Jun 2008 02:58:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:99677</guid><dc:creator>Tamir Khason</dc:creator><slash:comments>16</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/backup-and-restore-your-wireless-networks-settings-by-using-wirelessmigrator/"&gt;http://khason.net/blog/backup-and-restore-your-wireless-networks-settings-by-using-wirelessmigrator/&lt;/a&gt;]&lt;/h3&gt;&lt;hr /&gt;&lt;p&gt;I had to reinstall my working notebook, so I begun to backup all it’s settings. I almost finished, when recognize, that Windows Vista &lt;strong&gt;has no tool for backup and restore&lt;/strong&gt; wireless networks settings (tnx to &lt;a href="http://blogs.microsoft.co.il/blogs/danielp/"&gt;Daniel Petri&lt;/a&gt;). You can manually add or remove it. You can even change the priorities, but you cannot backup or restore it.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/Backupandrestoreyourwirelessnetworkssett_142DB/image_2b45e7bb-bce0-48bb-b16f-936ce90ce2b4.png" width="587" height="480" /&gt; &lt;/p&gt;  &lt;p&gt;What to do? How to save all my passwords for networks and all certificates. Digging a bit deeper I found a way to do it, by using command line prompt.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“netsh wlan show profiles” will show you all wireless network profiles in your system     &lt;br /&gt;”netsh wlan export profile name=”name” folder=”folder”” will export each profile to xml file (you can also run netsh wlan export profile” to export them all as bunch      &lt;br /&gt;”netsh wlan add profile filename=”name”” will restore each one of profiles and returns them into the system&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;For some reason, I cannot see my mother doing it… More then this, I cannot see myself remember all those command and doing it manually for each one of saved profiles (and I have a lot of them)&lt;/p&gt;  &lt;p&gt;What’s the solution? Build handy tool! I’m developer after all and know to solve my and other’s problems by code.&lt;/p&gt;  &lt;h3&gt;Let me introduce you WirelessMigrator&lt;/h3&gt;  &lt;p&gt;What is &lt;strong&gt;WirelessMigrator&lt;/strong&gt;? Wireless Migrator is a handy small program, that knows to backup and restore all wireless networks setting from your computer by one click. For some reason, there is no way to do it by using regular Windows Vista tools.     &lt;br /&gt;This feature is extremely useful, when you have to reinstall your computer or use the same settings of wireless networks for different machines. In order to use the program, all you have to do is to run it once. The program generate small file, can be handled and transferred in diskette. Later if you&amp;#39;ll run this generated file, all settings of wireless networks will be restored on target machine. &lt;/p&gt;  &lt;p&gt;Run “BackupWireless.exe” to backup&lt;/p&gt;  &lt;p&gt;&lt;img title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/Backupandrestoreyourwirelessnetworkssett_142DB/image_1e3f36bc-21b6-4960-ac19-0de212fcae83.png" width="580" height="72" /&gt; &lt;/p&gt;  &lt;p&gt;And “RestoreWireless.wnb” to restore&lt;/p&gt;  &lt;p&gt;&lt;img title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/Backupandrestoreyourwirelessnetworkssett_142DB/image_6452c424-427f-4f8e-9be9-542671f1142a.png" width="641" height="184" /&gt; &lt;/p&gt;  &lt;p&gt;That’s all, folks. Now you can save and restore your settings for wireless networks for migration easily. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.codeplex.com/wlan/Release/ProjectReleases.aspx"&gt;Download Wireless Migrator &amp;gt;&amp;gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;At first run, the program will request elevation on Windows Vista, to assign backup archive extension with the program and be able to restore with one click. To completely remove all registry nodes, wrote by program, from the registry, use BackupWireless.exe /remove option. To reinstall the program, just run it for the first time. That’s what &lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/2008/05/22/action-required-smart-client-users-group.aspx"&gt;I’m calling SmartClient&lt;/a&gt;. This is not “real” installation it also not very “web” application.&lt;/p&gt;  &lt;h3&gt;WirelessMigrator has very advanced and smart user interface&lt;/h3&gt;  &lt;p&gt;Now a little bit about the user interface of this program. I though a lot about it and decided not to make any user interface for it. Theoretically, it was possible to make kind of “Funky-Vista-Glow” list of all available networks and three buttons “Backup”, “Restore” and “Cancel”. I even done it with half an hour in &lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/WPF/default.aspx"&gt;WPF&lt;/a&gt;. But wait a moment. Is it really necessary to have user interface for such program? It wont be more functional by having it. All it have to do, done automatically and you have nothing to do if something going wrong.&lt;/p&gt;  &lt;p&gt;So, I build text-only progress bar and key switches to show progress (with will not take more, then 3 seconds), but that’s all. ‘m really interested to know what do you think about it?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.codeplex.com/wlan/Release/ProjectReleases.aspx"&gt;&lt;strong&gt;Download Wireless Migrator &amp;gt;&amp;gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Your feedback is really important for me. Please take a moment and tell me what’s good and what’s bad with this program in order me to be able to continue it’s development. Full source of the program is &lt;a href="http://www.codeplex.com/wlan/"&gt;available under MS-PL from CodePlex&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;My other open source projects, you may be interested with&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.codeplex.com/DupliFinder"&gt;Duplicate images finder&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.codeplex.com/SharpControls"&gt;Silverlight controls library&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.codeplex.com/vistabattery"&gt;Vista Battery Saver&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.codeplex.com/wpfcap"&gt;WebCam control for WPF&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.codeplex.com/wlan"&gt;Wireless Migrator&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Have a nice day and be good people.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=99677" 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/source/default.aspx">source</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/C_2300_/default.aspx">C#</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Vista+Battery+Saver/default.aspx">Vista Battery Saver</category></item><item><title>OpenUp Sidebar gadget</title><link>http://blogs.microsoft.co.il/blogs/tamir/archive/2008/05/20/openup-sidebar-gadget.aspx</link><pubDate>Wed, 21 May 2008 00:52:26 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:90826</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/openup-sidebar-gadget/"&gt;http://khason.net/blog/openup-sidebar-gadget/&lt;/a&gt;]&lt;/h3&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.microsoft.com/israel/openup/index.htm" target="_blank"&gt;OpenUp&lt;/a&gt; competition is on the air? Authors of &lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/2008/05/13/openup-and-my-open-source-submissions.aspx" target="_blank"&gt;contributed projects&lt;/a&gt; are stressed and want to know what’s going on with their pet project on &lt;a href="http://www.codeplex.com/" target="_blank"&gt;CodePlex&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;What can they do about stress? To get it under control and &lt;a href="http://blogs.microsoft.co.il/files/folders/90825/download.aspx" target="_blank"&gt;download new gadget&lt;/a&gt;, I built to help them to relieve stress. Just look on your side bar and see three top rated projects (by CodePlex)&lt;/p&gt;  &lt;p&gt;&lt;img title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/OpenUpSidebargadget_1257C/image_333b0dfb-3a5e-4db2-afad-dec545b454d9.png" width="389" height="113" /&gt; &lt;/p&gt;  &lt;p&gt;Click on it or drag it out of SideBar to see all submitted projects and it’s rating&lt;/p&gt;  &lt;p&gt;&lt;img title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/OpenUpSidebargadget_1257C/image_0e487295-3ec4-4512-bf70-00001ea1f96e.png" width="435" height="356" /&gt; &lt;/p&gt;  &lt;p&gt;Take it easy and return to work. You should continue development of your projects.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/files/folders/90825/download.aspx" target="_blank"&gt;Download OpenUp gadget &amp;gt;&amp;gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: this is very first version with number of bugs. Those days I have no time to fix them, so you can either use it “as-is” or fix bugs and resubmit.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=90826" 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/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/Windows+Live/default.aspx">Windows Live</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>Gas Price Windows Vista SideBar gadget – new version is available for download</title><link>http://blogs.microsoft.co.il/blogs/tamir/archive/2008/05/16/gas-price-windows-vista-sidebar-gadget-new-version-is-available-for-download.aspx</link><pubDate>Sat, 17 May 2008 00:56:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:89554</guid><dc:creator>Tamir Khason</dc:creator><slash:comments>39</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/gas-price-windows-vista-sidebar-gadget-%e2%80%93-new-version-is-available-for-download/"&gt;http://khason.net/blog/gas-price-windows-vista-sidebar-gadget-%e2%80%93-new-version-is-available-for-download/&lt;/a&gt;]&lt;/h3&gt;&lt;hr /&gt;&lt;p&gt;This post is dedicated to some people in Microsoft and it’s subsidiaries. It begun about year ago, when I developed &lt;a href="http://gallery.live.com/liveItemDetail.aspx?li=edc14bc5-72f5-4e0d-b761-5a765408f67b" target="_blank"&gt;Gas Price information gadget&lt;/a&gt; (do not download it there). Before I started, I sent some personal email to those in MSN, who maintains it’s Auto section. I wait two days and got no response, so wrote &lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/2007/04/27/Is-_2200_web-scrapping_2200_-legal_3F00_.aspx" target="_blank"&gt;this post about HTML scrapping&lt;/a&gt; and then I finished the gadget, that uses this technology.&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/GasPriceWindowsVistaSideBargadgetnewvers_1267A/image_3dbd8a25-0f69-454a-b667-0b2851ab4bd0.png" title="image" alt="image" border="0" height="347" width="468" /&gt;     &lt;br /&gt;&lt;font size="1"&gt;© &lt;/font&gt;&lt;a href="http://www.grographics.com/" target="_blank"&gt;&lt;font size="1"&gt;Christopher Robbins&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Couple of weeks later, Senior Channel Manager of MSN Marketplace replayed to me. He asked whether I want to convert this gadget to “legal” one by &lt;b&gt;gifting all rights to Microsoft&lt;/b&gt;. I asked about my benefits of doing it (my time costs money) and the conversation ended – he even did not responded. I was waiting for “YES” or “NO”, but got only silent.&lt;/p&gt;  &lt;p&gt;Year after he mailed me again with warning, that they going to “protect” Auto section in order to prevent unauthorized content grabbing. He asked again about possibility to “legalize” the gadget – I told, that they can do with this gadget whatever they want, so handed it off to MSN team. Nothing happened. No one took care on this.&lt;/p&gt;  &lt;p&gt;A month later, I asked again by proposing to &lt;b&gt;allow Windows Vista SideBar referrer&lt;/b&gt; too aside with affiliate sites for MSN Auto images, thus the gadget can continue to work and MSN remains protected from other “grabbers”. But he demand &lt;b&gt;to completely remove any reference to MSN from the gadget&lt;/b&gt;. The same time I got some proposals of using another data for this very popular gadget and populize other resources instead of very unpopular crappy MSN.&lt;/p&gt;  &lt;p&gt;I decided to build &lt;a href="http://blogs.microsoft.co.il/files/folders/tamir/entry89553.aspx" target="_blank"&gt;new version of the gadget&lt;/a&gt; (here you can download) and did it today (my spare time – not work [this is for my manager]). This version even better, then previous one. It contains more information, that updates more frequently. I also includes distance from station and gas stations in Canada. So, this how it looks today&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/GasPriceWindowsVistaSideBargadgetnewvers_1267A/image_0d192dc1-3fa4-416c-9965-e7c741166a25.png" title="image" alt="image" border="0" height="149" width="557" /&gt; &lt;/p&gt;  &lt;p&gt;As you can see this one is much better and uses &lt;a href="http://automotive.com" target="_blank"&gt;Automotive.com&lt;/a&gt; information. So what I have to do? Submit it instead of old one, right? This the response, I got from automatic system upon submission.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“&lt;i&gt;Your item appears to be either missing a valid signature or a valid certificate. You may also want to check the signature to make sure that it includes the date&lt;/i&gt;”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Just to make things clear, I signed the code with &lt;b&gt;private signature&lt;/b&gt;. They want me to sign it with &lt;b&gt;Trusted Authority&lt;/b&gt;. This is very smart request, however I do not want to pay $200-$400 to make &lt;b&gt;their&lt;/b&gt; sidebar better! There is neither ROI, nor benefit for me to pay money for something, I’m giving for free to anyone.&lt;/p&gt;  &lt;p&gt;Just in case, signing code with certificate, trusted by authority even &lt;b&gt;do not removes regular live gallery end-user warning&lt;/b&gt;.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“&lt;i&gt;Unverified submission.&lt;/i&gt;&lt;/p&gt;    &lt;p&gt;&lt;i&gt;Only install applications from developers you trust. This is a third-party application, and it could access your computer&amp;#39;s files, show you objectionable content, or change its behavior at any time.&lt;/i&gt;”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So why me to pay? Only because I want to be nice to Microsoft and replace my old gadget by new one to serve dozen thousands of people, who using Windows Vista with SideBar and my gadget?&lt;/p&gt;  &lt;p&gt;&lt;b&gt;NO WAY!&lt;/b&gt; I will not submit it there. I will never contribute anything for free to Windows Vista Live Gallery. They want me (and million of other developers) to submit it to Google or Yahoo? I’ll do it! I’ll force my customers to use 3rd party addons and visit 3rd party websites to get the information they want to get without paying anyone. At least &lt;b&gt;their&lt;/b&gt; marketing guys know how to make developer not to suffer from his own good wish.&lt;/p&gt;  &lt;p&gt;Thank you and good &lt;u&gt;buy&lt;/u&gt;! You want to win web? You just impossible to do it.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;a href="http://blogs.microsoft.co.il/files/folders/89553/download.aspx" target="_blank"&gt;Download Gas Price gadget for Windows Vista SideBar &amp;gt;&amp;gt;&lt;/a&gt;&lt;/b&gt; (it signed with personal certificate, so do it for your own risk :) )&lt;/p&gt;  &lt;p&gt;P.S. Next week, I have a meeting with Steve Ballmer and I’m going to ask him all those questions. If you have any questions and want me to ask him, please send it to me or leave a comment.&lt;/p&gt;&lt;p&gt;&lt;b&gt;UPD (18-May): &lt;/b&gt;Some issues were fixed (zips starting with 0, negative prices, sorting). You can &lt;a href="http://blogs.microsoft.co.il/files/folders/89553/download.aspx" title="download gas price gadget for free"&gt;download new version of the gadget&lt;/a&gt; from the same url and update your local version. Great thank to all, who reported issues. &lt;br /&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=89554" 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/Windows+Gadgets/default.aspx">Windows Gadgets</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/download/default.aspx">download</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></item><item><title>How to make Silverlight be AiR?</title><link>http://blogs.microsoft.co.il/blogs/tamir/archive/2008/04/27/how-to-make-silverlight-be-air.aspx</link><pubDate>Mon, 28 Apr 2008 00:29:02 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:83135</guid><dc:creator>Tamir Khason</dc:creator><slash:comments>24</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-make-silverlight-be-air/"&gt;http://khason.net/blog/how-to-make-silverlight-be-air/&lt;/a&gt;]&lt;/h3&gt;&lt;hr /&gt;&lt;p&gt;Today we’ll speak about three issues&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;How to make Silverlight application to run as stand alone application and how to insert this application inside your application?&lt;/li&gt;    &lt;li&gt;How to escape Silverlight from it’s sand box (how to make it run in full trust mode)&lt;/li&gt;    &lt;li&gt;When first two items done, how to make Silverlight to access anyfile in your file system?&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Looks scary? Let’s see first reasons for those “hackery” targets. The main reason is to make Silverlight Air (you, probably understand what I’m speaking about :)). Why? When I want to build Silverlight Image Upload control. The one similar to those Yahoo, Facebook and many others have. With live preview, editing (before uploading), drag and drop, etc. Yes, I do not want ugly File Open dialog from Silverlight. I want it sexy, yet functional! To do this, we have to make Silverlight be able to access filesystem. Of cause I want to ask user to authorize me first, then I can get an access.&lt;/p&gt;  &lt;p&gt;&lt;img title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/HowtomakeSilverlightbeAiR_11FF0/image_b54b4803-58bc-41a7-9dd2-a7012758734f.png" width="561" height="407" /&gt; &lt;/p&gt;  &lt;p&gt;The other reason is to incorporate Silverlight control inside WinForms application. Why? There are some reasons - “light weigh stuff”, maybe :). Maybe banner ads inside desktop application. It’s just cool :). Well, there are some other more serious reasons. So let’s start. &lt;/p&gt;  &lt;h3&gt;First task – to make it run as stand alone application.&lt;/h3&gt;  &lt;p&gt;Well, this one is easy. All you have to do is to have WebBrowser control with Silverlight content inside it in your application. So, &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;WebBrowser wb = new WebBrowser();     &lt;br /&gt;wb.Parent = panel1;      &lt;br /&gt;wb.Dock = DockStyle.Fill;      &lt;br /&gt;wb.Url = new Uri(&amp;quot;http://0x15.net/play/SLFindResource/SLFindResource.html&amp;quot;);&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;We done. But we’re in desktop, thus I want it full trust… This is most interesting part of today’s post.&lt;/p&gt;  &lt;h3&gt;Second task – to make it run in User Full Trust mode.&lt;/h3&gt;  &lt;p&gt;First try – to incorporate Silverlight’s OCX (ActiveX) control. Add npctrl.dll from [Program Files]\Microsoft Silverlight\[Version] – this is ActiveX and Visual Studio will create wrapper with AxHost. This one is cool, but it wont work. why? As you, probably, know Silverlight connected to it’s web page host DOM when we’re using it as stand alone player it cannot find it’s document, thus initialization failed. So what to do? What can provide me DOM from one side and run in full trust from the other side. Someone remember what HTA is (it is not mobile device, it’s &lt;a href="http://en.wikipedia.org/wiki/HTML_Application" target="_blank"&gt;very beginning of RIA era&lt;/a&gt;). HTML applications were run by very special host, named &lt;strong&gt;mshta.exe&lt;/strong&gt; it’s in [Windows]\System32 folder and it’s still there. Everything running inside MSHTA will run by default in full trust mode. From one hand it’s regular IE, (do we have DOM), from other hand it’s make us able to run full trust internet application. Let’s use it (from code)&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;ProcessStartInfo mshta = new ProcessStartInfo(&amp;quot;mshta&amp;quot;, &amp;quot;&lt;a href="http://0x15.net/play/SLFindResource/SLFindResource.html"&gt;http://0x15.net/play/SLFindResource/SLFindResource.html&amp;quot;);&lt;/a&gt;      &lt;br /&gt;Process p = Process.Start(mshta);&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Now we have strange window, running our Silverlight application. What’s next? Incorporate it inside our application. What’s the problem p (my process).MainWindowHandle and then SetParent for to the control I want. Well, it does not work. MSHTA has no (publicly) main window. So, we’ll find it and then change it’s parent. His class named “HTML Application Host Window Class”.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;LockWindowUpdate(GetDesktopWindow());     &lt;br /&gt;ProcessStartInfo mshta = new ProcessStartInfo(&amp;quot;mshta&amp;quot;, &amp;quot;&lt;a href="http://0x15.net/play/SLFindResource/SLFindResource.html"&gt;http://0x15.net/play/SLFindResource/SLFindResource.html&amp;quot;);&lt;/a&gt;      &lt;br /&gt;Process p = Process.Start(mshta);      &lt;br /&gt;p.WaitForInputIdle();      &lt;br /&gt;ptr = FindWindow(&amp;quot;HTML Application Host Window Class&amp;quot;, null); &lt;/p&gt;    &lt;p&gt;SetParent(ptr, panel1.Handle);     &lt;br /&gt;SendMessage(ptr, WM_SYSCOMMAND, SC_MAXIMIZE, 0); &lt;/p&gt;    &lt;p&gt;LockWindowUpdate(IntPtr.Zero);&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Yu-hoo. We hosted Silverlight page inside our application. It’s full trust so, we can access file system. But wait… Silverlight is not designed to have an access to the file system. The only space it can see is isolated storage, thus it has no classes for listing files anywhere. what to do?&lt;/p&gt;  &lt;h3&gt;Third task – to make it access user’s file system&lt;/h3&gt;  &lt;p&gt;We need another ActiveX to run from Javascript (or C# code) that knows to access to file system. Our hosting document can initialize it and then expose relevant methods to Silverlight. What’s such class? Let’s back to gold era of unsafe computing – we have &lt;a href="http://msdn2.microsoft.com/en-us/library/z9ty6h50.aspx" target="_blank"&gt;Scripting.FileSystemObject&lt;/a&gt; there. This class is very dangerous it can do anything in local file system. Many system administrators using this class to script their evil login scripts (those black quick command line promps, that doing something bad to your system each time you’re logging in in your domain). It know everything about your disks and can be run from full trust environment. So, it’s just exactly what we need. Get all drives in your machine&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;drivetypes = [ &amp;#39;Unknown&amp;#39;, &amp;#39;Removable&amp;#39;, &amp;#39;Fixed&amp;#39;, &amp;#39;Network&amp;#39;, &amp;#39;CD-ROM&amp;#39;, &amp;#39;RAM Disk&amp;#39; ],     &lt;br /&gt;driveprops = [ &amp;#39;DriveLetter&amp;#39;, &amp;#39;DriveType&amp;#39;, &amp;#39;ShareName&amp;#39;, &amp;#39;IsReady&amp;#39;, &amp;#39;Path&amp;#39;, &amp;#39;RootFolder&amp;#39;, &amp;#39;FileSystem&amp;#39;, &amp;#39;SerialNumber&amp;#39;, &amp;#39;VolumeName&amp;#39;, &amp;#39;TotalSize&amp;#39;, &amp;#39;AvailableSpace&amp;#39;, &amp;#39;FreeSpace&amp;#39; ]; &lt;/p&gt;    &lt;p&gt;function getdrives() {     &lt;br /&gt; var fso = new ActiveXObject( &amp;#39;Scripting.FileSystemObject&amp;#39; ),      &lt;br /&gt;&amp;#160; e = new Enumerator(fso.Drives),      &lt;br /&gt;&amp;#160; add = function(i) {      &lt;br /&gt;&amp;#160;&amp;#160; i = driveprops[i];      &lt;br /&gt;&amp;#160;&amp;#160; var prop = f[i];      &lt;br /&gt;&amp;#160;&amp;#160; if( ( prop || prop===0 || prop===false ) &amp;amp;&amp;amp; ( i!==&amp;#39;AvailableSpace&amp;#39; || prop!==free ) ) {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if( /(Type)$/.test( i ) ) { prop = drivetypes[ prop ]; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if( /(Size|Space)$/.test( i ) ) { prop = bykb( prop, true ); }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; s.push( i.toCamelCase() + &amp;#39;:\t&amp;#39; + ( i.length &amp;lt; 8 ? &amp;#39;\t&amp;#39; : &amp;#39;&amp;#39; ) + prop );      &lt;br /&gt;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160; },&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Then folders&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;function getfolder( s ) { s = trim( s ) || &amp;#39;C:&amp;#39;;     &lt;br /&gt; var fso = new ActiveXObject( &amp;#39;Scripting.FileSystemObject&amp;#39; ),      &lt;br /&gt;&amp;#160; e, f, i, r = [];      &lt;br /&gt; if( fso.FolderExists( s ) ) {      &lt;br /&gt;&amp;#160; f = fso.GetFolder( s );      &lt;br /&gt;&amp;#160; e = new Enumerator(f.SubFolders);      &lt;br /&gt;&amp;#160; for( ; !e.atEnd(); e.moveNext() ) {      &lt;br /&gt;&amp;#160;&amp;#160; if( ( i = e.item() ) ) { r.push( &amp;#39; &amp;#39; + i ); }      &lt;br /&gt;&amp;#160; }      &lt;br /&gt;&amp;#160; e = new Enumerator(f.files);      &lt;br /&gt;&amp;#160; for( ; !e.atEnd(); e.moveNext() ) {      &lt;br /&gt;&amp;#160;&amp;#160; if( ( i = e.item() ) ) { r.push( &amp;#39;&amp;#39; + i ); }      &lt;br /&gt;&amp;#160; }      &lt;br /&gt; }      &lt;br /&gt; return r;      &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;And files at the end&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;function getfile( form ) {     &lt;br /&gt; var fso = new ActiveXObject( &amp;#39;Scripting.FileSystemObject&amp;#39; ),      &lt;br /&gt;&amp;#160; forReading = 1, forWriting = 2, forAppending = 8,      &lt;br /&gt;&amp;#160; dd = function( o, s ) {      &lt;br /&gt;&amp;#160;&amp;#160; try {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; s = f[s] + &amp;#39;&amp;#39;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; o.value = s.replace( /^(\w{3}) (\w+) (\d\d?) ([\d:]+) ([\w+]+) (\d+)$/, &amp;#39;$3 $2 $6 $4&amp;#39; );      &lt;br /&gt;&amp;#160;&amp;#160; } catch(e) {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; o.value = e.message;      &lt;br /&gt;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160; },&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Very cool we have files by using &lt;em&gt;f = fso.GetFile( name );&lt;/em&gt; method, now we can do anything with it. For example get or set attributes &lt;em&gt;f.attributes&lt;/em&gt;, or rename &lt;em&gt;f.Name = s&lt;/em&gt;, or, even delete it &lt;em&gt;f.Delete();&lt;/em&gt; Isn’t it really evil?&lt;/p&gt;  &lt;p&gt;We done. Now you can run Silverlight as full trust desktop application and, even host it wherever you want. Even inside calculator…&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;ProcessStartInfo calc = new ProcessStartInfo(&amp;quot;calc&amp;quot;);     &lt;br /&gt;using (Process p = Process.Start(calc))      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; p.WaitForInputIdle();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; SetParent(ptr, p.MainWindowHandle);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; SendMessage(ptr, WM_SYSCOMMAND, SC_MAXIMIZE, 0);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; p.WaitForExit();      &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Happy programming and be good people.&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:2898d5d6-b1a4-4450-bf95-f070a257036f" class="wlWriterSmartContent"&gt;&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/HowtomakeSilverlightbeAiR_11FF0/SilverForms_1.zip" title="SilverForms.zip [53.7 Kb]"&gt;SilverForms.zip [53.7 Kb]&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=83135" width="1" height="1"&gt;</description><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/Vista/default.aspx">Vista</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/SVG/default.aspx">SVG</category></item><item><title>Just in case – shutdown.exe with rich user experience (it has it, for real!)</title><link>http://blogs.microsoft.co.il/blogs/tamir/archive/2008/04/22/just-in-case-shutdown-exe-with-rich-user-experience-it-has-it-for-real.aspx</link><pubDate>Tue, 22 Apr 2008 16:44:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:81486</guid><dc:creator>Tamir Khason</dc:creator><slash:comments>0</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/just-in-case-%e2%80%93-shutdownexe-with-rich-user-experience-it-has-it-for-real/"&gt;http://khason.net/blog/just-in-case-%e2%80%93-shutdownexe-with-rich-user-experience-it-has-it-for-real/&lt;/a&gt;]&lt;/h3&gt;&lt;hr /&gt;&lt;p&gt;If you love command line applications, skip this post. Did you know, that simple base program, named “shutdown.exe” has it’s own UI? This application allows you to restart you (or neightbor’s) computer by using different command line switches. One of those switches is –i. So, if you do not like command line script style application, use shutdown –i to see this wonderful rich user interface :)&lt;/p&gt;
&lt;p&gt;&lt;img title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/Jus.exewithrichuserexperienceithasitforr_B30B/image_c73cc037-a85d-4a2c-a0c3-35ce0f4c5adb.png" width="424" height="475" /&gt;&lt;/p&gt;
&lt;p&gt;BTW, mPrest is looking for good system administrator. If you&amp;#39;re such person, &lt;a class="" href="http://mprest.com/Careers.aspx"&gt;apply your CV here&lt;/a&gt; (notice, that you&amp;#39;re referred by me)&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=81486" 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/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/jobs/default.aspx">jobs</category><category domain="http://blogs.microsoft.co.il/blogs/tamir/archive/tags/Accessibility/default.aspx">Accessibility</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>Yet other large industrial area switched to Vista</title><link>http://blogs.microsoft.co.il/blogs/tamir/archive/2008/03/04/yet-other-large-industrial-area-switched-to-vista.aspx</link><pubDate>Tue, 04 Mar 2008 14:21:45 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:63334</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/yet-other-large-industrial-area-switched-to-vista/"&gt;http://khason.net/blog/yet-other-large-industrial-area-switched-to-vista/&lt;/a&gt;]&lt;/h3&gt;&lt;hr /&gt;&lt;p&gt;I do not think, it&amp;#39;s necessary to explain that. Those photos took in large industrial area in center region of Israel. A picture worth a hundred words...&lt;/p&gt;  &lt;p&gt;&lt;img height="527" alt="IMAG0009" src="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/YetotherlargeindustrialareaswitchedtoVis_839F/IMAG0009_9dab1384-477d-4aba-be40-0032eb197c01.jpg" width="703" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;... and a little zoom&lt;/p&gt;  &lt;p&gt;&lt;img height="527" alt="IMAG0010" src="http://blogs.microsoft.co.il/blogs/tamir/WindowsLiveWriter/YetotherlargeindustrialareaswitchedtoVis_839F/IMAG0010_9c8de501-8dbb-4b9c-9a9a-5b5d0ca33443.jpg" width="703" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Long life, Microsoft Windows Vista...&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=63334" width="1" height="1"&gt;</description><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/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/Microsoft/default.aspx">Microsoft</category></item></channel></rss>