<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:thr='http://purl.org/syndication/thread/1.0' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-1850047779793623762</atom:id><lastBuildDate>Thu, 28 Jul 2011 21:00:22 +0000</lastBuildDate><title>DotNetIdeas</title><description>.NET Framework/Compact Framework and SharePoint Programming Tips and Tricks</description><link>http://dotnetideasblog.blogspot.com/search/label/.NET%20Compact%20Framework</link><managingEditor>noreply@blogger.com (DotNetIdeas)</managingEditor><generator>Blogger</generator><openSearch:totalResults>6</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1850047779793623762.post-7616627334976489679</guid><pubDate>Fri, 06 Nov 2009 21:09:00 +0000</pubDate><atom:updated>2009-11-06T13:10:25.987-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>.NET Compact Framework</category><title>Provisioning Windows Mobile Devices</title><description>&lt;p&gt;Recently I worked on a project in which I need to create a configuration tool for windows mobile device, so it can setup the device ID, date/time, Network connection, Wi-Fi, etc. I used the windows mobile provisioning tool. There are more information on &lt;a href="http://msdn.microsoft.com/en-us/bb737536.aspx" target="_blank"&gt;MSDN&lt;/a&gt; web site on how to use it. I am not going to repeat that. However, I want to document the issues I ran into while implementing it. Hope this will help others.&lt;/p&gt;  &lt;p&gt;Note: The devices I was configuring are Intermec CN50 and Symbol MC75 with windows mobile 6 professional.&lt;/p&gt;  &lt;p&gt;To use the provisioning tool, you will create a XML file with the following format. It contains the things you want to configure.&lt;/p&gt;  &lt;div&gt;   &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;wap-provisioningdoc&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Registry&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;HKCU\ControlPanel\Owner&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Name&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;[DeviceID]&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Owner&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;[DeviceIDBinary]&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;datatype&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;binary&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;wap-provisioningdoc&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;Then in your code you will load the XML into a XmlDocument variable and call ProcessConfiguration() &lt;/div&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;XmlDocument xd = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; XmlDocument();
xd.LoadXml(XMLContent);
XmlDocument xdResult = ConfigurationManager.ProcessConfiguration(xd, &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;

&lt;h4&gt;Setup Device ID&lt;/h4&gt;

&lt;p&gt;There is a &lt;a href="http://msdn.microsoft.com/en-us/bb737683.aspx" target="_blank"&gt;DeviceInformation Configuration Service Provider&lt;/a&gt;, but surprisingly I couldn't find how you would setup the device ID. So I used &lt;a href="http://msdn.microsoft.com/en-us/bb737304.aspx" target="_blank"&gt;Registry configuration service provider&lt;/a&gt; to update the registry.&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;wap-provisioningdoc&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Registry&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;HKCU\ControlPanel\Owner&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Name&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;[DeviceID]&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Owner&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;[DeviceIDBinary]&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;datatype&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;binary&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;HKCU\Software\Microsoft\Bluetooth\Settings&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;LocalName&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;[DeviceID]&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;datatype&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;HKLM\Ident&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Name&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;[DeviceID]&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;datatype&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;wap-provisioningdoc&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Notice the [DeviceIDBinary] field? I didn't have that in there at first. But after changing the DeviceID, it didn't change the owner info displayed on the Today screen, even after a reboot. After researching the registry, I found out that I have to change the Owner field and that is a binary field. &lt;/p&gt;

&lt;p&gt;Also most of the time, you will need to specify the datatype. Otherwise you may get an error code 2147500037, or something like that.&lt;/p&gt;

&lt;h4&gt;&lt;/h4&gt;

&lt;h4&gt;Set VPN connection&lt;/h4&gt;

&lt;p&gt;Using &lt;a href="http://msdn.microsoft.com/en-us/bb737433.aspx" target="_blank"&gt;CM_VPNEntries Configuration Service Provider&lt;/a&gt; to set VPN connection is very straight forward. Here is the sample XML. If you have more than one, you can set Enabled to 1 to make it default.&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;CM_VPNEntries&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;MyVPN&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;SrcId&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;{436EF144-B4FB-4863-A041-8F905A62C572}&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;DestId&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;{A1182988-0D73-439e-87AD-2A5B369F808B}&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Phone&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;[MyIP]&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;UserName&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;[UserName]&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Password&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;[Password]&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Domain&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;[MyDomain]&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #008000"&gt;&amp;lt;!--Determins the type of authentication e.g. IPSec = 1 vs PPTP = 0--&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Type&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #008000"&gt;&amp;lt;!--Determins the type IPSec encryption, either pre shared key or cert based--&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;IPSecAuth&amp;quot;&lt;/span&gt;  &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #008000"&gt;&amp;lt;!--pre shared key can be 256 chars long, but must be ASCII--&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;PresharedKey&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;[NetworkKey]&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Enabled&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h4&gt;Wi-Fi configuration&lt;/h4&gt;

&lt;p&gt;The XML to configure Wi-Fi is simple, just follow &lt;a href="http://msdn.microsoft.com/en-us/bb737539.aspx" target="_blank"&gt;Wi-Fi Configuration Service Provider&lt;/a&gt;. However, there are a couple of things worth mention. First, we need to turn on Wi-Fi before apply the XML file, otherwise it will throw a error code. Second, this only worked for Intermec device. The Symbol device has its own way configuring Wi-Fi. I have to export their setting and use &lt;a href="http://msdn.microsoft.com/en-us/bb737304.aspx" target="_blank"&gt;Registry configuration service provider&lt;/a&gt; to configure it.&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Wi-Fi&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;access-point&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;[MyAccessPointName]&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;DestId&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;{436EF144-B4FB-4863-A041-8F905A62C572}&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Encryption&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Authentication&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Hidden&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;KeyProvided&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;NetworkKey&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;[NetworkKey]&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;KeyIndex&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Use8021x&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h4&gt;Add URL Exceptions&lt;/h4&gt;

&lt;p&gt;To add URL Exceptions in the screen showed here, use the following XML.&lt;/p&gt;

&lt;h4&gt;&lt;a href="http://lh3.ggpht.com/_ElXg_EOWn5c/SvSQfxuDpVI/AAAAAAAAAbA/P1TI6otmsn8/image%5B2%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="244" alt="image" src="http://lh3.ggpht.com/_ElXg_EOWn5c/SvSQgNaeHVI/AAAAAAAAAbE/NAEU2_DOwRs/image_thumb.png" width="185" border="0" /&gt;&lt;/a&gt;&lt;/h4&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;CM_Mappings&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;16842751&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Pattern&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;http://*/*&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Network&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;{A1182988-0D73-439E-87AD-2A5B369F808B}&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h4&gt;GPRS configuration&lt;/h4&gt;

&lt;p&gt;I used &lt;a href="http://msdn.microsoft.com/en-us/bb737338.aspx" target="_blank"&gt;CM_GPRSEntries Configuration Service Provider&lt;/a&gt; to configure GPRS. Nothing is special there.&lt;/p&gt;

&lt;div&gt;
  &lt;div&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;CM_GPRSEntries&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;GPRS Connection&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;DestId&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;{436EF144-B4FB-4863-A041-8F905A62C572}&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;UserName&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;[DeviceID]&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Password&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;[Password]&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Domain&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;[Domain]&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;AlwaysOn&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;DevSpecificCellular&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;GPRSInfoValid&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;GPRSInfoAccessPointName&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;[AcceessPointName]&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;BearerInfoValid&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;GPRSInfoProtocolType&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;2&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;GPRSInfoL2ProtocolType&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;2&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;GPRSInfoAddress&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;GPRSInfoDataCompression&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;GPRSInfoHeaderCompression&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h4&gt;Set Date/Time and Time Zone&lt;/h4&gt;

&lt;p&gt;In this application, we also need to set the date/time and time zone information. I tried to use the &lt;a href="http://msdn.microsoft.com/en-us/bb737261.aspx" target="_blank"&gt;Clock Configuration Service Provider&lt;/a&gt;, but it doesn't work. I don't know what is wrong. I followed the sample xml, but I couldn't get it to work. Finally, since we only use 4 of the time zones, I queried the TimeZoneInformation for each time zone and exported the values. Then put those values in the application's configuration file. I load them in when the user choose a time zone and pass it to the following xml to set the time zone. To set the date/time, I used OpenNETCF.WinAPI.Core.SetLocalDateTime(). This is not pretty, but it worked.&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;wap-provisioningdoc&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Registry&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;HKLM\Time&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;TimeZoneInformation&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;[TimeZoneInformation]&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;datatype&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;binary&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;HKLM\Software\Microsoft\Clock&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;parm&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;GMT_OFFSET&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;[GMT_OFFSET]&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;datatype&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;integer&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;characteristic&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;wap-provisioningdoc&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;If you are changing the time zone and you need to display current date/time on your configuration screen like we did, you need to get the local time using native function call instead of using DateTime.Now. Otherwise, it will mess up. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1850047779793623762-7616627334976489679?l=dotnetideasblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://dotnetideasblog.blogspot.com/2009/11/provisioning-windows-mobile-devices.html</link><author>noreply@blogger.com (DotNetIdeas)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_ElXg_EOWn5c/SvSQgNaeHVI/AAAAAAAAAbE/NAEU2_DOwRs/s72-c/image_thumb.png' height='72' width='72'/><thr:total>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1850047779793623762.post-7703297199308003206</guid><pubDate>Wed, 07 Oct 2009 21:34:00 +0000</pubDate><atom:updated>2009-10-07T14:34:06.514-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>.NET Compact Framework</category><title>Creating Transparent Controls in .NET Compact Framework</title><description>&lt;p&gt;Recently I was working on improving the user interface of our windows mobile application - &lt;a href="http://www.dotnetideas.com/products.aspx"&gt;UnitConverter&lt;/a&gt;. It had plain solid background. I wanted to add background image to it. I found this &lt;a href="http://msdn.microsoft.com/en-us/windowsmobile/dd296751.aspx"&gt;video tutorial&lt;/a&gt; on how to display background image on a form. However, that tutorial told us if we need to have transparent controls on top of the image, we have to write our own user controls. That’s how I started researching on how to create transparent controls. I found an &lt;a href="http://breathingtech.com/2009/creating-gradient-background-with-transparent-labels-in-net-compact-framework/"&gt;article&lt;/a&gt; by &lt;a href="http://breathingtech.com/about/"&gt;Per Ola Sæther&lt;/a&gt; which laid the foundation of my solution. &lt;/p&gt;  &lt;p&gt;The basic ideas to create a transparent control is to override the OnPaintBackgound method of the control so it calls the parent form’s OnPaintBackgound to draw the background and then draw content of the control on top of it. &lt;/p&gt;  &lt;p&gt;In that article, the author showed how to create a transparent label control. But the code can be simplified. I also did some refactoring work so it extends to not just label control. &lt;/p&gt;  &lt;p&gt;First I created the same interface introduced in that article.&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;interface&lt;/span&gt; IPaintControl&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #008000"&gt;// have the background painted&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; InvokePaintBackground(PaintEventArgs e);&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;Then I created a base form so I don’t have to write the same code for each form. &lt;/div&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; CcForm : Form, IPaintControl&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;virtual&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; InvokePaintBackground(PaintEventArgs e)&lt;br /&gt;    {&lt;br /&gt;        OnPaintBackground(e);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;A base control is created so we not only can have transparent label, but also other kinds of controls, such as radio button and checkbox. It has a property called “TransparentBackground”. If you don’t want your control to be transparent for some reason, you can change this property. In the “OnPaintBackground” method, it calls its parent’s “InvokePaintBackground” to draw the background.&lt;/div&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; CcTransparentControl : Control&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; _transparentBackgound = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; TransparentBackground&lt;br /&gt;    {&lt;br /&gt;        get&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _transparentBackgound;&lt;br /&gt;        }&lt;br /&gt;        set&lt;br /&gt;        {&lt;br /&gt;            _transparentBackgound = &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; OnPaintBackground(PaintEventArgs e)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (_transparentBackgound)&lt;br /&gt;        {&lt;br /&gt;            IPaintControl parent = (IPaintControl)Parent;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (parent != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                parent.InvokePaintBackground(e);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;.OnPaintBackground(e);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;Now we can create the transparent label control using the following code.&lt;/div&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; CcTransparentLabel : CcTransparentControl&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; ContentAlignment textAlign = ContentAlignment.TopLeft;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ContentAlignment TextAlign&lt;br /&gt;    {&lt;br /&gt;        get&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; textAlign;&lt;br /&gt;        }&lt;br /&gt;        set&lt;br /&gt;        {&lt;br /&gt;            textAlign = &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; CcTransparentLabel()&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; OnPaint(PaintEventArgs e)&lt;br /&gt;    {&lt;br /&gt;        Graphics gfx = e.Graphics;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.TextAlign == ContentAlignment.TopLeft)&lt;br /&gt;        {&lt;br /&gt;            gfx.DrawString(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Text, &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Font,&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SolidBrush(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.ForeColor), ClientRectangle);&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.TextAlign == ContentAlignment.TopCenter)&lt;br /&gt;        {&lt;br /&gt;            SizeF size = gfx.MeasureString(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Text, &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Font);&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; left = &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Width / 2 - (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;)size.Width / 2;&lt;br /&gt;            var rect = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Rectangle(ClientRectangle.Left + left,&lt;br /&gt;            ClientRectangle.Top, (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;)size.Width,&lt;br /&gt;            ClientRectangle.Height);&lt;br /&gt;            gfx.DrawString(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Text, &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Font,&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SolidBrush(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.ForeColor), rect);&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.TextAlign == ContentAlignment.TopRight)&lt;br /&gt;        {&lt;br /&gt;            SizeF size = gfx.MeasureString(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Text, &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Font);&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; left = &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Width - (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;)size.Width + &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Left;&lt;br /&gt;            var rect = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Rectangle(ClientRectangle.Left + left,&lt;br /&gt;            ClientRectangle.Top, (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;)size.Width,&lt;br /&gt;            ClientRectangle.Height);&lt;br /&gt;            gfx.DrawString(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Text, &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Font,&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SolidBrush(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.ForeColor), rect);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;In our form, we change the form to inherit from CcForm and drag/drop a CcTransparentLabel onto it.&lt;/div&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; FormWithSolidColorBackground : CcForm&lt;/pre&gt;
&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;Here is the screen shot. As you can see, the label has transparent background now.&lt;/div&gt;

&lt;div&gt;&lt;a href="http://lh3.ggpht.com/_ElXg_EOWn5c/Ss0JRMO1R9I/AAAAAAAAAag/l_qrJQcAkdY/s1600-h/image2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_ElXg_EOWn5c/Ss0JRR4tOmI/AAAAAAAAAak/UNhl6W0_46g/image_thumb.png?imgmax=800" width="184" height="244" /&gt;&lt;/a&gt; &lt;/div&gt;

&lt;div&gt;However, when I tried to add image background with gradient color, my label doesn’t look right anymore.&lt;/div&gt;

&lt;div&gt;&lt;a href="http://lh3.ggpht.com/_ElXg_EOWn5c/Ss0JRi_b5RI/AAAAAAAAAao/78eyU0zH6Zw/s1600-h/image5.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_ElXg_EOWn5c/Ss0JR4aIB4I/AAAAAAAAAas/o1ogvBp0YWs/image_thumb1.png?imgmax=800" width="183" height="244" /&gt;&lt;/a&gt; &lt;/div&gt;

&lt;div&gt;To understand the issue, we need to first take a look of how we display background image on a form.&lt;/div&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; FormWithImageBackground : CcForm&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; Rectangle _backgroundRect;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; Bitmap _background;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; currentPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase.ToString());&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; FormWithImageBackground()&lt;br /&gt;    {&lt;br /&gt;        InitializeComponent();&lt;br /&gt;&lt;br /&gt;        _background = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Bitmap(currentPath + &lt;span style="color: #006080"&gt;@&amp;quot;\ImageBackground.jpg&amp;quot;&lt;/span&gt;);&lt;br /&gt;        _backgroundRect = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Rectangle(0, 0, _background.Width, _background.Height);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; OnPaintBackground(PaintEventArgs e)&lt;br /&gt;    {&lt;br /&gt;        Graphics g = e.Graphics;&lt;br /&gt;        g.DrawImage(_background, &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.ClientRectangle, _backgroundRect, GraphicsUnit.Pixel);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;div&gt;What happened is when the OnPaintBackground was called by the transparent label control, it re-draws the image inside of the label control. So it shows the top-left corner of the image on the label’s background. To fix this issue, I pass in the location of the label control to the form and use it to re-draw the image. For example, if the label is located at (10, 20), the image background would be displayed at (-10, –20). This may not be the best solution, but it worked. Here is revised interface and controls.&lt;/div&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;interface&lt;/span&gt; IPaintControl&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #008000"&gt;// have the background painted&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; InvokePaintBackground(PaintEventArgs e, Point location);&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; CcForm : Form, IPaintControl&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;virtual&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; InvokePaintBackground(PaintEventArgs e, Point location)&lt;br /&gt;    {&lt;br /&gt;        OnPaintBackground(e);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; CcTransparentControl : Control&lt;br /&gt;{&lt;br /&gt;    ....&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; OnPaintBackground(PaintEventArgs e)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (_transparentBackgound)&lt;br /&gt;        {&lt;br /&gt;            IPaintControl parent = (IPaintControl)Parent;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (parent != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                parent.InvokePaintBackground(e, &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Location);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;.OnPaintBackground(e);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;In the form, I then override the InvokePaintBackground method to draw the image at the desired location.&lt;/div&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; InvokePaintBackground(System.Windows.Forms.PaintEventArgs e, System.Drawing.Point location)&lt;br /&gt;{&lt;br /&gt;    Graphics g = e.Graphics;&lt;br /&gt;    Rectangle destRect = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Rectangle(-1 * location.X, -1 * location.Y, ClientRectangle.Width, ClientRectangle.Height);&lt;br /&gt;    g.DrawImage(_background, destRect, _backgroundRect, GraphicsUnit.Pixel);&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;Now we have a transparent label over image background. 
  &lt;br /&gt;&lt;/div&gt;

&lt;div&gt;&lt;a href="http://lh5.ggpht.com/_ElXg_EOWn5c/Ss0JSL4zduI/AAAAAAAAAaw/eQCc_mlMr1E/s1600-h/image8.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_ElXg_EOWn5c/Ss0JSt8z4xI/AAAAAAAAAa0/4sBtRffpApk/image_thumb2.png?imgmax=800" width="184" height="244" /&gt;&lt;/a&gt; &lt;/div&gt;

&lt;div&gt;I also created transparent radio button and checkbox controls. These are the controls commonly used in a form. So is the Panel control. The following example showed the transparent radio button and checkbox on a transparent panel. You can download the complete source code from &lt;a href="http://www.dotnetideas.com/Download/TransparentControlSample.zip"&gt;here&lt;/a&gt;. &lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;a href="http://lh6.ggpht.com/_ElXg_EOWn5c/Ss0JS4vJqJI/AAAAAAAAAa4/zeCAsDA_ZfA/s1600-h/image14.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_ElXg_EOWn5c/Ss0JTYPrCdI/AAAAAAAAAa8/rOjE0LegW9c/image_thumb4.png?imgmax=800" width="184" height="244" /&gt;&lt;/a&gt; 

  &lt;br /&gt;&lt;/div&gt;

&lt;div&gt;&amp;#160; &lt;br /&gt;&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;
  &lt;br /&gt;&lt;/div&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;br /&gt;&lt;/div&gt;

&lt;div&gt;
  &lt;br /&gt;&lt;/div&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;br /&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1850047779793623762-7703297199308003206?l=dotnetideasblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://dotnetideasblog.blogspot.com/2009/10/creating-transparent-controls-in-net.html</link><author>noreply@blogger.com (DotNetIdeas)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_ElXg_EOWn5c/Ss0JRR4tOmI/AAAAAAAAAak/UNhl6W0_46g/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1850047779793623762.post-2771373947109249964</guid><pubDate>Thu, 10 Sep 2009 20:15:00 +0000</pubDate><atom:updated>2010-02-25T09:34:29.816-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>.NET Compact Framework</category><title>Memory leak issue in “How Do I: Programmatically Monitor for a Specific Time of Day Without Draining a Device Battery?”</title><description>&lt;p&gt;Recently I worked on improving our SmartOrganizer 3.1 application. I need to add notification to it, so when a task or appointment is due, the application will prompt the user. Also I want this to run efficiently so it won’t drain the device battery. I found some sample code from &lt;a href="http://msdn.microsoft.com/en-us/windowsmobile/bb870451.aspx"&gt;“How Do I” video for Device&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Though the code worked well initially, I found a couple issues which caused memory leak later. Here I will post the original code and my fix.&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div id="codeSnippetWrapper"&gt;     &lt;div id="codeSnippetWrapper"&gt;       &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.ComponentModel;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Data;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Drawing;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows.Forms;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Diagnostics;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; HowDoI.Examples;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Threading;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; TimeOfDayEvent_CS&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Form1 : Form&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Form1()&lt;br /&gt;        {&lt;br /&gt;            InitializeComponent();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; _eventName = &lt;span style="color: #006080"&gt;@&amp;quot;TimeOfDayEventExample&amp;quot;&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; _timeOfDayEventName = &lt;span style="color: #006080"&gt;@&amp;quot;\\.\Notifications\NamedEvents\&amp;quot; + _eventName;&lt;br /&gt;        IntPtr _nativeWaitHandle = IntPtr.Zero;&lt;br /&gt;        Thread _backgroundThread = null;&lt;br /&gt;        bool _programIsShuttingDown = false;&lt;br /&gt;        private void menuSetTimeNtfy_Click(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            // Declare and convert time values&lt;br /&gt;            DateTime targetTime = GetTargetTime();&lt;br /&gt;            long targetTimeAsFileTimeUTC = targetTime.ToFileTime();&lt;br /&gt;            long targetTimeAsFileTimeLocal = 0;&lt;br /&gt;            Win32.FileTimeToLocalFileTime(ref targetTimeAsFileTimeUTC, &lt;br /&gt;                ref targetTimeAsFileTimeLocal);&lt;br /&gt;            SystemTime targetTimeAsSystemTime = new SystemTime();&lt;br /&gt;            Win32.FileTimeToSystemTime(ref targetTimeAsFileTimeLocal, targetTimeAsSystemTime);&lt;br /&gt;&lt;br /&gt;            // Create named Win32 Event Object&lt;br /&gt;            _nativeWaitHandle = Win32.CreateEvent(0, 0, 0, _eventName);&lt;br /&gt;&lt;br /&gt;            // Start the background thread&lt;br /&gt;            _backgroundThread = new Thread(ThreadFunction);&lt;br /&gt;            _backgroundThread.Start();&lt;br /&gt;&lt;br /&gt;            Win32.CeRunAppAtTime(_timeOfDayEventName, targetTimeAsSystemTime);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        void ThreadFunction()&lt;br /&gt;        {&lt;br /&gt;            // Wait for the event to signal&lt;br /&gt;            // When signaled our target time has happened&lt;br /&gt;            Win32.WaitForSingleObject(_nativeWaitHandle, -1);&lt;br /&gt;&lt;br /&gt;            // Do our Target Time processing&lt;br /&gt;            if (!_programIsShuttingDown)&lt;br /&gt;                BeginInvoke((TimeHasOccurredDelegate)TimeHasOccurred, new object[] { DateTime.Now }); &lt;br /&gt;            //TimeHasOccurred(DateTime.Now);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        void TimeHasOccurred(DateTime time)&lt;br /&gt;        {&lt;br /&gt;            notification1.Text = &lt;br /&gt;                string.Format(&amp;quot;&lt;/span&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;font color=\&lt;span style="color: #006080"&gt;'#000000\'&amp;gt;&amp;lt;b&amp;gt;It'&lt;/span&gt;s Time: {0}&amp;lt;b&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;span style="color: #006080"&gt;&amp;quot;, &lt;br /&gt;                time.ToString());&lt;br /&gt;            notification1.Visible = true;&lt;br /&gt;            Debug.WriteLine(&amp;quot;&lt;/span&gt;It's Time: &lt;span style="color: #006080"&gt;&amp;quot; + time.ToString());&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        delegate void TimeHasOccurredDelegate(DateTime time);&lt;br /&gt;&lt;br /&gt;        private DateTime GetTargetTime()&lt;br /&gt;        {&lt;br /&gt;            //DateTime targetTime = new DateTime(2007, 8, 31, 10, 15, 0);&lt;br /&gt;            // For demo purposes pick date time 1 minute in the future&lt;br /&gt;            DateTime currentTime = DateTime.Now;&lt;br /&gt;            DateTime targetTime = currentTime + new TimeSpan(0, 1, 0);&lt;br /&gt;&lt;br /&gt;            Debug.WriteLine(&amp;quot;&lt;/span&gt;CurrentTime: &lt;span style="color: #006080"&gt;&amp;quot; + currentTime.ToString());&lt;br /&gt;            Debug.WriteLine(&amp;quot;&lt;/span&gt;TargetTime: &amp;quot; + targetTime.ToString());&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; targetTime;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; _threadShutdownTimeout = 30000;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Form1_Closing(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, CancelEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (_nativeWaitHandle != IntPtr.Zero)&lt;br /&gt;            {&lt;br /&gt;                _programIsShuttingDown = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;br /&gt;                Win32.SetEvent(_nativeWaitHandle);&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (_backgroundThread != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; shutdownSucceeded = _backgroundThread.Join(_threadShutdownTimeout);&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!shutdownSucceeded)&lt;br /&gt;                        _backgroundThread.Abort();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;

      &lt;br /&gt;&lt;/div&gt;

    &lt;br /&gt;&lt;/div&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Here is the native method calls&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Runtime.InteropServices;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; HowDoI.Examples&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Win32&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #cc6633"&gt;#region&lt;/span&gt; Win32 Time-related Functiions&lt;br /&gt;&lt;br /&gt;        [DllImport(&lt;span style="color: #006080"&gt;&amp;quot;CoreDLL.dll&amp;quot;&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; CeRunAppAtTime(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; application, SystemTime startTime);&lt;br /&gt;        [DllImport(&lt;span style="color: #006080"&gt;&amp;quot;CoreDLL.dll&amp;quot;&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; FileTimeToSystemTime(&lt;span style="color: #0000ff"&gt;ref&lt;/span&gt; &lt;span style="color: #0000ff"&gt;long&lt;/span&gt; lpFileTime, SystemTime lpSystemTime);&lt;br /&gt;        [DllImport(&lt;span style="color: #006080"&gt;&amp;quot;CoreDLL.dll&amp;quot;&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; FileTimeToLocalFileTime(&lt;span style="color: #0000ff"&gt;ref&lt;/span&gt; &lt;span style="color: #0000ff"&gt;long&lt;/span&gt; lpFileTime, &lt;span style="color: #0000ff"&gt;ref&lt;/span&gt; &lt;span style="color: #0000ff"&gt;long&lt;/span&gt; lpLocalFileTime);&lt;br /&gt;        [DllImport(&lt;span style="color: #006080"&gt;&amp;quot;CoreDLL.dll&amp;quot;&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; ShowWindow(IntPtr hWnd, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; nCmdShow);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #cc6633"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #cc6633"&gt;#region&lt;/span&gt; Win32  Event Object Functions&lt;br /&gt;&lt;br /&gt;        [DllImport(&lt;span style="color: #006080"&gt;&amp;quot;CoreDLL.dll&amp;quot;&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; IntPtr CreateEvent(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; alwaysZero, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; manualReset, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; initialState, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; eventName);&lt;br /&gt;        [DllImport(&lt;span style="color: #006080"&gt;&amp;quot;CoreDLL.dll&amp;quot;&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; WaitForSingleObject(IntPtr handle, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; waitTimeInMilliseconds);&lt;br /&gt;        [DllImport(&lt;span style="color: #006080"&gt;&amp;quot;CoreDLL.dll&amp;quot;&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; EventModify(IntPtr handle, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; eventAction);&lt;br /&gt;        [DllImport(&lt;span style="color: #006080"&gt;&amp;quot;CoreDLL.dll&amp;quot;&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; CloseHandle(IntPtr handle);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; SetEvent(IntPtr handle)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; EVENT_SET = 3;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; EventModify(handle, EVENT_SET); &lt;span style="color: #008000"&gt;// in WM, SetEvent, ResetEvent, &amp;amp; PulseEvent are all implemented as EventModify&lt;/span&gt;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;&lt;span style="color: #cc6633"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #cc6633"&gt;#region&lt;/span&gt; Win32 SystemTime&lt;br /&gt;&lt;br /&gt;    [StructLayout(LayoutKind.Sequential)]&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; SystemTime&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ushort&lt;/span&gt; wYear;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ushort&lt;/span&gt; wMonth;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ushort&lt;/span&gt; wDayOfWeek;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ushort&lt;/span&gt; wDay;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ushort&lt;/span&gt; wHour;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ushort&lt;/span&gt; wMinute;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ushort&lt;/span&gt; wSecond;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ushort&lt;/span&gt; wMilliseconds;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #cc6633"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;The time monitoring and notification in above code worked perfectly. However, I noticed that if I stop the application before the time is up, the application disappeared from the task manager, but the memory was not released. Furthermore, I used the Remote Process Viewer to check which process is running. I can see that process is still there. As I was writing this blog, I noticed that it only happen on device, not emulator. For some reasons, the device couldn’t kill the background thread when it is not done. The solution is. in fact, pretty simple - reset the timer. Add the following line of code before Join the background thread. [currentTime] is current time in SystemTime format.&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;Win32.CeRunAppAtTime(_timeOfDayEventName, [currentTime]);&lt;br /&gt;&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; shutdownSucceeded = _backgroundThread.Join(_threadShutdownTimeout);&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1850047779793623762-2771373947109249964?l=dotnetideasblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://dotnetideasblog.blogspot.com/2009/09/memory-leak-issue-in-how-do-i.html</link><author>noreply@blogger.com (DotNetIdeas)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1850047779793623762.post-4650875287651335630</guid><pubDate>Tue, 25 Aug 2009 17:47:00 +0000</pubDate><atom:updated>2009-08-25T10:47:37.769-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>.NET Compact Framework</category><title>This application requires a newer version of the Microsoft .NET Compact Framework than the version installed on this device</title><description>&lt;p&gt;This is the second time I ran into this error in last couple months. I better write it down so I don’t forget again. &lt;/p&gt;  &lt;p&gt;I was creating a .NET Compact Framework Application. I want it to be able to run on older devices, so I choose .NET Framework 2.0 thinking the project will be .NET 2.0 project(see picture 1). However, when I tried to run the application on a smart phone, I got the error “This application requires a newer version of the Microsoft .NET Compact Framework than the version installed on this device.” You have to specify the version of .NET Compact Framework on the second dialog box(see picture 2). &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_ElXg_EOWn5c/SpQjoEpfp1I/AAAAAAAAAY4/1tdatnS3zQA/s1600-h/image5.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_ElXg_EOWn5c/SpQjopKgxlI/AAAAAAAAAY8/4cyYHu8GP84/image_thumb1.png?imgmax=800" width="244" height="157" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Picture 1&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_ElXg_EOWn5c/SpQjpoYRS6I/AAAAAAAAAZA/DY1YY_Mj5U0/s1600-h/image8.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_ElXg_EOWn5c/SpQjqeCao_I/AAAAAAAAAZE/vHYSmDn327E/image_thumb2.png?imgmax=800" width="244" height="183" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Picture 2&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1850047779793623762-4650875287651335630?l=dotnetideasblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://dotnetideasblog.blogspot.com/2009/08/this-application-requires-newer-version.html</link><author>noreply@blogger.com (DotNetIdeas)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_ElXg_EOWn5c/SpQjopKgxlI/AAAAAAAAAY8/4cyYHu8GP84/s72-c/image_thumb1.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1850047779793623762.post-4924917235960015728</guid><pubDate>Thu, 14 May 2009 22:00:00 +0000</pubDate><atom:updated>2009-05-18T14:16:54.308-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>.NET Compact Framework</category><title>.NET Compact Framework Programming Tips</title><description>&lt;h4&gt;How to get entry assembly path?&lt;/h4&gt;  &lt;div&gt;   &lt;div&gt;     &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// Simulate Assembly.GetEntryAssembly that is not supported by the Compact Framework.&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;Path and name of first executable as a string.&amp;lt;/returns&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; GetEntryAssembly()
{
    StringBuilder sb = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;
    IntPtr moduleHandler = GetCurrentModuleHandle();
    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (IntPtr.Zero != moduleHandler)
    {
        sb = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StringBuilder(255);
        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (0 == SafeGetModuleFileName(moduleHandler, sb, sb.Capacity))
        {
            sb = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;
        }
    }
    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; sb.ToString();
}

&lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// Safe wrapper for PINVOKE GetModuleHandle.&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;A handle to the current module indicates success.&amp;lt;/returns&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IntPtr GetCurrentModuleHandle()
{
    IntPtr moduleName = IntPtr.Zero;
    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; GetModuleHandle(moduleName);
}

&lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// Safe wrapper for PINVOKE GetModuleFileName.&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;moduleHandler&amp;quot;&amp;gt;Handle to the module whose executable file name is being requested.&amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;moduleName&amp;quot;&amp;gt;Pointer to a buffer that is filled in with the path and file name of the given module. &amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;capacity&amp;quot;&amp;gt; Specifies the length, in characters, of the ModuleName buffer.&amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;The length, in characters, of the string copied to the buffer indicates success. &amp;lt;/returns&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Int32 SafeGetModuleFileName(IntPtr moduleHandler, StringBuilder moduleName, Int32 capacity)
{
    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (capacity &amp;gt; 255)
    {
        capacity = 255;
    }
    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; GetModuleFileName(moduleHandler, moduleName, capacity);
}

&lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// PINVOKE that gets a module handle for the specified module if the file has been mapped into the address space of the calling process. &lt;/span&gt;
&lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;moduleName&amp;quot;&amp;gt;Pointer to a null-terminated string that contains the name of the module, which must be a DLL file.&amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;A handle to the specified module indicates success.&amp;lt;/returns&amp;gt;&lt;/span&gt;
[System.Runtime.InteropServices.DllImport(&lt;span style="color: #006080"&gt;&amp;quot;CoreDll.dll&amp;quot;&lt;/span&gt;, SetLastError = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)]
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; IntPtr GetModuleHandle(IntPtr moduleName);

&lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// PINVOKE that gets a module file name.&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;moduleHandler&amp;quot;&amp;gt;Handle to the module whose executable file name is being requested.&amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;moduleName&amp;quot;&amp;gt;Pointer to a buffer that is filled in with the path and file name of the given module. &amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;capacity&amp;quot;&amp;gt; Specifies the length, in characters, of the ModuleName buffer.&amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;The length, in characters, of the string copied to the buffer indicates success. &amp;lt;/returns&amp;gt;&lt;/span&gt;
[System.Runtime.InteropServices.DllImport(&lt;span style="color: #006080"&gt;&amp;quot;CoreDll.dll&amp;quot;&lt;/span&gt;, SetLastError = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)]
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; Int32 GetModuleFileName(IntPtr moduleHandler, StringBuilder moduleName, Int32 capacity);&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h4&gt;How to set a form foreground?&lt;/h4&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; SetForegroundWindow(Form form)
{
    form.Capture = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;
    IntPtr hwnd = GetCapture();
    form.Capture = &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;
    SetForegroundWindow(hwnd);
}

[System.Runtime.InteropServices.DllImport(&lt;span style="color: #006080"&gt;&amp;quot;coredll.dll&amp;quot;&lt;/span&gt;, SetLastError = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)]
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; SetForegroundWindow(IntPtr hWnd);

[System.Runtime.InteropServices.DllImport(&lt;span style="color: #006080"&gt;&amp;quot;coredll.dll&amp;quot;&lt;/span&gt;, SetLastError = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)]
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; IntPtr GetCapture();&lt;/pre&gt;
&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;h4&gt;How to get memory status?&lt;/h4&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// Retrieves the memory status of the device&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; MemoryStatus GlobalMemoryStatus()
{
    MemoryStatus ms = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; MemoryStatus();
    GlobalMemoryStatusCE(&lt;span style="color: #0000ff"&gt;out&lt;/span&gt; ms);
    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ms;
}

[System.Runtime.InteropServices.DllImport(&lt;span style="color: #006080"&gt;&amp;quot;coredll&amp;quot;&lt;/span&gt;, EntryPoint = &lt;span style="color: #006080"&gt;&amp;quot;GlobalMemoryStatus&amp;quot;&lt;/span&gt;, SetLastError = &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;)]
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; GlobalMemoryStatusCE(&lt;span style="color: #0000ff"&gt;out&lt;/span&gt; MemoryStatus msce);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Below is the MemoryStatus structure used above&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// Memory Status Structure&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;struct&lt;/span&gt; MemoryStatus
{
    &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;/// Length of Structure&lt;/span&gt;
    &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;internal&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; Length;
    &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;/// Specifies a number between 0 and 100 that gives a general idea of current memory utilization, in which 0 indicates no memory use and 100 indicates full memory use.&lt;/span&gt;
    &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; MemoryLoad;
    &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;/// Indicates the total number of bytes of physical memory.&lt;/span&gt;
    &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; TotalPhysical;
    &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;/// Indicates the number of bytes of physical memory available.&lt;/span&gt;
    &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; AvailablePhysical;
    &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;/// Indicates the total number of bytes that can be stored in the paging file. Note that this number does not represent the actual physical size of the paging file on disk.&lt;/span&gt;
    &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; TotalPageFile;
    &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;/// Indicates the number of bytes available in the paging file.&lt;/span&gt;
    &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; AvailablePageFile;
    &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;/// Indicates the total number of bytes that can be described in the user mode portion of the virtual address space of the calling process.&lt;/span&gt;
    &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; TotalVirtual;
    &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;/// Indicates the number of bytes of unreserved and uncommitted memory in the user mode portion of the virtual address space of the calling process.&lt;/span&gt;
    &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; AvailableVirtual;
}&lt;/pre&gt;
&lt;/div&gt;

&lt;h4&gt;How to prevent device fall asleep?&lt;/h4&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// This function resets a system timer that controls whether or not the&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// device will automatically go into a suspended state.&lt;/span&gt;
&lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
[DllImport(&lt;span style="color: #006080"&gt;&amp;quot;CoreDll.dll&amp;quot;&lt;/span&gt;)]
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; SystemIdleTimerReset();&lt;/pre&gt;
&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1850047779793623762-4924917235960015728?l=dotnetideasblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://dotnetideasblog.blogspot.com/2009/05/net-compact-framework-programming-tips.html</link><author>noreply@blogger.com (DotNetIdeas)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-1850047779793623762.post-7278913740511534427</guid><pubDate>Tue, 24 Feb 2009 21:19:00 +0000</pubDate><atom:updated>2009-03-03T15:05:47.298-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>.NET Compact Framework</category><title>How to play sound in windows mobile?</title><description>&lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Recently I created a Smart Device application called &lt;a href="http://www.dotnetideas.com/DotNetIdeas/Products.aspx"&gt;SightReader&lt;/a&gt;. There is a virtual piano keyboard in it and I need to play sound when the user clicks a key on keyboard. I was trying to use the WavPlayer I created before. It is easy to use, but it only support WAV file. I generated the sound &lt;place w:st="on"&gt;MIDI&lt;/place&gt; file for each key and then converted them to WAV file. However I couldn&amp;#8217;t get the wav file to be reasonable size. So the compiled executable was huge and impossible to use on a Smart Device. Finally I created another SoundPlayer which can play &lt;place w:st="on"&gt;MIDI&lt;/place&gt;, MP3 and WAV file. It works fine except it has slower response time. &lt;/p&gt;  &lt;p class="MsoNormal"&gt;New update(3/3/2009): I really don't like the sound of the MIDI in my SightReader. So I searched and searched. Finally somebody mentioned that you can use &amp;quot;Sound Recorder&amp;quot; in Windows to reduce the size of a WAV file. But when I looked the Sound Recorder in Vista, I don't see any choice other than recording sound. So I went to a Windows 2000. Aha! Here we go. Now I was able to use audio format &amp;quot;11.025 khz, 16 Bit, Mono&amp;quot; to convert my once 200 KB WAV file to 22 KB. Other good things about the Sound Record is you can do some editing to the WAV file, such as increase the volume or deletion. It is a shame that Microsoft doesn't provide the same features in Vista.&amp;#160; &lt;/p&gt;  &lt;h3&gt;How to play WAV file?&lt;/h3&gt;  &lt;div&gt;   &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; WavPlayer
{
    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] m_soundBytes;
    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; m_fileName;
 
    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;enum&lt;/span&gt; Flags
    {
        SND_SYNC = 0x0000,  &lt;span style="color: #008000"&gt;/* play synchronously (default) */&lt;/span&gt;
        SND_ASYNC = 0x0001,  &lt;span style="color: #008000"&gt;/* play asynchronously */&lt;/span&gt;
        SND_NODEFAULT = 0x0002,  &lt;span style="color: #008000"&gt;/* silence (!default) if sound not found */&lt;/span&gt;
        SND_MEMORY = 0x0004,  &lt;span style="color: #008000"&gt;/* pszSound points to a memory file */&lt;/span&gt;
        SND_LOOP = 0x0008,  &lt;span style="color: #008000"&gt;/* loop the sound until next sndPlaySound */&lt;/span&gt;
        SND_NOSTOP = 0x0010,  &lt;span style="color: #008000"&gt;/* don't stop any currently playing sound */&lt;/span&gt;
        SND_NOWAIT = 0x00002000, &lt;span style="color: #008000"&gt;/* don't wait if the driver is busy */&lt;/span&gt;
        SND_ALIAS = 0x00010000, &lt;span style="color: #008000"&gt;/* name is a registry alias */&lt;/span&gt;
        SND_ALIAS_ID = 0x00110000, &lt;span style="color: #008000"&gt;/* alias is a predefined ID */&lt;/span&gt;
        SND_FILENAME = 0x00020000, &lt;span style="color: #008000"&gt;/* name is file name */&lt;/span&gt;
        SND_RESOURCE = 0x00040004  &lt;span style="color: #008000"&gt;/* name is resource name or atom */&lt;/span&gt;
    }

    [DllImport(&lt;span style="color: #006080"&gt;&amp;quot;CoreDll.DLL&amp;quot;&lt;/span&gt;, EntryPoint = &lt;span style="color: #006080"&gt;&amp;quot;PlaySound&amp;quot;&lt;/span&gt;, SetLastError = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)]
    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; WCE_PlaySound(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; szSound, IntPtr hMod, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; flags);
 
    [DllImport(&lt;span style="color: #006080"&gt;&amp;quot;CoreDll.DLL&amp;quot;&lt;/span&gt;, EntryPoint = &lt;span style="color: #006080"&gt;&amp;quot;PlaySound&amp;quot;&lt;/span&gt;, SetLastError = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)]
    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; WCE_PlaySoundBytes(&lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] szSound, IntPtr hMod, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; flags);
 
    &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;/// Construct the Sound object to play sound data from the specified file.&lt;/span&gt;
    &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; WavPlayer(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; fileName)
    {
        m_fileName = fileName;
    }
 
    &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;/// Construct the Sound object to play sound data from the specified stream.&lt;/span&gt;
    &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; WavPlayer(Stream stream)
    {
        &lt;span style="color: #008000"&gt;// read the data from the stream&lt;/span&gt;
        m_soundBytes = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[stream.Length];
        stream.Read(m_soundBytes, 0, (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;)stream.Length);
    }
 
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; WavPlayer(&lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] soundBytes)
    {
        m_soundBytes = soundBytes;
    }
 
 
    &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;/// Play the sound&lt;/span&gt;
    &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Play()
    {
        &lt;span style="color: #008000"&gt;// if a file name has been registered, call WCE_PlaySound,&lt;/span&gt;
        &lt;span style="color: #008000"&gt;//  otherwise call WCE_PlaySoundBytes&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (m_fileName != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)
            WCE_PlaySound(m_fileName, IntPtr.Zero, (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;)(Flags.SND_SYNC | Flags.SND_FILENAME));
        &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;
            WCE_PlaySoundBytes(m_soundBytes, IntPtr.Zero, (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;)(Flags.SND_SYNC | Flags.SND_MEMORY));
    }
}

 &lt;/pre&gt;
&lt;/div&gt;

&lt;h3&gt;&lt;span style="mso-no-proof: yes"&gt;How to play &lt;place w:st="on"&gt;MIDI&lt;/place&gt;, MP3 and other sound? &lt;/span&gt;&lt;/h3&gt;

&lt;p&gt;&lt;span style="mso-no-proof: yes"&gt;&lt;/span&gt;&lt;span style="mso-no-proof: yes"&gt;This method will only work in Windows Mobile 6 and later.&lt;/span&gt;&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;enum&lt;/span&gt; SoundFileType { WAV, MP3, MIDI, WMA }

&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; SoundPlayer : IDisposable
{
    [DllImport(&lt;span style="color: #006080"&gt;&amp;quot;aygshell.dll&amp;quot;&lt;/span&gt;)]
    &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff"&gt;uint&lt;/span&gt; SndOpen(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; pszSoundFile, &lt;span style="color: #0000ff"&gt;ref&lt;/span&gt; IntPtr phSound);
 
    [DllImport(&lt;span style="color: #006080"&gt;&amp;quot;aygshell.dll&amp;quot;&lt;/span&gt;)]
    &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff"&gt;uint&lt;/span&gt; SndPlayAsync(IntPtr hSound, &lt;span style="color: #0000ff"&gt;uint&lt;/span&gt; dwFlags);
 
    [DllImport(&lt;span style="color: #006080"&gt;&amp;quot;aygshell.dll&amp;quot;&lt;/span&gt;)]
    &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff"&gt;uint&lt;/span&gt; SndClose(IntPtr hSound);
 
    [DllImport(&lt;span style="color: #006080"&gt;&amp;quot;aygshell.dll&amp;quot;&lt;/span&gt;)]
    &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff"&gt;uint&lt;/span&gt; SndStop(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; SoundScope, IntPtr hSound);
 
    [DllImport(&lt;span style="color: #006080"&gt;&amp;quot;aygshell.dll&amp;quot;&lt;/span&gt;)]
    &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff"&gt;uint&lt;/span&gt; SndPlaySync(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; pszSoundFile, &lt;span style="color: #0000ff"&gt;uint&lt;/span&gt; dwFlags);
 
    &lt;span style="color: #0000ff"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; SND_SCOPE_PROCESS = 0x1;
    IntPtr sound = IntPtr.Zero;
    Thread soundThread = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;
 
    &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; _filePath = &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Empty;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; FilePath
    {
        get { &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _filePath; }
        set { _filePath = &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;; }
    }
 
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; SoundPlayer(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; filePath)
    {
        _filePath = filePath;
    }
 
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; SoundPlayer(&lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] soundBytes, SoundFileType fileType)
    {
        &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; fileExtension = &lt;span style="color: #006080"&gt;&amp;quot;.wav&amp;quot;&lt;/span&gt;;
        &lt;span style="color: #0000ff"&gt;switch&lt;/span&gt; (fileType)
        {
            &lt;span style="color: #0000ff"&gt;case&lt;/span&gt; SoundFileType.WAV:
                fileExtension = &lt;span style="color: #006080"&gt;&amp;quot;.wav&amp;quot;&lt;/span&gt;;
                &lt;span style="color: #0000ff"&gt;break&lt;/span&gt;;
            &lt;span style="color: #0000ff"&gt;case&lt;/span&gt; SoundFileType.MP3:
                fileExtension = &lt;span style="color: #006080"&gt;&amp;quot;.mp3&amp;quot;&lt;/span&gt;;
                &lt;span style="color: #0000ff"&gt;break&lt;/span&gt;;
            &lt;span style="color: #0000ff"&gt;case&lt;/span&gt; SoundFileType.MIDI:
                fileExtension = &lt;span style="color: #006080"&gt;&amp;quot;.mid&amp;quot;&lt;/span&gt;;
                &lt;span style="color: #0000ff"&gt;break&lt;/span&gt;;
            &lt;span style="color: #0000ff"&gt;default&lt;/span&gt;:
                &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Exception(&lt;span style="color: #006080"&gt;&amp;quot;Audio format is not supported.&amp;quot;&lt;/span&gt;);
                &lt;span style="color: #0000ff"&gt;break&lt;/span&gt;;
        }
 
        _filePath = Path.GetTempPath() + &lt;span style="color: #006080"&gt;&amp;quot;tempSound&amp;quot;&lt;/span&gt; + fileExtension;
        FileStream fs = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; FileStream(_filePath, FileMode.Create, FileAccess.ReadWrite);
        fs.Write(soundBytes, 0, soundBytes.Length);
        fs.Close();
    }
 
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Play()
    {
        SndPlaySync(_filePath, 0);
    }
 
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; PlayLooping()
    {
        soundThread = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Thread(Playing);
        soundThread.Start();
    }
 
    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Playing()
    {
        &lt;span style="color: #0000ff"&gt;while&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)
        {
            SndPlaySync(_filePath, 0);
        }
    }
 
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; PlayAsync()
    {
        SndOpen(_filePath, &lt;span style="color: #0000ff"&gt;ref&lt;/span&gt; sound);
        SndPlayAsync(sound, 0);
    }
 
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Stop()
    {
        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (soundThread != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)
        {
            SndStop(SND_SCOPE_PROCESS, IntPtr.Zero);
            soundThread.Abort();
            soundThread = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;
        }
        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (sound != IntPtr.Zero)
        {
            SndStop(SND_SCOPE_PROCESS, IntPtr.Zero);
            SndClose(sound);
            sound = IntPtr.Zero;
        }
    }
 
    &lt;span style="color: #cc6633"&gt;#region&lt;/span&gt; IDisposable Members
 
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Dispose()
    {
        Stop();
    }
 
    &lt;span style="color: #cc6633"&gt;#endregion&lt;/span&gt;
}

region&lt;/pre&gt;
&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1850047779793623762-7278913740511534427?l=dotnetideasblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://dotnetideasblog.blogspot.com/2009/02/how-to-play-sound-in-windows-mobile.html</link><author>noreply@blogger.com (DotNetIdeas)</author><thr:total>0</thr:total></item></channel></rss>