<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.slimcode.com/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>slimCODE</title><link>http://www.slimcode.com/cs/blogs/default.aspx</link><description>commUNITY</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Updating the list of available slimSEARCH entries</title><link>http://www.slimcode.com/cs/blogs/martin/archive/2010/01/27/updating-the-list-of-available-slimsearch-entries.aspx</link><pubDate>Wed, 27 Jan 2010 15:21:24 GMT</pubDate><guid isPermaLink="false">ccca17bc-cc72-4bae-972f-7bd738c168c1:595</guid><dc:creator>slimcode</dc:creator><slash:comments>4</slash:comments><description>&lt;p&gt;The slimSEARCH plug-in for slimKEYS is a beast sometimes difficult to maintain. The number of web sites you can search into evolves with time. Within a slimSEARCH hotkey configuration, you can add predefined search entries using the green plus sign without the yellow sparkle.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://www.slimcode.com/cs/blogs/files/UpdatingthelistofavailableslimSEARCHentr_8FED/image.png" width="292" height="71" /&gt; &lt;/p&gt;  &lt;p&gt;This will show you a list of all search entries that come with slimKEYS, and all the ones you manually created before.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://www.slimcode.com/cs/blogs/files/UpdatingthelistofavailableslimSEARCHentr_8FED/image_3.png" width="350" height="341" /&gt; &lt;/p&gt;  &lt;p&gt;Notice the “Update list online” link at the bottom? This fetches &lt;a href="http://www.slimcode.com/slimKEYS/update/slimSEARCH.PredefinedSearches.xml" target="_blank"&gt;an XML file on slimcode.com&lt;/a&gt; that gives you more entries. I have updated this file only once since the release of the slimSEARCH plug-in, but it pretty much contains all the search entries I’m using. If you don’t find what you want, you can manually add new entries by using the second green plus sign with a sparkle, and select “Custom web search”.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://www.slimcode.com/cs/blogs/files/UpdatingthelistofavailableslimSEARCHentr_8FED/image_4.png" width="285" height="64" /&gt; &lt;/p&gt;  &lt;p&gt;This gives you a blank entry you must fill in.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://www.slimcode.com/cs/blogs/files/UpdatingthelistofavailableslimSEARCHentr_8FED/image_5.png" width="408" height="344" /&gt; &lt;/p&gt;  &lt;p&gt;It’s not that hard to find out what search pattern to use. Let’s take the &lt;a href="https://marketplace.windowsphone.com/" target="_blank"&gt;Windows Marketplace for Mobile&lt;/a&gt;. Enter two distinctive words in the search box, like “foobar slimcode” and proceed with the search.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://www.slimcode.com/cs/blogs/files/UpdatingthelistofavailableslimSEARCHentr_8FED/image_6.png" width="265" height="167" /&gt; &lt;/p&gt;  &lt;p&gt;Without considering the actual result page, look at the destination URL:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://www.slimcode.com/cs/blogs/files/UpdatingthelistofavailableslimSEARCHentr_8FED/image_7.png" width="583" height="72" /&gt; &lt;/p&gt;  &lt;p&gt;This is the URL you must use as your search pattern. Do you see “foobar%20slimcode”? That’s what you must replace with “{keywords}”. In this example, the final search pattern is:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;https://marketplace.windowsphone.com/search.aspx?keywords={keywords}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;We used two words on purpose, to see how a space was encoded. In this case, it became “%20”. By default, slimSEARCH replaces spaces with “%2B”, the equivalent of a “+” symbol. You can test how the target web site handles “%2B”, or explicitly tell slimSEARCH to use another symbol by checking “Replace spaces with this character”. The Marketplace web site has no problems with the default “+” sign, so I’ve left it unchecked, and filled in the rest of the info.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://www.slimcode.com/cs/blogs/files/UpdatingthelistofavailableslimSEARCHentr_8FED/image_8.png" width="690" height="460" /&gt; &lt;/p&gt;  &lt;p&gt;Some notes: In the title, you can put an ampersand symbol (&amp;amp;) before a letter, so that you can press “Alt-That letter” within the slimSEARCH popup to use that search entry. The toughest part is finding a letter you didn’t already use! :) Alt-R was still available for me. I chose “mm” as the prefix command (for “&lt;strong&gt;M&lt;/strong&gt;obile &lt;strong&gt;M&lt;/strong&gt;arketplace”). This allows me to type “mm grocery list” and press &lt;strong&gt;Enter&lt;/strong&gt; instead of typing “grocery list” and press &lt;strong&gt;Alt-R (&lt;/strong&gt;even though I rarely use prefix commands, except for the “@” symbol for Twitter user searches).&lt;/p&gt;  &lt;p&gt;Also, make sure you move your new search entry above “Web Address Filter” and “Start new process”, by using the “Move search entry up” blue arrow button. These two special entries should always be at the bottom. The next version of slimKEYS will actually hide you these two special entries.&lt;/p&gt;  &lt;p&gt;Do you have custom search entries? Share them here!&lt;/p&gt;&lt;img src="http://www.slimcode.com/cs/aggbug.aspx?PostID=595" width="1" height="1"&gt;</description><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/English/default.aspx">English</category><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/Non-technical/default.aspx">Non-technical</category></item><item><title>Making it fit into 140 chars</title><link>http://www.slimcode.com/cs/blogs/martin/archive/2010/01/11/making-it-fit-into-140-chars.aspx</link><pubDate>Mon, 11 Jan 2010 14:03:18 GMT</pubDate><guid isPermaLink="false">ccca17bc-cc72-4bae-972f-7bd738c168c1:588</guid><dc:creator>slimcode</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;It’s clear to me now. Blogs are for tweets that can’t fit into 140 chars. Often do I find myself with a nice idea that &lt;u&gt;can&lt;/u&gt; fit into 140 chars, but that would also benefit to be exposed in greater terms on my blog. But the ease and quickness of posting to Twitter always wins.&lt;/p&gt;  &lt;p&gt;The art of compressing a message to fit nicely into 140 chars is not given to anyone, though. My &lt;a href="http://twitter.com/slimcode" target="_blank"&gt;@slimCODE&lt;/a&gt; Twitter account (corporate) was followed by &lt;a href="http://twitter.com/rescoapps" target="_blank"&gt;@RescoApps&lt;/a&gt; from &lt;a href="http://www.resco.net/default.aspx" target="_blank"&gt;Resco.net&lt;/a&gt;. Since I do use their Resco Explorer software, I politely followed back. Then I received these two automated direct messages:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Thank you for the follow!We hope our tweets will always remain worthful for you. Use our&amp;quot;new follower&amp;quot;gift.Will last only till 1st February.&lt;/p&gt;    &lt;p&gt;The Gift:25%price discount on our PhotoManager for WM: &lt;a href="http://www.resco.net/buy/pocketpc.asp?additem=11117&amp;amp;code=TWITTER1&amp;amp;m=Twitter"&gt;http://www.resco.net/buy/pocketpc.asp?additem=11117&amp;amp;code=TWITTER1&amp;amp;m=Twitter&lt;/a&gt; Regards,R&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Both messages are exactly 140 chars. Notice the absence of spaces after punctuation in the first message, and around the “25%” in the second message, and the use of “till” instead of “until” in the first message. And that second message with the ugly URL is unreadable. That’s lazy work, guys. You could have done much better! Understand the importance of good “Tweet Compression”. It’s an art!&lt;/p&gt;  &lt;p&gt;For example, replace “1st February” with “Feb 1st” and you save 5 chars you can allocate to spaces and that missing “u” in “until”. Also, use smaller URLs. I understand the benefit of using your own domain. Add a redirection on your site, so you can use something like “www.resco.net/newfollower”, it’s much cleaner. Finally, drop that “Regards,R” signature. Twitter is not email.&lt;/p&gt;  &lt;p&gt;Oh, by the way: “worthful” isn’t a word.&lt;/p&gt;  &lt;p&gt;And also: I hate auto-direct messages. I’m not using Twitter to talk with robots. Unfollowed. :(&lt;/p&gt;&lt;img src="http://www.slimcode.com/cs/aggbug.aspx?PostID=588" width="1" height="1"&gt;</description><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/English/default.aspx">English</category><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/Non-technical/default.aspx">Non-technical</category></item><item><title>More Marketplace numbers</title><link>http://www.slimcode.com/cs/blogs/martin/archive/2010/01/03/more-marketplace-numbers.aspx</link><pubDate>Sun, 03 Jan 2010 02:46:42 GMT</pubDate><guid isPermaLink="false">ccca17bc-cc72-4bae-972f-7bd738c168c1:584</guid><dc:creator>slimcode</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;It’s been almost 3 months that the &lt;a href="http://marketplace.windowsphone.com" target="_blank"&gt;Windows Marketplace for Mobile&lt;/a&gt; is available for Windows Mobile 6.5 users, and more than a month for 6.0 and 6.1 users. We’re now in 2010, and I thought it was a good time to update my download/purchase stats.&lt;/p&gt;  &lt;p&gt;Here are my numbers since the beginning:&lt;/p&gt;  &lt;table cellspacing="10" cellpadding="2"&gt;     &lt;tr&gt;       &lt;td&gt;&amp;#160;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;&lt;u&gt;US&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;&lt;u&gt;CA&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;&lt;u&gt;UK&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;&lt;u&gt;Earnings&lt;/u&gt;&lt;/strong&gt;*&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;DutchTab 1.2 (1.99$ US)&lt;/td&gt;        &lt;td&gt;11&lt;/td&gt;        &lt;td&gt;3&lt;/td&gt;        &lt;td&gt;11&lt;/td&gt;        &lt;td&gt;49.75$&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;RateThings 1.0 (2.99$ US)&lt;/td&gt;        &lt;td&gt;21&lt;/td&gt;        &lt;td&gt;3&lt;/td&gt;        &lt;td&gt;14&lt;/td&gt;        &lt;td&gt;113.62$&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;GrocerySort 1.0 (3.99$ US)&lt;/td&gt;        &lt;td&gt;296&lt;/td&gt;        &lt;td&gt;9&lt;/td&gt;        &lt;td&gt;N/A&lt;/td&gt;        &lt;td&gt;1216,95$&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;slimPASSWORDS 1.0/1.1 (free)&lt;/td&gt;        &lt;td&gt;6111&lt;/td&gt;        &lt;td&gt;183&lt;/td&gt;        &lt;td&gt;1551&lt;/td&gt;        &lt;td&gt;&amp;#160;&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;&lt;font size="1"&gt;* 70% goes to slimCODE, 30% to Microsoft.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;It’s about time I submit GrocerySort to the United Kingdom market. I was postponing it to release version 1.1. It was probably a mistake. It’s coming soon.&lt;/p&gt;  &lt;p&gt;Oh, and I have those W-8BEN and EIN requests to submit to the US and MS to finally get paid… Nothing to get excited about, barely covers the software I use.&lt;/p&gt;&lt;img src="http://www.slimcode.com/cs/aggbug.aspx?PostID=584" width="1" height="1"&gt;</description><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/English/default.aspx">English</category><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/Non-technical/default.aspx">Non-technical</category></item><item><title>The most awkward debugging experience just happened to me</title><link>http://www.slimcode.com/cs/blogs/martin/archive/2009/10/21/the-most-awkward-debugging-experience-just-happened-to-me.aspx</link><pubDate>Wed, 21 Oct 2009 14:52:00 GMT</pubDate><guid isPermaLink="false">ccca17bc-cc72-4bae-972f-7bd738c168c1:558</guid><dc:creator>slimcode</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I’m currently testing a Windows Mobile application. I’m doing final tests directly on my real devices. I had my HTC Touch Pro2 phone hooked via USB, and the tests went perfectly. Then, I unplugged it and plugged my old HTC P4000 to make tests on an older device. I pressed F5 in Visual Studio .NET, and checked my P4000’s screen for the usual “Do you trust that application” prompt… Nothing. But from the corner on my eye, I saw that my Touch Pro2 was asking for the question. Hun? I clicked “Yes”, and there I was, in the middle of a debugging session via WIFI!!! Tracing was working well, I could breakpoint, pause and continue.&lt;/p&gt;  &lt;p&gt;I had no idea my phone was still connected to Windows Mobile Center. As a matter of fact, Mobile Center was waiting for my feedback about how to sync the newly plugged P4000. Once I answered “Connect without synching”, VS.NET started using the P4000 for debugging.&lt;/p&gt;  &lt;p&gt;And all this happened 5 minutes after I told myself I should tweet that I want my phone to sync via WIFI.&lt;/p&gt;  &lt;p&gt;Now, I’m trying to reproduce this, and I can’t. It seems timing had a lot to do with this, and the fact it was the first time Mobile Center saw my P4000 in this session. If only Windows Mobile Center (and VS.NET) was supporting multiple devices connected at the same time.&lt;/p&gt;&lt;img src="http://www.slimcode.com/cs/aggbug.aspx?PostID=558" width="1" height="1"&gt;</description><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/English/default.aspx">English</category><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/Non-technical/default.aspx">Non-technical</category></item><item><title>Windows Mobile Marketplace numbers</title><link>http://www.slimcode.com/cs/blogs/martin/archive/2009/10/21/windows-mobile-marketplace-numbers.aspx</link><pubDate>Tue, 20 Oct 2009 23:40:50 GMT</pubDate><guid isPermaLink="false">ccca17bc-cc72-4bae-972f-7bd738c168c1:555</guid><dc:creator>slimcode</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;In the iPhone world, it is not rare to see developers share their numbers with the rest of the community. I decided to do the same with the &lt;a href="http://marketplace.windowsphone.com/" target="_blank"&gt;Windows Mobile Marketplace&lt;/a&gt;, after its first two weeks.&lt;/p&gt;  &lt;p&gt;I submitted three applications to the Marketplace, two of them, &lt;a href="http://www.slimcode.com/DutchTab/" target="_blank"&gt;DutchTab&lt;/a&gt; and &lt;a href="http://www.slimcode.com/RateThings/" target="_blank"&gt;RateThings&lt;/a&gt;, to multiple English markets (US, Canada, UK, Australia, India), and &lt;a href="http://www.slimcode.com/slimPASSWORDS/" target="_blank"&gt;slimPASSWORDS&lt;/a&gt; only to the US and Canadian markets. Since this third application is free, I wanted to avoid the 15$ fee per extra market submission.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;DutchTab (1.99$ US): 12 downloads&lt;/p&gt;    &lt;p&gt;RateThings (2.99$ US): 9 downloads&lt;/p&gt;    &lt;p&gt;slimPASSWORDS (free): 1010 downloads&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Wow! A total of 50.79$ in sales!!! 35.55$ in my pockets!!! I’ve coded myself a new Volvo!!!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;(you can insert here a very long silence of discomfort)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now, let’s put everything in perspective. The Windows Mobile Marketplace is young, very young. And contrary to other application stores, it did not appear on all devices and platforms at the same time. Only Windows Mobile 6.5 devices can benefit from it, or those impatient enough to find the hacked CAB and install it on their WM 6.0 or 6.1 device (like I did).&lt;/p&gt;  &lt;p&gt;Once the Marketplace gets a web interface and official support for older devices, numbers will mean something.&lt;/p&gt;  &lt;p&gt;In the meantime, I’m happy to see slimPASSWORDS get a few downloads.&lt;/p&gt;&lt;img src="http://www.slimcode.com/cs/aggbug.aspx?PostID=555" width="1" height="1"&gt;</description></item><item><title>A shout from my heart to Microsoft</title><link>http://www.slimcode.com/cs/blogs/martin/archive/2009/10/20/a-shout-from-my-heart-to-microsoft.aspx</link><pubDate>Tue, 20 Oct 2009 14:23:41 GMT</pubDate><guid isPermaLink="false">ccca17bc-cc72-4bae-972f-7bd738c168c1:554</guid><dc:creator>slimcode</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&lt;img title="Steve Ballmer - His thoughts on that Google phone" hspace="12" align="right" src="http://www.coolsmartphone.com/images/stories/balmer-balmer-balmer-balmer.jpg" width="150" height="108" /&gt;It could have been the very poor download numbers I’m getting for my three apps on the &lt;a href="http://marketplace.windowsphone.com" target="_blank"&gt;Windows Mobile Marketplace&lt;/a&gt;. It could have been the total confusion I’m seeing within &lt;a href="http://www.microsoft.com" target="_blank"&gt;Microsoft&lt;/a&gt; about overlapping projects (FolderShare vs SkyDrive vs Live Mesh vs My Phone, Azure vs Live Framework, Win32 vs WinForms vs WPF vs Silverlight, WebForms vs MVC, etc). It could have been the disgust I have for Mr. Balmer, though I’m sure he works hard.&lt;/p&gt;  &lt;p&gt;No. The hit came from behind. It came from a source I did not expect. I can still hear her sentence, thrown like a banality, just like when she talks to me about gossips.&lt;/p&gt;  &lt;p&gt;“Why don’t you make your little applications for the iPhone? You’d have more success.”&lt;/p&gt;  &lt;p&gt;Bam. I was stunt. My wife, that wonderfully non-technically versed, non-gadget prone person I share my life with was just stabbing me in the back… And I couldn’t answer. To keep the face and the technical superiority I’m suppose to have over her, I tried to made a “honey, what do you know about all this?” kind-of-face, and said without thinking “it would cost me a lot of money to jump in that boat, and I would have to relearn everything. I’m not ready for this.”.&lt;/p&gt;  &lt;p&gt;Translation: I could not justify the purchase of a Tablet PC and a new Windows Mobile phone in the past months, and I’m too damn lazy to learn something new.&lt;/p&gt;  &lt;p&gt;And I kept thinking about this the whole weekend. I felt stupid. I felt ashamed. I felt exposed and vulnerable. The reasons for me to keep developing for the Windows and Windows Mobile platforms were just a “façade” in front of my laziness and comfort. Am I doing the wrong thing by staying in that comfort zone?&lt;/p&gt;  &lt;p&gt;I dug deeper and deeper, trying to convince myself I could not be THAT lazy, and finally pinpointed the true explanation for me to hold onto the Windows Mobile platform. Simple and sincere attachment to Microsoft, and a true desire to see them succeed. If I’m still developing for Windows Mobile, it’s not because I &lt;u&gt;think&lt;/u&gt; they will succeed, it’s because I &lt;u&gt;want&lt;/u&gt; them to succeed.&lt;/p&gt;  &lt;p&gt;They spoiled me with the best development tools, an awesome managed framework, a huge developer community, tons of sample code and a new openness that makes you feel part of the gang.&lt;/p&gt;  &lt;p&gt;In the meantime, they forgot about actual users and their own perception. While Balmer was busy shouting “developers, developers, developers” in one room, and talk to big corporations in another, the simple general public user was forgotten by Microsoft. Their new desktop OS, Vista, almost crumbled after MS decided it was more important to be secure than usable. And their mobile OS was forgotten in a closet, accumulating dust and a bad odour.&lt;/p&gt;  &lt;p&gt;Today, Tuesday October the 20th, 2009, as a developer, I’m shouting from the deepest of my heart: Microsoft, stop thinking like developers, stop thinking like evangelists or regional directors. Put your “general user” shoes and hat, and act. Don’t talk. Act. Straighten up you act, I should say. Clean up the complete mess you are displaying with those overlapping product ideas that rarely come to completion. Simplify your offerings into simple and user-friendly products and terms. Force developers to use APIs that will make the user the most important target, not the developer’s comfort. Give us a unified and up to date API to address the users’ demands. Consolidate your Windows Mobile, Zune and Windows Phone offerings once and for all under one roof, with the best framework you can give developers so they can concentrate on users.&lt;/p&gt;  &lt;p&gt;I will not wait until 2010 to make a final decision between Windows Mobile and the iPhone. Show me… no… prove me before the end of the year that you have a consolidated and ubiquitous vision of the Windows Phone, the Zune brand, their respective Marketplace and Silverlight development. I’m not ready to wait any longer. I’ve waited enough. It’s now or never.&lt;/p&gt;&lt;img src="http://www.slimcode.com/cs/aggbug.aspx?PostID=554" width="1" height="1"&gt;</description><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/English/default.aspx">English</category><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/Non-technical/default.aspx">Non-technical</category></item><item><title>Performance tests using Bitmap with different PixelFormat under the .NET CF</title><link>http://www.slimcode.com/cs/blogs/martin/archive/2009/09/25/performance-tests-using-bitmap-with-different-pixelformat-under-the-net-cf.aspx</link><pubDate>Fri, 25 Sep 2009 04:53:20 GMT</pubDate><guid isPermaLink="false">ccca17bc-cc72-4bae-972f-7bd738c168c1:547</guid><dc:creator>slimcode</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;I don’t have any answer for all the data I’m about to write here, but I thought it would be interesting to share with you the results of my performance tests using &lt;a href="http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.aspx" target="_blank"&gt;Bitmap&lt;/a&gt; objects under the .NET Compact Framework.&lt;/p&gt;  &lt;p&gt;My Windows Mobile applications use a custom-made control library, where controls perform their own painting based on templates and views. All the painting is performed in an image, which is then copied back to the display, to avoid flickering.&lt;/p&gt;  &lt;p&gt;While testing my applications on higher resolutions, I hit a very frustrating wall: &lt;a href="http://msdn.microsoft.com/en-us/library/system.outofmemoryexception.aspx" target="_blank"&gt;OutOfMemoryException&lt;/a&gt;. That’s right. Creating the buffer Bitmap was too demanding for the emulator images I’m testing with. And we’re not speaking about very huge images. The typical size where it fails is 480x696, for a single form test application. Assuming a 32bit per pixel image, we’re talking about 1336320 bytes. That’s not that much. What is happening?&lt;/p&gt;  &lt;p&gt;First, I decided that my library would fall back to a smaller bpp (bit per pixel) image when this happens. By default, I try creating my Bitmap using the &lt;a href="http://msdn.microsoft.com/en-us/library/7we6s1x3.aspx" target="_blank"&gt;constructor that takes only a width and height&lt;/a&gt;. When this fails, I rollback to using the &lt;a href="http://msdn.microsoft.com/en-us/library/3z132tat.aspx" target="_blank"&gt;constructor that also takes a PixelFormat&lt;/a&gt;, passing &lt;a href="http://msdn.microsoft.com/en-us/library/system.drawing.imaging.pixelformat.aspx" target="_blank"&gt;Format16bppRgb565&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;That’s when the roof fell on me. Performance degraded dramatically. And after some profiling (by hand using &lt;a href="http://msdn.microsoft.com/en-us/library/ms886788.aspx" target="_blank"&gt;QueryPerformanceCounter&lt;/a&gt;), the culprit was identified: Copying the buffer image back to the display’s &lt;a href="http://msdn.microsoft.com/en-us/library/system.drawing.graphics.aspx" target="_blank"&gt;Graphics&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;So I decided to test and compare the various &lt;a href="http://msdn.microsoft.com/en-us/library/system.drawing.imaging.pixelformat.aspx" target="_blank"&gt;PixelFormat&lt;/a&gt; values, on a real 480x800 device running WM 6.1 (HTC Touch Pro 2), expecting Format32bppRgb to give me the same results as passing no PixelFormat parameter to Bitmap’s ctor. I was wrong!&lt;/p&gt;  &lt;table cellspacing="2" cellpadding="5"&gt;     &lt;tr&gt;       &lt;td&gt;&lt;strong&gt;&lt;u&gt;PixelFormat&lt;/u&gt;&lt;/strong&gt;&amp;#160;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;&lt;u&gt;Drawing ticks&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;&lt;u&gt;Copying ticks&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;None: &lt;/td&gt;        &lt;td&gt;287392&lt;/td&gt;        &lt;td&gt;215296&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format32bppRgb: &lt;/td&gt;        &lt;td&gt;1233216 (4.3x slower) &lt;/td&gt;        &lt;td&gt;1963200 (9.1x slower)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format24bppRgb: &lt;/td&gt;        &lt;td&gt;1302496 (4.5x slower) &lt;/td&gt;        &lt;td&gt;601088 (2.8x slower)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format16bppRgb565: &lt;/td&gt;        &lt;td&gt;561696 (1.9x slower) &lt;/td&gt;        &lt;td&gt;301344 (1.4x slower)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format16bppRgb555: &lt;/td&gt;        &lt;td&gt;586976 (2.0x slower) &lt;/td&gt;        &lt;td&gt;2163360 (10.0x slower)&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;As you can see, the constructor that does not take a PixelFormat parameter is doing something special, because performance is drastically better. In the best case, using Format16bppRgb565, it was still almost 2 times slower. It was time for some &lt;a href="http://www.red-gate.com/products/reflector/" target="_blank"&gt;Reflector&lt;/a&gt;! While the desktop version was calling its overload with Format32bppArgb (0x26200a, which is not available in the PixelFormat enum under .NET CF), the CF version was doing things completely differently than the ctor with a PixelFormat parameter:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;.NET Framework:&lt;/h4&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;public Bitmap(int width, int height)      &lt;br /&gt;{       &lt;br /&gt;&amp;#160; this..ctor(width, height, &lt;strong&gt;&lt;font color="#ff0000"&gt;0x26200a&lt;/font&gt;&lt;/strong&gt;);       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;.NET Compact Framework:&lt;/h4&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;public Bitmap(int width, int height)      &lt;br /&gt;{       &lt;br /&gt;&amp;#160; base..ctor();       &lt;br /&gt;&amp;#160; this._Init(width, height);       &lt;br /&gt;}       &lt;br /&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;     &lt;br /&gt;public unsafe Bitmap(int width, int height, PixelFormat format)       &lt;br /&gt;{       &lt;br /&gt;&amp;#160; PAL_ERROR pal_error;       &lt;br /&gt;&amp;#160; IntPtr ptr;       &lt;br /&gt;&amp;#160; base..ctor();       &lt;br /&gt;&amp;#160; pal_error = &lt;strong&gt;&lt;font color="#ff0000"&gt;GL.CreatePixfmt&lt;/font&gt;&lt;/strong&gt;(width, height, format, &amp;amp;ptr);       &lt;br /&gt;&amp;#160; if (pal_error &amp;lt; 0)       &lt;br /&gt;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; goto Label_002A;       &lt;br /&gt;&amp;#160; }       &lt;br /&gt;&amp;#160; base.m_cx = width;       &lt;br /&gt;&amp;#160; base.m_cy = height;       &lt;br /&gt;&amp;#160; base.m_how = ptr;       &lt;br /&gt;Label_002A:       &lt;br /&gt;&amp;#160; MISC.HandleAr(pal_error);       &lt;br /&gt;}       &lt;br /&gt;      &lt;br /&gt;private unsafe void _Init(int cx, int cy)       &lt;br /&gt;{       &lt;br /&gt;&amp;#160; PAL_ERROR pal_error;       &lt;br /&gt;&amp;#160; IntPtr ptr;       &lt;br /&gt;&amp;#160; pal_error = &lt;font color="#ff0000"&gt;&lt;strong&gt;GL.Create&lt;/strong&gt;&lt;/font&gt;(cx, cy, &amp;amp;ptr);       &lt;br /&gt;&amp;#160; if (pal_error &amp;lt; 0)       &lt;br /&gt;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; goto Label_0023;       &lt;br /&gt;&amp;#160; }       &lt;br /&gt;&amp;#160; base.m_cx = cx;       &lt;br /&gt;&amp;#160; base.m_cy = cy;       &lt;br /&gt;&amp;#160; base.m_how = ptr;       &lt;br /&gt;Label_0023:       &lt;br /&gt;&amp;#160; MISC.HandleAr(pal_error);       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;When providing a PixelFormat, GL.CreatePixfmt is called, while it’s GL.Create that is called when no format is provided. What kind of image does that create? I have no clue. To try to identify it, I decided to try the other PixelFormat values available on the regular .NET Framework, but absent from the .NET CF. They all failed with an ArgumentException, except one! Format32bpp&lt;u&gt;A&lt;/u&gt;rgb, the default value on the .NET Framework! And here were the results.&lt;/p&gt;  &lt;table cellspacing="2" cellpadding="5"&gt;     &lt;tr&gt;       &lt;td&gt;&lt;strong&gt;&lt;u&gt;PixelFormat&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;&lt;u&gt;Drawing ticks&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;&lt;u&gt;Copying ticks&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format32bppArgb: &lt;/td&gt;        &lt;td&gt;1251968 (4.4x slower) &lt;/td&gt;        &lt;td&gt;1945504 (9.0x slower)&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;Still not the same results. Now is the best part: It did not cause OutOfMemoryException on high res emulators! Hun? The image created without a PixelFormat has greater resolution than 32bit? But Format48bppRgb, Format64bppArgb and Format64bppPArgb failed.&lt;/p&gt;  &lt;p&gt;You might think I was done with the surprise, right? No.&lt;/p&gt;  &lt;p&gt;The above numbers were clearly showing that using the PixelFormat-less Bitmap constructor was the preferred choice, and that I could revert to Format16bppRgb565 in case of OutOfMemoryException. Then I tested on a real 240x320 WM 6.1 device (HTC P4000):&lt;/p&gt;  &lt;table cellspacing="2" cellpadding="5"&gt;     &lt;tr&gt;       &lt;td&gt;&lt;strong&gt;&lt;u&gt;PixelFormat&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;&lt;u&gt;Drawing ticks&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;&lt;u&gt;Copying ticks&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;None: &lt;/td&gt;        &lt;td&gt;425056&lt;/td&gt;        &lt;td&gt;287520&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format32bppRgb: &lt;/td&gt;        &lt;td&gt;502240 (1.18x slower) &lt;/td&gt;        &lt;td&gt;721280 (2.5x slower)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format24bppRgb: &lt;/td&gt;        &lt;td&gt;569952 (1.34x slower) &lt;/td&gt;        &lt;td&gt;646784 (2.25x slower)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format16bppRgb565: &lt;/td&gt;        &lt;td&gt;373152 (&lt;strong&gt;1.14x faster&lt;/strong&gt;) &lt;strong&gt;&lt;font color="#ff0000"&gt;!!! &lt;/font&gt;&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;286144 (&lt;strong&gt;same speed&lt;/strong&gt;) &lt;strong&gt;&lt;font color="#ff0000"&gt;!!!&lt;/font&gt;&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format16bppRgb555: &lt;/td&gt;        &lt;td&gt;371072 (&lt;strong&gt;1.15x faster&lt;/strong&gt;) &lt;strong&gt;&lt;font color="#ff0000"&gt;!!! &lt;/font&gt;&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;765984 (2.7x slower)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format32bppArgb: &lt;/td&gt;        &lt;td&gt;518496 (1.22 slower) &lt;/td&gt;        &lt;td&gt;722048 (2.5x slower)&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;This time, the PixelFormat-less constructor is not the fastest option. If I want to achieve the best performance possible, I have to make different decisions on different platforms. Oh great. That’s just great… To complete the big picture, I tested on many emulator images. Here are the results, always comparing with the default format:&lt;/p&gt;  &lt;h4&gt;WM 6.0 Classic QVGA (240x320)&lt;/h4&gt;  &lt;table cellspacing="2" cellpadding="5"&gt;     &lt;tr&gt;       &lt;td&gt;&lt;strong&gt;PixelFormat&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Drawing diff &lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Copying diff&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format32bppRgb: &lt;/td&gt;        &lt;td&gt;3.7x slower&lt;/td&gt;        &lt;td&gt;32.3x slower&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format24bppRgb: &lt;/td&gt;        &lt;td&gt;4.0x slower&lt;/td&gt;        &lt;td&gt;29.5x slower&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format16bppRgb565: &lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1.41x faster&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;1.03x slower&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format16bppRgb555: &lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1.37x faster&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;38.7x &lt;u&gt;slower&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format32bppArgb: &lt;/td&gt;        &lt;td&gt;3.7x slower&lt;/td&gt;        &lt;td&gt;32.5x slower&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h4&gt;WM 6.0 Pro QVGA (240x320)&lt;/h4&gt;  &lt;table cellspacing="2" cellpadding="5"&gt;     &lt;tr&gt;       &lt;td&gt;&lt;strong&gt;PixelFormat&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Drawing ticks &lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Copying ticks&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format32bppRgb: &lt;/td&gt;        &lt;td&gt;3.7x slower&lt;/td&gt;        &lt;td&gt;32.0x slower&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format24bppRgb: &lt;/td&gt;        &lt;td&gt;4.0x slower&lt;/td&gt;        &lt;td&gt;29.4x slower&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format16bppRgb565: &lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1.3x faster&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;1.07x slower&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format16bppRgb555: &lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1.43x faster&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;36.3x &lt;u&gt;slower&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format32bppArgb: &lt;/td&gt;        &lt;td&gt;3.8x slower&lt;/td&gt;        &lt;td&gt;32.3x slower&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h4&gt;WM 6.0 Pro VGA (480x640)&lt;/h4&gt;  &lt;table cellspacing="2" cellpadding="5"&gt;     &lt;tr&gt;       &lt;td&gt;&lt;strong&gt;PixelFormat&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Drawing diff &lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Copying diff&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format32bppRgb: &lt;/td&gt;        &lt;td&gt;6.8x slower&lt;/td&gt;        &lt;td&gt;76x slower&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format24bppRgb: &lt;/td&gt;        &lt;td&gt;7.7x slower&lt;/td&gt;        &lt;td&gt;72x slower&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format16bppRgb565: &lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1.45x faster&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;1.04x slower&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format16bppRgb555: &lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1.45x faster&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;88x &lt;u&gt;slower&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format32bppArgb: &lt;/td&gt;        &lt;td&gt;6.9x slower&lt;/td&gt;        &lt;td&gt;77x slower&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h4&gt;WM 6.1 Classic QVGA (240x320)&lt;/h4&gt;  &lt;table cellspacing="2" cellpadding="5"&gt;     &lt;tr&gt;       &lt;td&gt;&lt;strong&gt;PixelFormat&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Drawing diff &lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Copying diff&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format32bppRgb: &lt;/td&gt;        &lt;td&gt;3.6x slower&lt;/td&gt;        &lt;td&gt;27.1x slower&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format24bppRgb: &lt;/td&gt;        &lt;td&gt;3.8x slower&lt;/td&gt;        &lt;td&gt;24.7x slower&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format16bppRgb565: &lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1.47x faster&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1.10x faster&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format16bppRgb555: &lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1.43x faster&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;30.4x &lt;u&gt;slower&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format32bppArgb: &lt;/td&gt;        &lt;td&gt;3.5x slower&lt;/td&gt;        &lt;td&gt;26.7x slower&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h4&gt;WM 6.1 Pro QVGA (240x320)&lt;/h4&gt;  &lt;table cellspacing="2" cellpadding="5"&gt;     &lt;tr&gt;       &lt;td&gt;&lt;strong&gt;PixelFormat&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Drawing diff &lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Copying diff&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format32bppRgb: &lt;/td&gt;        &lt;td&gt;3.8x slower&lt;/td&gt;        &lt;td&gt;32.1x slower&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format24bppRgb: &lt;/td&gt;        &lt;td&gt;4.1x slower&lt;/td&gt;        &lt;td&gt;29.7x slower&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format16bppRgb565: &lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1.41x faster&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;1.02x slower&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format16bppRgb555: &lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1.41x faster&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;36.8x &lt;u&gt;slower&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format32bppArgb: &lt;/td&gt;        &lt;td&gt;3.8x slower&lt;/td&gt;        &lt;td&gt;31.7x slower&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h4&gt;WM 6.1 Pro VGA (480x640)&lt;/h4&gt;  &lt;table cellspacing="2" cellpadding="5"&gt;     &lt;tr&gt;       &lt;td&gt;&lt;strong&gt;PixelFormat&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Drawing diff &lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Copying diff&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format32bppRgb: &lt;/td&gt;        &lt;td&gt;6.9x slower&lt;/td&gt;        &lt;td&gt;75x slower&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format24bppRgb: &lt;/td&gt;        &lt;td&gt;7.5x slower&lt;/td&gt;        &lt;td&gt;68x slower&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format16bppRgb565: &lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1.52x faster&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1.04x faster&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format16bppRgb555: &lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1.37x faster&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;83x &lt;u&gt;slower&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format32bppArgb: &lt;/td&gt;        &lt;td&gt;6.9x slower&lt;/td&gt;        &lt;td&gt;76x slower&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h4&gt;WM 6.1 Pro WVGA (480x800)&lt;/h4&gt;  &lt;table cellspacing="2" cellpadding="5"&gt;     &lt;tr&gt;       &lt;td&gt;&lt;strong&gt;PixelFormat&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Drawing diff &lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Copying diff&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format32bppRgb: &lt;/td&gt;        &lt;td&gt;7.2x slower&lt;/td&gt;        &lt;td&gt;87x slower&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format24bppRgb: &lt;/td&gt;        &lt;td&gt;7.8x slower&lt;/td&gt;        &lt;td&gt;80x slower&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format16bppRgb565: &lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1.54x faster&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;1.01x faster&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format16bppRgb555: &lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1.54x faster&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;100x &lt;u&gt;slower&lt;/u&gt; (10000%!!!)&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format32bppArgb: &lt;/td&gt;        &lt;td&gt;7.3x slower&lt;/td&gt;        &lt;td&gt;88x slower&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h4&gt;WM 6.5 Pro QVGA (240x320)&lt;/h4&gt;  &lt;table cellspacing="2" cellpadding="5"&gt;     &lt;tr&gt;       &lt;td&gt;&lt;strong&gt;PixelFormat&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Drawing diff &lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Copying diff&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format32bppRgb: &lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1.33x faster&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;2.2x slower&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format24bppRgb: &lt;/td&gt;        &lt;td&gt;2.1x slower&lt;/td&gt;        &lt;td&gt;21.7x slower&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format16bppRgb565: &lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1.39x faster&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;1.02x slower&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format16bppRgb555: &lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1.33x faster&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;26.2x &lt;u&gt;slower&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format32bppArgb: &lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1.32x faster&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;2.1x slower&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h4&gt;WM 6.5 Pro VGA (480x640)&lt;/h4&gt;  &lt;table cellspacing="2" cellpadding="5"&gt;     &lt;tr&gt;       &lt;td&gt;&lt;strong&gt;PixelFormat&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Drawing diff &lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Copying diff&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format32bppRgb: &lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1.41x faster&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;3.6x slower&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format24bppRgb: &lt;/td&gt;        &lt;td&gt;3.5x slower&lt;/td&gt;        &lt;td&gt;44.7x slower&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format16bppRgb565: &lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1.49x faster&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;1.01x slower&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format16bppRgb555: &lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1.45x faster&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;55.5x &lt;u&gt;slower&lt;/u&gt;&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Format32bppArgb: &lt;/td&gt;        &lt;td&gt;&lt;strong&gt;1.41x faster&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;3.4x slower&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h4&gt;WM 6.5 Pro WVGA (480x800)&lt;/h4&gt;  &lt;p&gt;The default format gives me an OutOfMemoryException, but forced formats show similar results as with VGA.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;A lot of numbers that can be resumed to:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Under WM 6.0 and 6.1, using Format16bppRgb565 can improve drawing times without compromising image copying times. &lt;/li&gt;    &lt;li&gt;Under WM 6.5, 32bpp formats have also improved drawing, offering better results than the default format, but still lacking by 2x on image copying. Format16bppRgb565 is still the best alternative to the default. &lt;/li&gt;    &lt;li&gt;The greater the resolution, the worse image copying is for non-default formats, except with Format16bppRgb565, which stays roughly on par. &lt;/li&gt;    &lt;li&gt;There is no good reason for using Format16bppRgb555 instead of Format16bppRgb565. Though drawing is as good, image copying is terrible on all platforms. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;At this point, I’m clueless about what is different with a Bitmap created without a PixelFormat parameter, but my approach will be the following:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Always use the PixelFormat-less constructor by default. &lt;/li&gt;    &lt;li&gt;If I get an OutOfMemoryException, call the other ctor with Format16bppRgb565. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I understand that all this could be different on real devices. But without answers, one must &lt;a href="http://www.joelonsoftware.com/items/2009/09/23.html" target="_blank"&gt;use its Duct Tape&lt;/a&gt; and move on.&lt;/p&gt;&lt;img src="http://www.slimcode.com/cs/aggbug.aspx?PostID=547" width="1" height="1"&gt;</description><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/English/default.aspx">English</category><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/Technical/default.aspx">Technical</category></item><item><title>A week with a Tablet PC</title><link>http://www.slimcode.com/cs/blogs/martin/archive/2009/07/25/a-week-with-a-tablet-pc.aspx</link><pubDate>Sat, 25 Jul 2009 13:17:32 GMT</pubDate><guid isPermaLink="false">ccca17bc-cc72-4bae-972f-7bd738c168c1:528</guid><dc:creator>slimcode</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;My friend &lt;a href="http://twitter.com/kosmatos" target="_blank"&gt;Odi&lt;/a&gt; and I were “chattwitting” about a possible Apple Netbook or Tablet PC, and we didn’t have the same vision about what that computer would look like. I could not imagine there was a big enough market for a Tablet-only computer for the market-savvy Apple.&lt;/p&gt;  &lt;p&gt;Because I wanted to explore development of multi-touch applications, I didn’t hesitate buying myself a Tablet PC. It’s a convertible laptop, as I wanted this computer to replace my current laptop. Anyway, nobody could use a Tablet like a laptop, right?&lt;/p&gt;  &lt;p&gt;Well, I decided to try it, for a week. I’m sure that’s enough to get the idea. That week already started, with the installation of Windows Live Writer, and creation of this post, fully written with the on-screen keyboard. I can already say that typing with the on-screen keyboard is far from optimal, not much better than those phone keyboards. The #1 problem is when typing the same letter twice. If you double-tap too fast, only one letter is typed. Also, because the keyboard window can (and must) be moved, your fingers don’t get the hang of positions.&lt;/p&gt;  &lt;p&gt;Another thing I miss is quick access to slimKEYS and its slimLAUNCH extension. It would make more sense to have an icon in the taskbar to open slimLAUNCH. It still works with the on-screen keyboard but takes more time.&lt;/p&gt;  &lt;p&gt;Right clicks can also become a problem. Normally, you can tap-and-hold and wait for imitating it, but it does not always work, or is imprecise. Take Windows Live Writer for example: correcting typos with those red underlines is difficult since it often thinks you’re tapping a line below.&lt;/p&gt;  &lt;p&gt;Finally, every time you need to enter text in a textbox and the keyboard isn’t visible, three taps are necessary, a little excessive, but I didn’t check the options yet.&lt;/p&gt;  &lt;p&gt;During this week, I’ll be trying the following tasks (and more):&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Read and post on Twitter. &lt;/li&gt;    &lt;li&gt;Read and write emails with Gmail. &lt;/li&gt;    &lt;li&gt;Surf the web. &lt;/li&gt;    &lt;li&gt;Listen to music with Windows Media Player. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I won’t stop myself from using the stylus, but instead compare touch and stylus head to head.&lt;/p&gt;  &lt;p&gt;See ya in a week, or on &lt;a href="http://twitter.com/slimcode" target="_blank"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://www.slimcode.com/cs/aggbug.aspx?PostID=528" width="1" height="1"&gt;</description><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/English/default.aspx">English</category><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/Non-technical/default.aspx">Non-technical</category></item><item><title>The slimLAUNCH.Passwords extension if now open source!</title><link>http://www.slimcode.com/cs/blogs/martin/archive/2009/07/24/the-slimlaunch-passwords-extension-if-now-open-source.aspx</link><pubDate>Fri, 24 Jul 2009 18:48:43 GMT</pubDate><guid isPermaLink="false">ccca17bc-cc72-4bae-972f-7bd738c168c1:525</guid><dc:creator>slimcode</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I &lt;a href="http://www.slimcode.com/cs/blogs/martin/archive/2007/01/25/slimkeys-1-0-is-out-the-door.aspx"&gt;promised it&lt;/a&gt; a very long time ago. It &lt;a href="http://www.slimcode.com/cs/blogs/martin/archive/2009/05/06/slimkeys-is-now-free-why.aspx"&gt;was asked&lt;/a&gt; recently. That gave me the kick I needed to finally open the doors to the &lt;a href="http://www.slimcode.com/slimKEYS/slimLAUNCH.aspx"&gt;slimLAUNCH.Passwords&lt;/a&gt; extension, so everybody can check the sensitive code it’s made of, in case I’ve goofed somewhere.&lt;/p&gt;  &lt;p&gt;The &lt;a href="http://slimlaunchpasswords.codeplex.com/SourceControl/ListDownloadableCommits.aspx" target="_blank"&gt;sources for the slimLAUNCH.Passwords extension&lt;/a&gt; are now available on &lt;a href="http://slimlaunchpasswords.codeplex.com/" target="_blank"&gt;CodePlex&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;For the moment, it’s more of a “for consultation” open source project. I’ll gladly look at your suggestions for features, but the main reason for opening the sources is because of all the encryption code it contains, and the confidence you need to have into this product before handing it all those precious passwords.&lt;/p&gt;  &lt;p&gt;We'll see how it goes. I’ll open the sources to the &lt;a href="http://www.slimcode.com/slimPASSWORDS/"&gt;slimPASSWORDS&lt;/a&gt; Windows Mobile application once I’m used to CodePlex.&lt;/p&gt;&lt;img src="http://www.slimcode.com/cs/aggbug.aspx?PostID=525" width="1" height="1"&gt;</description><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/English/default.aspx">English</category><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/Technical/default.aspx">Technical</category></item><item><title>How does slimKEYS auto-update itself?</title><link>http://www.slimcode.com/cs/blogs/martin/archive/2009/07/07/how-does-slimkeys-auto-update-itself.aspx</link><pubDate>Tue, 07 Jul 2009 04:59:12 GMT</pubDate><guid isPermaLink="false">ccca17bc-cc72-4bae-972f-7bd738c168c1:518</guid><dc:creator>slimcode</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;Brant, a fellow developer and slimKEYS user was asking me how slimKEYS was auto-updating itself. I thought this would make a good blog post, so here is my answer, Brant!&lt;/p&gt;  &lt;h4&gt;The installer&lt;/h4&gt;  &lt;p&gt;Because I’m exposing a plug-in interface (and I’m too lazy trying to figure out how click-once would fit in this scenario), I’m not using click-once, but instead relying only on the installer being smart enough to uninstall any old version and install the new one. With modern installer makers, this is pretty straightforward. Simply make sure to generate a new GUID every time you change the version number. I’m using &lt;a href="http://www.advancedinstaller.com/"&gt;Advanced Installer&lt;/a&gt;, and it automatically suggests me this when I change the version.&lt;/p&gt;  &lt;p&gt;The second gotcha is correctly closing any existing slimKEYS process before the installation proceeds. Because slimKEYS does not have a real visible main window, relying on a simple WM_QUIT wasn’t always working for me. Honestly, I should have kept trying this method, but instead decided to go with a custom closing mechanism. When slimKEYS starts, it calls the &lt;a href="http://msdn.microsoft.com/en-us/library/ms644947(VS.85).aspx"&gt;RegisterWindowMessage&lt;/a&gt; like this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;m_stopMessage = Win32.User32.RegisterWindowMessage( &amp;quot;StopSlimKeys&amp;quot; );&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;In the main form’s WndProc, I have this very simple and explicit code:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;else if( m.Msg == (int) m_stopMessage )        &lt;br /&gt;{         &lt;br /&gt;&amp;#160; Application.Exit();         &lt;br /&gt;} &lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;You can think of this as a placeholder in case one day I want to perform some special task when closing because of uninstallation. For the installer part, I created a very simple DLL which is broadcasting the same message to all processes, like this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;extern &amp;quot;C&amp;quot; STOPSLIMKEYS_API void StopSlimKeys( void )        &lt;br /&gt;{         &lt;br /&gt;&amp;#160; UINT uMessage = RegisterWindowMessage( L&amp;quot;StopSlimKeys&amp;quot; ); &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160; SendMessage( HWND_BROADCAST, uMessage, 0, 0 );        &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I’m deliberately using &lt;a href="http://msdn.microsoft.com/en-us/library/ms644950(VS.85).aspx"&gt;SendMessage&lt;/a&gt; with the special HWND_BROADCAST handle, since I had less success using &lt;a href="http://msdn.microsoft.com/en-us/library/ms644932(VS.85).aspx"&gt;BroadcastSystemMessage&lt;/a&gt;{Ex} on both Windows XP and Vista. Go figure!&lt;/p&gt;  &lt;p&gt;Another OS-related problem I had to fight a lot with during the past years is when to call this custom DLL in the installer phases. Broadcasting this message seems to require my custom DLL to be running elevated. The earliest step is under InstallSequence/FindRelatedProducts. Unfortunately, under Vista, a new “Close running process” dialog appears before that step. Bummer. Turns out you can run a custom action under the Install&lt;u&gt;UI&lt;/u&gt;Sequence/FindRelatedProducts. This occurs after elevation, but before that special Vista prompt. But not so fast! Under XP, you still need to call your custom action under InstallSequence. That’s why my installer is calling my custom action twice!&lt;/p&gt;  &lt;p&gt;Having packaged my installer into an EXE requiring elevation in the first place would have saved me all this trouble, but I initially went for an MSI, and spread an URL with that extension to many sites. I had to live and die with an MSI.&lt;/p&gt;  &lt;h4&gt;The updater&lt;/h4&gt;  &lt;p&gt;Now that my installer behaves correctly when updating a running version of slimKEYS, all I need to do is download the latest package if a newer version is available. You’re probably already thinking about some XML file you could check via HTTP, with version information and small descriptions. If you’re using Advanced Installer, stop trying to reinvent the wheel, that’s already supported.&lt;/p&gt;  &lt;p&gt;When creating your package, you can enable “Advanced Updater”. This will generate and embed into the MSI two sibbling EXE and INI files. If you check your slimKEYS install folder, you can see files slimCODE.slimKEYS.AutoUpdate.exe and slimCODE.slimKEYS.AutoUpdate.ini. Take a peek at the INI file, you’ll see a line like this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;URL=&lt;a href="http://www.slimcode.com/slimkeys/downloads/updates.ini"&gt;http://www.slimcode.com/slimkeys/downloads/updates.ini&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;That’s the file I’m changing every time a new MSI is available. You can easily manage that INI file with Advanced Installer, by creating a new “Updates Configuration” project.&lt;/p&gt;  &lt;h4&gt;The glue between&lt;/h4&gt;  &lt;p&gt;So my MSI is installing a nice slimCODE.slimKEYS.AutoUpdate.exe file with my other executable. It will serve very little if nobody runs that program! And nobody calls it automatically either. &lt;u&gt;You&lt;/u&gt; have to execute that file, or tell the MSI to add a Windows scheduled task. I’m not a fan of the later option. Turns out slimKEYS does look for and execute that file every time you start slimKEYS. Because the INI says to check once a day, running that file many times a day won’t cause multiple checks.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;private void CheckForUpdates()       &lt;br /&gt;{        &lt;br /&gt;&amp;#160; try        &lt;br /&gt;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; string updaterFilename = Path.Combine(         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Path.GetDirectoryName( Application.ExecutablePath ),         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;slimCODE.slimKEYS.AutoUpdate.exe&amp;quot; ); &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; if( File.Exists( updaterFilename ) )       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.Diagnostics.Process.Start( updaterFilename, &amp;quot;/silent&amp;quot; );        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;&amp;#160; }        &lt;br /&gt;&amp;#160; catch( Exception except )        &lt;br /&gt;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; System.Diagnostics.Trace.WriteLine( &amp;quot;[EX] MainMessageForm.CheckForUpdates:&amp;quot; );        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; System.Diagnostics.Trace.WriteLine( except.Message );        &lt;br /&gt;&amp;#160; }        &lt;br /&gt;} &lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I hope this sheds some light on how slimKEYS updates itself. Oh, and &lt;a href="http://www.slimcode.com/cs/blogs/martin/archive/2007/09/06/implementing-something-you-don-t-call.aspx"&gt;remember to keep calling that updater file&lt;/a&gt;!&lt;/p&gt;&lt;img src="http://www.slimcode.com/cs/aggbug.aspx?PostID=518" width="1" height="1"&gt;</description><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/English/default.aspx">English</category><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/Technical/default.aspx">Technical</category></item><item><title>Referencing a debug assembly in debug builds, and a release assembly in release builds</title><link>http://www.slimcode.com/cs/blogs/martin/archive/2009/06/12/referencing-a-debug-assembly-in-debug-builds-and-a-release-assembly-in-release-builds.aspx</link><pubDate>Fri, 12 Jun 2009 05:29:41 GMT</pubDate><guid isPermaLink="false">ccca17bc-cc72-4bae-972f-7bd738c168c1:509</guid><dc:creator>slimcode</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I have a few VS.NET 2008 projects that share usage of libraries I made for Windows Mobile. I used to include the libraries’ projects directly into each solution, but this is leading me to rebuilding those libraries each time, even if the sources do not change often. It also could cause two applications to look like they’re using the same build of those libraries, while they’re not actually the same bits.&lt;/p&gt;  &lt;p&gt;So I decided to move those libraries outside my solutions, and have a separate build for each. Now, I still wanted to reference the debug builds when building the debug versions of my applications, and the release builds when building in release. Turns out you can hack into your project files to accomplish exactly that.&lt;/p&gt;  &lt;p&gt;Open your .csproj files with a text editor and locate your references. They should look like this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;Reference Include=&amp;quot;slimCODE.slimCONTROLS, Version=1.0.9312.0, Culture=neutral, processorArchitecture=MSIL&amp;quot;&amp;gt;       &lt;br /&gt;&amp;#160; &amp;lt;SpecificVersion&amp;gt;False&amp;lt;/SpecificVersion&amp;gt;        &lt;br /&gt;&amp;#160; &amp;lt;HintPath&amp;gt;..\..\Binaries\Release\slimCODE.slimCONTROLS.dll&amp;lt;/HintPath&amp;gt;        &lt;br /&gt;&amp;lt;/Reference&amp;gt; &lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;There are two ways to make the above reference change target based on the active configuration.&lt;/p&gt;  &lt;h4&gt;Add a condition&lt;/h4&gt;  &lt;p&gt;You can add a “Condition” attribute to the &amp;lt;Reference&amp;gt; tag that will make that reference toggle based on that condition. It can be anything. In our case, it would look like this (important stuff in &lt;font color="#ff8080"&gt;&lt;strong&gt;red&lt;/strong&gt;&lt;/font&gt;):&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;Reference Include=&amp;quot;slimCODE.slimCONTROLS, Version=1.0.9312.0, Culture=neutral, processorArchitecture=MSIL&amp;quot; &lt;strong&gt;&lt;font color="#ff8080"&gt;Condition=&amp;quot;'$(Configuration)' == 'Release'&amp;quot;&lt;/font&gt;&lt;/strong&gt;&amp;gt;        &lt;br /&gt;&amp;#160; &amp;lt;SpecificVersion&amp;gt;False&amp;lt;/SpecificVersion&amp;gt;        &lt;br /&gt;&amp;#160; &amp;lt;HintPath&amp;gt;..\..\Binaries\&lt;strong&gt;&lt;font color="#ff8080"&gt;Release&lt;/font&gt;&lt;/strong&gt;\slimCODE.slimCONTROLS.dll&amp;lt;/HintPath&amp;gt;        &lt;br /&gt;&amp;lt;/Reference&amp;gt;        &lt;br /&gt;&amp;lt;Reference Include=&amp;quot;slimCODE.slimCONTROLS, Version=1.0.9312.0, Culture=neutral, processorArchitecture=MSIL&amp;quot; &lt;strong&gt;&lt;font color="#ff8080"&gt;Condition=&amp;quot;'$(Configuration)' == 'Debug'&amp;quot;&lt;/font&gt;&lt;/strong&gt;&amp;gt;        &lt;br /&gt;&amp;#160; &amp;lt;SpecificVersion&amp;gt;False&amp;lt;/SpecificVersion&amp;gt;        &lt;br /&gt;&amp;#160; &amp;lt;HintPath&amp;gt;..\..\Binaries\&lt;strong&gt;&lt;font color="#ff8080"&gt;Debug&lt;/font&gt;&lt;/strong&gt;\slimCODE.slimCONTROLS.dll&amp;lt;/HintPath&amp;gt;        &lt;br /&gt;&amp;lt;/Reference&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Thus, for each reference you want conditional, you must add a second entry for each subsequent configuration name. Don’t forget to change the &amp;lt;HintPath&amp;gt; accordingly.&lt;/p&gt;  &lt;h4&gt;Cheat the hint&lt;/h4&gt;  &lt;p&gt;Turns out the &amp;lt;HintPath&amp;gt; can contain variables, like $(Configuration). That’s an easier way to redirect to the proper build, given your binaries are located in folders using the configuration names. That was my case.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;Reference Include=&amp;quot;slimCODE.slimFORMS, Version=1.0.9312.0, Culture=neutral, processorArchitecture=MSIL&amp;quot;&amp;gt;       &lt;br /&gt;&amp;#160; &amp;lt;SpecificVersion&amp;gt;False&amp;lt;/SpecificVersion&amp;gt;        &lt;br /&gt;&amp;#160; &amp;lt;HintPath&amp;gt;..\..\Binaries\&lt;strong&gt;&lt;font color="#ff8080"&gt;$(Configuration)&lt;/font&gt;&lt;/strong&gt;\slimCODE.slimFORMS.dll&amp;lt;/HintPath&amp;gt;        &lt;br /&gt;&amp;lt;/Reference&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Though the first way looks more Kosher, the second way seems to behave correctly too, is simpler, and adapts automatically for each new configuration, given you use the correct folder names. Changing the active configuration does make the reference’s “Path” value in the “Properties” window change accordingly.&lt;/p&gt;  &lt;p&gt;I’ll try both and give you more feedback if one fails.&lt;/p&gt;&lt;img src="http://www.slimcode.com/cs/aggbug.aspx?PostID=509" width="1" height="1"&gt;</description><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/English/default.aspx">English</category><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/Technical/default.aspx">Technical</category></item><item><title>slimKEYS is now free - Why?</title><link>http://www.slimcode.com/cs/blogs/martin/archive/2009/05/06/slimkeys-is-now-free-why.aspx</link><pubDate>Wed, 06 May 2009 13:49:52 GMT</pubDate><guid isPermaLink="false">ccca17bc-cc72-4bae-972f-7bd738c168c1:490</guid><dc:creator>slimcode</dc:creator><slash:comments>4</slash:comments><description>&lt;p&gt;In case you &lt;a href="http://www.slimcode.com/cs/blogs/martin/archive/2009/05/06/slimkeys-v1-4-9255-is-released.aspx"&gt;haven't heard yet&lt;/a&gt;, &lt;a href="http://www.slimcode.com/slimKEYS"&gt;slimKEYS&lt;/a&gt; is now free to use. Totally free. No catch, No ads, no malware, nothing.&lt;/p&gt;  &lt;h4&gt;&lt;em&gt;Why would someone earning money from a product decide to make it suddenly free?&lt;/em&gt;&lt;/h4&gt;  &lt;p&gt;Because I never made any money with slimKEYS.&lt;/p&gt;  &lt;p&gt;Now, you're probably thinking &amp;quot;&lt;em&gt;slimCODE decided to make slimKEYS free so they can stop putting energy on it&lt;/em&gt;&amp;quot;, right?&lt;/p&gt;  &lt;h4&gt;&lt;em&gt;Is this the end of slimKEYS?&lt;/em&gt;&lt;/h4&gt;  &lt;p&gt;&lt;strong&gt;No way!&lt;/strong&gt; For a simple reason: I'm the number one customer myself. I couldn't work on a computer without slimKEYS.&lt;/p&gt;  &lt;h4&gt;&lt;em&gt;Then, why not leave it at 15$?&lt;/em&gt;&lt;/h4&gt;  &lt;p&gt;Because I still dream of seeing slimKEYS becoming a successful product, and I realize my definition of &amp;quot;successful&amp;quot; isn't based on the amount of money I can bring in with slimKEYS, but more with the number of users I can gather. The equation is obvious:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;I'll never make a fortune with slimKEYS, never. &lt;/li&gt;    &lt;li&gt;I want to continue to work on slimKEYS. &lt;/li&gt;    &lt;li&gt;I need motivation in order to work on a product. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;So my last attempt in keeping motivation is to make it used by more and more people. And for that, I'll need help from the current very loyal users. Spread the word! Blog it, tweet it! slimKEYS is free, and there's no catch.&lt;/p&gt;  &lt;p&gt;And if people still think it deserves money, it's always possible to &lt;a href="http://www.slimcode.com/shop/slimkeys.aspx"&gt;make donations&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;And besides, if I can't make money with it, why not drive traffic at least?&lt;/p&gt;  &lt;h4&gt;&lt;em&gt;But I paid for slimKEYS! That's not fair!&lt;/em&gt;&lt;/h4&gt;  &lt;p&gt;I agree, it's not fair for those who paid. If you really feel betrayed, you can ask a refund. If you really think that back then, slimKEYS was worth something, but now it doesn't, even some small donation, I'll gladly refund.&lt;/p&gt;  &lt;p&gt;Just &lt;a href="mailto:support@slimcode.com?subject=Refund"&gt;send me an email&lt;/a&gt; with your registration information.&lt;/p&gt;  &lt;h4&gt;&lt;em&gt;Why not make it open source?&lt;/em&gt;&lt;/h4&gt;  &lt;p&gt;The answer should now be obvious: I still want full control and ownership of the hard work I've put into slimKEYS. Else, motivation would drain away a little more. Starting an open source project is a logical pattern. Turning a 4+ years old project into open source is resignation.&lt;/p&gt;  &lt;p&gt;Maybe one day. Once the user base is strong enough? Maybe.&lt;/p&gt;  &lt;h4&gt;&lt;em&gt;How do you pay your bills, then?&lt;/em&gt;&lt;/h4&gt;  &lt;p&gt;I hope this does not surprise you, but slimKEYS is not my only professional activity. I do contracts for custom development, and I also work on other product ideas (too many, must focus!). I'm leaning toward mobile development. For example, I have slimPASSWORD for Windows Mobile coming soon, for opening your slimLAUNCH.Passwords file on your phone. I also have two other Windows Mobile apps in the oven.&lt;/p&gt;  &lt;p&gt;As for DutchTab for Windows Mobile, still at 5$, it will also become free in a few weeks, with a small update. I don't think my &lt;strong&gt;two&lt;/strong&gt; customers will mind.&lt;/p&gt;&lt;img src="http://www.slimcode.com/cs/aggbug.aspx?PostID=490" width="1" height="1"&gt;</description><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/English/default.aspx">English</category><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/Technical/default.aspx">Technical</category></item><item><title>slimKEYS v1.4.9255 is released!</title><link>http://www.slimcode.com/cs/blogs/martin/archive/2009/05/06/slimkeys-v1-4-9255-is-released.aspx</link><pubDate>Wed, 06 May 2009 13:46:56 GMT</pubDate><guid isPermaLink="false">ccca17bc-cc72-4bae-972f-7bd738c168c1:489</guid><dc:creator>slimcode</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;A &lt;a href="http://www.slimcode.com/slimkeys/History.aspx"&gt;new version&lt;/a&gt; of slimKEYS was &lt;a href="http://www.slimcode.com/slimKEYS/Downloads/slimKEYS.msi"&gt;released yesterday&lt;/a&gt;. The main two new features involve slimSIZE and slimVOLUME, in somewhat related features.&lt;/p&gt;  &lt;p&gt;New with version 1.4.9255, you can tell a slimSIZE hotkey to grow or shrink a window, instead of only forcing a specific size.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;border-top:0px;border-right:0px;" border="0" alt="My Ctrl-Win-Add hotkey" src="http://www.slimcode.com/cs/blogs/files/slimKEYSv1.4.9255isreleased_8936/image.png" width="325" height="327" /&gt; &lt;/p&gt;  &lt;p&gt;In a same thinking, but opposite result, you can now create slimVOLUME hotkeys that set the volume to a specific level, instead of just increasing or decreasing the level. For example, I created myself a Win-VolumeUp hotkey that fixes the volume level to 50%, and another Win-VolumeDown that fixes it to 5%.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;border-top:0px;border-right:0px;" border="0" alt="My Win-VolumeUp hotkey" src="http://www.slimcode.com/cs/blogs/files/slimKEYSv1.4.9255isreleased_8936/image_3.png" width="490" height="532" /&gt; &lt;/p&gt;  &lt;p&gt;Other than those two features, a small change to how the slimLAUNCH window behaves when you type alternate shortcuts. For example, when a FileSystem item is selected, you could press Ctrl-F to open its parent folder. According to my own SDK documentation, the implementation should have made the slimLAUNCH window close, but those were only words. Now it does close the window.&lt;/p&gt;  &lt;p&gt;Oh, and another small detail: &lt;strong&gt;slimKEYS is now free!!!&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;(more on this in a following post)&lt;/p&gt;&lt;img src="http://www.slimcode.com/cs/aggbug.aspx?PostID=489" width="1" height="1"&gt;</description><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/English/default.aspx">English</category><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/Technical/default.aspx">Technical</category></item><item><title>I'm an HTC Touch Pro fan... but why a Pro2?</title><link>http://www.slimcode.com/cs/blogs/martin/archive/2009/02/16/i-m-an-htc-touch-pro-fan-but-why-a-pro2.aspx</link><pubDate>Mon, 16 Feb 2009 14:28:54 GMT</pubDate><guid isPermaLink="false">ccca17bc-cc72-4bae-972f-7bd738c168c1:475</guid><dc:creator>slimcode</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;I'm an &lt;a href="http://www.htc.com/ca/product.aspx?id=52564" target="_blank"&gt;HTC P4000&lt;/a&gt; owner, and I really like having a phone with a sliding keyboard. I had my eyes on the new &lt;a href="http://www.htc.com/ca/product.aspx?id=77510" target="_blank"&gt;HTC Touch Pro&lt;/a&gt; for a couple weeks now, but I just noticed (via &lt;a href="http://twitter.com/wmdev" target="_blank"&gt;@wmdev&lt;/a&gt;) that HTC released a second generation Touch Pro, called &lt;a href="http://www.htc.com/www/product/touchpro2/overview.html" target="_blank"&gt;Touch Pro2&lt;/a&gt; (what did you expect for a name?). I have nothing against multiple generations, they are a sign a company is evolving and improving. The Touch Pro was available since only a couple months. Why release a Pro2 so early? Is the first gen buggy? Is there something we should know about it?&lt;/p&gt;  &lt;p&gt;Looking at the sales pitch for the Pro2, it looks like the only improvement is the conference call features. It's about the only thing they brag about. I decided to compare both specs to get a better glimpse at the differences.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The Pro is smaller in width and height (102 x 51 mm) than the Pro2 (116 x 59 mm), but is actually thicker (18 mm versus 17.25 mm), which is not apparent when looking at photos.&lt;/li&gt;    &lt;li&gt;The display screen is way bigger on the Pro2, at 3.6&amp;quot; instead of 2.8&amp;quot;. This enables a better resolution of 480x800 (WVGA) on the Pro2, versus the 480x640 (VGA) resolution for the Pro.&lt;/li&gt;    &lt;li&gt;The Pro2 is slightly heavier at 175 grams, only 10 more than the Pro at 165 grams. But with a bigger body and screen, that's expected.&lt;/li&gt;    &lt;li&gt;The Pro2's sliding screen can be tilt for better viewing.&lt;/li&gt;    &lt;li&gt;The battery in the Pro2 has a 1500 mAh capacity instead of 1340 mAh for the Pro, but with a WVGA resolution to drive, it shortens the Pro2's use time on WCDMA networks from 378 minutes to 270 minutes (that's a lot). Strangely, on GSM networks, it's the same for both devices (I don't get it).&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The rest is about the same. 512 MB ROM and 288 MB RAM, almost the same Qualcomm processor at 528 MHz (7200A for the Pro2, 7201A for the Pro).&lt;/p&gt;  &lt;p&gt;HTC should really push more the fact it has a bigger screen and better resolution. Those are far more important features for me than conference calls. I was preparing myself to buy a Touch Pro so that I could play with G-Sensor development. I think I'll wait for the Pro2!&lt;/p&gt;&lt;img src="http://www.slimcode.com/cs/aggbug.aspx?PostID=475" width="1" height="1"&gt;</description><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/English/default.aspx">English</category><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/Non-technical/default.aspx">Non-technical</category></item><item><title>Fixing error code 29506 when trying to install SQL Management Studio Express</title><link>http://www.slimcode.com/cs/blogs/martin/archive/2009/01/30/fixing-error-code-29506-when-trying-to-install-sql-management-studio-express.aspx</link><pubDate>Fri, 30 Jan 2009 18:15:00 GMT</pubDate><guid isPermaLink="false">ccca17bc-cc72-4bae-972f-7bd738c168c1:470</guid><dc:creator>slimcode</dc:creator><slash:comments>17</slash:comments><description>&lt;P&gt;&lt;A href="http://search.yahoo.com/search?p=error+29506+sql+management+studio" target=_blank&gt;Like many others&lt;/A&gt;, I was getting an error code 29506 when trying to install SQL Server Management Studio Express 2005 on my Vista x64 machine. Searching for a fix kept sending me to posts talking about running the MSI as administrator from the beginning, but this didn't solve it for me, neither did it solve it for many other commenters out there.&lt;/P&gt;
&lt;P&gt;The good news is, I did find a solution! And I bet that if you end up reading this post because of a similar error, we have something in common: we downloaded the MSI using Internet Explorer 7 (or 8)! The file gets stamped as "coming from the net", thus has restricted privileges, even when running it as administrator.&lt;/P&gt;
&lt;P&gt;Simply right-click the file and select "Properties". At the bottom of the "General" tab, you should see a security message with an "Unblock" button:&lt;/P&gt;
&lt;P&gt;&lt;IMG style="BORDER-BOTTOM:0px;BORDER-LEFT:0px;BORDER-TOP:0px;BORDER-RIGHT:0px;" border=0 alt=image src="http://www.slimcode.com/cs/blogs/files/Fixingerrorcode29506whentryingtoinstallS_BA62/image.png" width=419 height=513&gt; &lt;/P&gt;
&lt;P&gt;Pressing that "Unblock" button will remove metadata associated with that file. Running the MSI again should now work fine, even without running it from an administrator prompt, but I did ran it from an admin prompt just to make sure.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Update&lt;/STRONG&gt;: As many commenters mentioned, you still need to execute the MSI from an admin command prompt.&lt;/P&gt;
&lt;P&gt;Hope this helps!&lt;/P&gt;&lt;img src="http://www.slimcode.com/cs/aggbug.aspx?PostID=470" width="1" height="1"&gt;</description><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/English/default.aspx">English</category><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/Technical/default.aspx">Technical</category></item><item><title>Babies Know</title><link>http://www.slimcode.com/cs/blogs/martin/archive/2009/01/28/babies-know.aspx</link><pubDate>Wed, 28 Jan 2009 13:30:28 GMT</pubDate><guid isPermaLink="false">ccca17bc-cc72-4bae-972f-7bd738c168c1:468</guid><dc:creator>slimcode</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;I got this by email yesterday. It was too good to leave as an email... And I'm against an email chains, so better start a Twitter chain! ;)&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="354" alt="image0011" src="http://www.slimcode.com/cs/blogs/files/BabiesKnow_775E/image0011.jpg" width="494" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="330" alt="image0022" src="http://www.slimcode.com/cs/blogs/files/BabiesKnow_775E/image0022.jpg" width="494" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="363" alt="image0033" src="http://www.slimcode.com/cs/blogs/files/BabiesKnow_775E/image0033.jpg" width="494" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="387" alt="image0044" src="http://www.slimcode.com/cs/blogs/files/BabiesKnow_775E/image0044.jpg" width="494" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="321" alt="image0055" src="http://www.slimcode.com/cs/blogs/files/BabiesKnow_775E/image0055.jpg" width="494" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="335" alt="image0066" src="http://www.slimcode.com/cs/blogs/files/BabiesKnow_775E/image0066.jpg" width="494" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="363" alt="image0077" src="http://www.slimcode.com/cs/blogs/files/BabiesKnow_775E/image0077.jpg" width="277" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="246" alt="image0088" src="http://www.slimcode.com/cs/blogs/files/BabiesKnow_775E/image0088.jpg" width="339" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="326" alt="image0099" src="http://www.slimcode.com/cs/blogs/files/BabiesKnow_775E/image0099.jpg" width="414" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="276" alt="image01010" src="http://www.slimcode.com/cs/blogs/files/BabiesKnow_775E/image01010.jpg" width="334" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="266" alt="image01111" src="http://www.slimcode.com/cs/blogs/files/BabiesKnow_775E/image01111.jpg" width="326" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;And&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="282" alt="image01212" src="http://www.slimcode.com/cs/blogs/files/BabiesKnow_775E/image01212.jpg" width="366" border="0" /&gt;&lt;/p&gt;&lt;img src="http://www.slimcode.com/cs/aggbug.aspx?PostID=468" width="1" height="1"&gt;</description><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/English/default.aspx">English</category><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/Non-technical/default.aspx">Non-technical</category></item><item><title>Another slimKEYS release, v1.3.9063</title><link>http://www.slimcode.com/cs/blogs/martin/archive/2009/01/14/another-slimkeys-release-v1-3-9063.aspx</link><pubDate>Wed, 14 Jan 2009 21:54:27 GMT</pubDate><guid isPermaLink="false">ccca17bc-cc72-4bae-972f-7bd738c168c1:460</guid><dc:creator>slimcode</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;There's a &lt;a href="http://www.slimcode.com/slimKEYS/Downloads/slimKEYS.msi"&gt;new slimKEYS release&lt;/a&gt; around town, version 1.3.9063. Why the &amp;quot;3&amp;quot; in &amp;quot;1.3&amp;quot;? Simply because there was a minor change in the plug-in programming interface, and I'm a purist. But I'm not ashamed of increasing the minor version number, since there's also a new plug-in: &lt;a href="http://www.slimcode.com/slimKEYS/slimZOOM.aspx"&gt;slimZOOM&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.slimcode.com/images/slimZOOM.png" /&gt; &lt;/p&gt;  &lt;p&gt;The default hotkey is &lt;strong&gt;Win-A&lt;/strong&gt;. Move the mouse over the area you wish to zoom in, and press the hotkey. A zoom window will appear. You can press &lt;strong&gt;W&lt;/strong&gt; to toggle the window to use a full monitor or your whole display (yes, for single monitor systems, that's the same thing).&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.slimcode.com/images/slimZOOM-Help.png" /&gt; &lt;/p&gt;  &lt;p&gt;There are many other options, I'll let you play with it to learn more (or &lt;a href="http://www.slimcode.com/slimKEYS/slimZOOM.Demo.aspx"&gt;watch the demos&lt;/a&gt;). As usual, &lt;a href="http://www.slimcode.com/slimKEYS/History.aspx"&gt;many other small things&lt;/a&gt; have been fixed or improved, but one thing worth mentioning is the ability to rename hotkey descriptions to use your own.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="125" alt="Default description" src="http://www.slimcode.com/cs/blogs/files/AnotherslimKEYSreleasev1.3.9063_ED16/image.png" width="478" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="125" alt="Custom description" src="http://www.slimcode.com/cs/blogs/files/AnotherslimKEYSreleasev1.3.9063_ED16/image_3.png" width="478" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="100" alt="image" src="http://www.slimcode.com/cs/blogs/files/AnotherslimKEYSreleasev1.3.9063_ED16/image_4.png" width="578" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Have fun with this new release, and thank you all for the suggestions and bug reports. I'm listening, and I'll continue working on very nice suggestions received &lt;a href="http://www.slimcode.com/cs/forums/default.aspx?GroupID=4"&gt;on the forums&lt;/a&gt; and &lt;a&gt;by email&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://www.slimcode.com/cs/aggbug.aspx?PostID=460" width="1" height="1"&gt;</description><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/English/default.aspx">English</category><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/Technical/default.aspx">Technical</category></item><item><title>Souvenir of a PDC</title><link>http://www.slimcode.com/cs/blogs/martin/archive/2008/11/03/souvenir-of-a-pdc.aspx</link><pubDate>Mon, 03 Nov 2008 15:11:33 GMT</pubDate><guid isPermaLink="false">ccca17bc-cc72-4bae-972f-7bd738c168c1:431</guid><dc:creator>slimcode</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;I’m back from &lt;a href="http://microsoftpdc.com/" target="_blank"&gt;PDC 2008&lt;/a&gt;, sitting at my computer, trying to apply in more concrete ways what I’ve learn there, and evaluating how this will affect my projects in the near future. Indeed, &lt;a href="http://azure.com" target="_blank"&gt;Windows Azure&lt;/a&gt; was a great announcement, and seems a great platform, though I haven’t worked with it yet. During the PDC, what seems a great product idea popped up in my mind, and Azure will be the target platform for that idea. But it’s only out off laziness that it won’t be implemented on Amazon or Google platforms. Again, Microsoft is making sure developers are comfortable, have a great - scratch that - an awesome development platform to work with, so they make their technologies de facto in the industry.&lt;/p&gt;  &lt;p&gt;But Azure was expected, written in the sky, the next logical move from Microsoft to address the concurrence of &lt;a href="http://aws.amazon.com/" target="_blank"&gt;Amazon Web Services&lt;/a&gt; and &lt;a href="http://www.google.com/apps/" target="_blank"&gt;Google Apps&lt;/a&gt;. It was even a platform they needed themselves for their web-page app offerings (e.g. &lt;a href="http://channel9.msdn.com/posts/PDCNews/First-Look-Office-14-for-Web/" target="_blank"&gt;Office 14 Web&lt;/a&gt;). I wasn’t going at the PDC to learn more about what was being that &lt;a href="http://mesh.com" target="_blank"&gt;Mesh&lt;/a&gt; thing, but to learn more about the two Windows 7 that they are cooking for us, the desktop and the mobile.&lt;/p&gt;  &lt;p&gt;The first one was a very early glimpse, with cool UI features, but we didn’t learn much of the inners. Ok, we’ll get touch APIs, that’s great. The “libraries” view is a good way to make us forget about one of the three pillars of Longhorn that was dropped after PDC 2003: WinFS. It’s a simple interface with a simple API, which will do the work for a while. But let me give you a good example why it’s still not enough: This morning, my wife needed a picture of Clément to upload to a web site. She doesn’t exactly know where our pictures are located. So opening the “Browse” button on that web site turned out to be quite an adventure for her. Once I told her pictures were in “K:\Photos”, she faced a second problem: She couldn’t browse pictures by tag or date like she’s used to in Windows Photo Gallery or Picasa. She had to open each folder one by one, change the view to see bigger thumbnails, remember paths of interesting pictures while she browsed other folders. Then I told her to open Windows Photo Gallery, find the correct picture, right click it and select “Open File Location”. Ok, great! She ends up in a folder containing 150 pictures, the correct one being selected. All filenames look the same (PICT####.jpg), but she can’t copy that file’s full path, only its folder path. Back to the web app, paste the folder path (which is already a power user action in my book), and search for that filename. Painful.&lt;/p&gt;  &lt;p&gt;This experience really made the cool “libraries” section in Windows 7 become much less cool in my mind. It’s still not enough. The normal computer users need an operating system that does not talk to them in terms of paths, but really in terms of properties. It was time for this shift in 2003, it’s even more pressing now.&lt;/p&gt;  &lt;p&gt;For the moment, Windows 7 is simply an improved Vista, which is not a bad thing. I like Vista, call me crazy if you want, but I live very well with the various UAC and warning prompts. Sure, having less of them will always be welcomed. But it’s still a necessary evil. Ubuntu has them, Mac OS X has them, Vista simply needs to reduce their occurrence. The simple fact that a file downloaded from the net causes two prompts is the single most important aspect the Windows 7 / Explorer / Internet Explorer teams must address. Then a few other Explorer annoyances, and the UAC subject will be almost closed. But Windows 7 wasn’t such a big news at this PDC.&lt;/p&gt;  &lt;p&gt;The other Windows 7 is one very important stone for Microsoft. They have addressed a “corporate developer” need in Windows Azure, but have neglected the &lt;a href="http://www.microsoft.com/windowsmobile/en-us/default.mspx" target="_blank"&gt;Windows Mobile&lt;/a&gt; platform (at least in our eyes, I’m sure that team is working hard). Why? Too “general user”? Wake up! The iPhone is a corporate success too. I saw more iPhones than Blackberrys at this PDC, in the hands of professional developers. And I saw more non-Windows Blackberrys than any Windows Mobile devices combined. Their smaller Windows 7 needs love too, but it’s not at this PDC that it received a hug. The foundations of Windows Mobile are strong. It is a serious operating system with a rich API, which is unfortunately often its biggest flaw. Developers don’t program well for this mobile platform. They use too many resources, apply practices learned from the desktop, do not behave well in this multitasking, application switching context, because they still don’t care about being the active application or not. Hey, it’s not important on Windows, why care about it on Windows Mobile?&lt;/p&gt;  &lt;p&gt;So, what is missing from Windows Mobile? A serious development platform, paradigm, framework. As of today, the Microsoft offering for developing for Windows Mobile can be resumed at two things: Normal Win32, or .NET WinForms applications. In the first case, you’re faced with the desktop way of developing. In the second case, you’re told to work with that obsolete technology that is not good enough for the desktop, and does not apply well to the mobile world anyway. WinForms is a “one form per screen” framework enforcing the notion of a main form. What happens on Windows Mobile when a form opens a child form? You see it twice when you switch between applications. I had to create my own framework based on UserControls to create something more appropriate to the device.&lt;/p&gt;  &lt;p&gt;Then comes what you put on those screens. Windows Mobile gives us the same old controls we have on the desktop, but uglier. The control set on Windows Mobile should be placed in a museum. It is useless when you want to create interfaces that work well with touch devices. Wake up, Microsoft! People can work really well on their iPhones without the need for a pen. I’ve seen people type on their iPhone faster than me on my HTC P4000, even if I have a sliding keyboard. You need to upgrade the user experience on Windows Mobile. And just like you do so good on the desktop, you need to make developers comfortable to develop for it, so their laziness becomes your number one weapon.&lt;/p&gt;  &lt;p&gt;I went to PDC 2008 with the naive intuition I was in for a great surprise about Windows Mobile. I spent 3200$ (PDC + Hotel + Plane) out of my own pockets to be there. What a mistake. The only thing I officially learned was that Silverlight would work on Windows Mobile. But I have no bits to work with yet, and no serious information of how (and if!) it will work as a stand-alone client-based solution. During the various keynotes, we kept seeing the same slide showing the three important areas for Microsoft: The desktop, the web and the phone. But we heard nothing, “nathing”, of that last piece of the equation. Then, on the Ask The Experts evening, when I finally found the Windows Mobile table (which was not where the plan said it was), I could not get any answers, the team clearly bound by a non-disclosure thing. I could only understand, by their smiles and shoulders, that something was coming, but my 2200$ PDC ticket was worth nothing when it was time to learn about it.&lt;/p&gt;  &lt;p&gt;So, this morning, I’m in front of my computer, wondering how I should spend my energies toward the Windows Mobile platform and my future projects, and I have no answer. 3200$ later, I’m at point A. Worse, anybody can watch all the sessions for free, just by visiting &lt;a href="http://channel9.msdn.com/" target="_blank"&gt;Channel 9&lt;/a&gt;. What a slap in the face! That Cocoa thing looks interesting. I heard their documentation is awesome. Maybe that was the price to pay to learn it the hard way?&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:564b0630-33fc-41bc-a086-a1bfc5b11d9e" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/PDC+2008" rel="tag"&gt;PDC 2008&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Azure" rel="tag"&gt;Azure&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Windows+7" rel="tag"&gt;Windows 7&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Windows+Mobile" rel="tag"&gt;Windows Mobile&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.slimcode.com/cs/aggbug.aspx?PostID=431" width="1" height="1"&gt;</description><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/English/default.aspx">English</category><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/Technical/default.aspx">Technical</category></item><item><title>PDC 2008 – Day 1</title><link>http://www.slimcode.com/cs/blogs/martin/archive/2008/10/28/pdc-2008-day-1.aspx</link><pubDate>Tue, 28 Oct 2008 03:11:02 GMT</pubDate><guid isPermaLink="false">ccca17bc-cc72-4bae-972f-7bd738c168c1:430</guid><dc:creator>slimcode</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;So day one of PDC 2008 is coming to an end, I’ll be going to the “Show Time” special session in a few minutes, then check if there’s a party around. What did that first PDC day bring me exactly? Well, I can now put a name on something obvious that had to come from Microsoft: &lt;a href="http://azure.com" target="_blank"&gt;Windows Azure&lt;/a&gt;. The cloud finally has a name… a better name, that is. I’m still wondering if they did tie the “Operating System” tag to Azure strongly enough. Because that’s what it really is. I kept saying that Live Mesh had to be more than just synching and remoting. Turns out it is only a part of the bigger Azure picture.&lt;/p&gt;  &lt;p&gt;Azure is a good thing for Microsoft. A very good thing, because Microsoft has the developer framework to succeed. They’ll end up doing much better than Amazon or Google, because devs feel very comfortable with the whole Visual Studio echo system.&lt;/p&gt;  &lt;p&gt;The down side is: that wasn’t a very exciting day. All this was expected news, obvious news, the normal path MS had to take to consolidate corporate developers they had a little neglected in the past years.&lt;/p&gt;  &lt;p&gt;Now, it doesn’t mean the “end user” developer must be neglected now. I’m very eager to see tomorrow if the &amp;quot;Other Windows 7” (Mobile) will have his period of fame. The future of Windows Mobile is &lt;strong&gt;much more&lt;/strong&gt; than simply running Silverlight stuff natively on mobile devices. The interface needs a facelift, and the developer community around Windows Mobile needs more support from Microsoft itself. The other reseller players in the industry are doing terrible damage to Windows Mobile’s image. They suck! It’s great to see more APIs, but Microsoft is not just an API company. Enough ingredients, let’s make some recipes. Let’s bring something like the Apple App Store to Windows Mobile. Only Microsoft can make this happen successfully.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:46b24099-f878-4240-8596-ee86d4754e89" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/pdc08" rel="tag"&gt;pdc08&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Azure" rel="tag"&gt;Azure&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Windows+7" rel="tag"&gt;Windows 7&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Windows+Mobile" rel="tag"&gt;Windows Mobile&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.slimcode.com/cs/aggbug.aspx?PostID=430" width="1" height="1"&gt;</description></item><item><title>Free slimKEYS license if you see me at PDC 2008</title><link>http://www.slimcode.com/cs/blogs/martin/archive/2008/10/13/free-slimkeys-license-if-you-see-me-at-pdc-2008.aspx</link><pubDate>Mon, 13 Oct 2008 21:08:07 GMT</pubDate><guid isPermaLink="false">ccca17bc-cc72-4bae-972f-7bd738c168c1:429</guid><dc:creator>slimcode</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: I will use a special PDC badge instead.&lt;/p&gt;  &lt;p&gt;I’ve decided to give away &lt;a href="http://www.slimcode.com/slimKEYS/"&gt;slimKEYS&lt;/a&gt; licenses to anyone who recognizes me at the next &lt;a href="http://www.microsoftpdc.com/" target="_blank"&gt;PDC 2008&lt;/a&gt; in Los Angeles. That’s right, free as in beer. Just watch carefully for me and my &lt;a href="http://www.microsoftpdc.com/Social/" target="_blank"&gt;PDC Badge&lt;/a&gt;, in case it reads like this:&lt;/p&gt;  &lt;p&gt;&lt;img title="slimKEYS Free" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="138" alt="slimKEYS Free" src="http://www.slimcode.com/cs/blogs/martin/FreeslimKEYSlicenseifyouseemeatPDC2008_F0F1/slimKEYSFree.png" width="240" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Simply stop me and ask for your free slimKEYS license. If you’re curious, you can even ask me to show you what slimKEYS can do for you. &lt;/p&gt;  &lt;p&gt;But if you don’t see the badge above, no candy! ;-)&lt;/p&gt;  &lt;p&gt;(Maximum of 1 free license per person, no purchase necessary, only valid between October 26th and October 31st, this contest is NOT void in the province of Quebec &lt;a href="http://www.microsoftpdc.com/Social/Contest/ShowOffRules.aspx" target="_blank"&gt;(!)&lt;/a&gt;, participants must &lt;a href="http://www.youtube.com/watch?v=f2b1D5w82yU"&gt;sing this song&lt;/a&gt; in order to claim their price… just kidding!)&lt;/p&gt;  &lt;p&gt;See you at PDC 2008!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:1b94f330-edf0-4c67-b8db-150ec66eb5f3" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/pdc08" rel="tag"&gt;pdc08&lt;/a&gt;,&lt;a href="http://technorati.com/tags/slimKEYS" rel="tag"&gt;slimKEYS&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.slimcode.com/cs/aggbug.aspx?PostID=429" width="1" height="1"&gt;</description></item><item><title>FirstPen – For children to practice handwriting</title><link>http://www.slimcode.com/cs/blogs/martin/archive/2008/10/08/firstpen-for-children-to-practice-handwriting.aspx</link><pubDate>Wed, 08 Oct 2008 14:54:44 GMT</pubDate><guid isPermaLink="false">ccca17bc-cc72-4bae-972f-7bd738c168c1:426</guid><dc:creator>slimcode</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;My son Clément really likes computers and Pocket PC devices. More than pens and papers. I even gave him my old HP Jornada 545. He’s also having some difficulties with handwriting and precision. So I thought I’d use that attraction to my Windows Mobile phone to make him practice a little. I made an application, called FirstPen, for practicing handwriting.&lt;/p&gt;  &lt;p&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="326" alt="image" src="http://www.slimcode.com/cs/blogs/martin/FirstPenForchildrentopracticehandwriting_995B/image.png" width="246" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;The idea is simple. You must complete the gray outline the best you can, without drawing outside. After each letter, the application calculates how well you did it.&lt;/p&gt;  &lt;p&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="326" alt="image" src="http://www.slimcode.com/cs/blogs/martin/FirstPenForchildrentopracticehandwriting_995B/image_3.png" width="246" border="0" /&gt; &lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="326" alt="image" src="http://www.slimcode.com/cs/blogs/martin/FirstPenForchildrentopracticehandwriting_995B/image_4.png" width="246" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;This is a first draft, and I need feedback to make sure I’m on the right track. For example, a feature not yet implemented would be to make sure letters that must be done in a single or two strokes are made in a single or two strokes. Another one would be to make sure letters are started at the correct position.&lt;/p&gt;  &lt;p&gt;I’m also looking for fonts that best match how children learn to write at school. It seems every font I find has its flaws. Here are the fonts I’m currently supporting:&lt;/p&gt;  &lt;p&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="421" alt="image" src="http://www.slimcode.com/cs/blogs/martin/FirstPenForchildrentopracticehandwriting_995B/image_5.png" width="350" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;As you can see, some of them do not support accented chars, which is a problem for me, but isn’t for English users. Others have guiding lines. This can be very useful, but in order for my precision algo to successfully determine if a letter is well done or not, the letter to draw must be gray, and other decorations must be a lighter green or red. That’s why I must manually edit each letter to make those guiding lines green, like this:&lt;/p&gt;  &lt;p&gt;&lt;img title="a" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="206" alt="a" src="http://www.slimcode.com/cs/blogs/martin/FirstPenForchildrentopracticehandwriting_995B/a.png" width="206" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;This is a &lt;strong&gt;painful&lt;/strong&gt; task I’d really like to get rid another way, but since I like the idea, I’ve completed the “DR BY 2” font as a proof of concept. This also opens the door to green helpers, like arrows for direction.&lt;/p&gt;  &lt;p&gt;So, if you want to try this out yourself, &lt;a href="http://www.slimcode.com/FirstPen/Downloads/FirstPen.CAB"&gt;upload this CAB file&lt;/a&gt; to your Windows Mobile device, install it, and give me your impressions. I do not intend of charging for this app. If it grows better with your feedback, everybody will benefit from it, for free.&lt;/p&gt;  &lt;p&gt;By the way, the CAB file is 3 megs because of the embedded images, but I haven’t run PNGCrush on them yet. It should get smaller. Please note that it also requires the .NET 2.0 Compact Framework. It should work on Pocket PC 2003 devices, and Windows Mobile 5 and 6.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:57693fec-9431-4000-97cc-da52cb0015b8" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/FirstPen" rel="tag"&gt;FirstPen&lt;/a&gt;,&lt;a href="http://technorati.com/tags/handwriting" rel="tag"&gt;handwriting&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.slimcode.com/cs/aggbug.aspx?PostID=426" width="1" height="1"&gt;</description></item><item><title>slimKEYS v1.2.8479</title><link>http://www.slimcode.com/cs/blogs/martin/archive/2008/10/02/slimkeys-v1-2-8479.aspx</link><pubDate>Thu, 02 Oct 2008 21:15:04 GMT</pubDate><guid isPermaLink="false">ccca17bc-cc72-4bae-972f-7bd738c168c1:422</guid><dc:creator>slimcode</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Today, I released a minor update to slimKEYS, &lt;a href="http://www.slimcode.com/slimKEYS/Downloads/slimKEYS.msi"&gt;version 1.2.8479&lt;/a&gt;. The three most important new features are:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;slimSEARCH: You can configure any web search entry to replace spaces by a specific character instead of the default “+”.      &lt;br /&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin:5px 0px;border-right-width:0px;" height="197" alt="image" src="http://www.slimcode.com/cs/blogs/martin/slimKEYSv1.2.8479_F251/image.png" width="422" border="0" /&gt;&amp;#160; &lt;br /&gt;This is particularly useful for Wikipedia and Wiktionary searches, since those web sites require spaces to be replaced by an underline (“_”). As a matter of fact, the first time you run this new build, slimKEYS will automatically set this option “on” for entries pointing to “wikipedia.org” or “wiktionary.org”. If you have similar issues with other search targets, you’ll have to manually change them. &lt;/li&gt;    &lt;li&gt;slimLAUNCH.Passwords: When managing password stores, you can rename categories and entries right from the tree view, and even drag and drop entries from one category to another.      &lt;br /&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin:5px 0px;border-right-width:0px;" height="54" alt="image" src="http://www.slimcode.com/cs/blogs/martin/slimKEYSv1.2.8479_F251/image_3.png" width="307" border="0" /&gt; &lt;/li&gt;    &lt;li&gt;slimSMOKE: You can tell the hotkey handler to cycle through all combinations of dimming/blurring/off, instead of simply turning it on and off. Thus, when enabling this option, pressing Ctrl+Win+M actually changes the slimSMOKE status to:      &lt;ul&gt;       &lt;li&gt;Dimming + Blurring &lt;/li&gt;        &lt;li&gt;Just dimming &lt;/li&gt;        &lt;li&gt;Just blurring &lt;/li&gt;        &lt;li&gt;Off &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Another important change is regarding the trial message. Before, a notification pop-up appeared every 15 hotkeys you pressed. Now, every window will show a small clickable message at their bottom.&lt;/p&gt;  &lt;p&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="66" alt="image" src="http://www.slimcode.com/cs/blogs/martin/slimKEYSv1.2.8479_F251/image_4.png" width="456" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Rest assured, there is no time bomb in slimKEYS, and there will never be. If you like slimKEYS, but do not think it is worth 15$, you just have to tolerate this red message and ignore the end user license agreement… but don’t tell me! q;-)&lt;/p&gt;  &lt;p&gt;For the rest of the changes, take a look at the &lt;a href="http://www.slimcode.com/slimKEYS/History.aspx"&gt;complete history&lt;/a&gt;. By the way, how do you like the new web site look?&lt;/p&gt;&lt;img src="http://www.slimcode.com/cs/aggbug.aspx?PostID=422" width="1" height="1"&gt;</description><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/English/default.aspx">English</category><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/Technical/default.aspx">Technical</category></item><item><title>DutchTab is out of beta!</title><link>http://www.slimcode.com/cs/blogs/martin/archive/2008/08/04/dutchtab-is-out-of-beta.aspx</link><pubDate>Mon, 04 Aug 2008 20:28:45 GMT</pubDate><guid isPermaLink="false">ccca17bc-cc72-4bae-972f-7bd738c168c1:410</guid><dc:creator>slimcode</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;&lt;img style="margin:0px 0px 5px 5px;" src="http://www.slimcode.com/dutchtab/shot.png" align="right" /&gt; DutchTab for Windows Mobile is out of beta, and now &lt;a href="http://www.slimcode.com/DutchTab/Downloads.aspx"&gt;officially supports&lt;/a&gt; both Pocket PC and Smartphone devices running Windows Mobile 5 or 6. This application is a &lt;a href="http://www.dutchtab.com"&gt;joined venture&lt;/a&gt; with &lt;a href="http://www.polkapps.com/blog/"&gt;my friend Pascal&lt;/a&gt; who made an &lt;a href="http://www.polkapps.com/dutchtab/"&gt;iPhone version&lt;/a&gt; of DutchTab at the same time I was working on my Windows Mobile version.&lt;/p&gt;  &lt;p&gt;This application is a bill-splitting tool, but does not limit itself to making simple divisions. It automatically calculates who owes who depending on everybody’s contribution at the moment of paying the bill, and also the cost of their purchase. For example, your team is ordering lunch at the office, but the delivery guy comes in with a single bill. It adds up to 53.34$, Steve gives 35$ and John gives 25$. Mike and Lisa didn’t have cash. Now who owes who? You think it’s as simple as dividing 60$ by 4? But Mike took the expensive ribs, while John went for a simple salad. It wouldn’t be fair. Now, how do you split the tip? And when comparing the meal prices with the total amount paid, you also have to consider the taxes.&lt;/p&gt;  &lt;p&gt;No problems. Steve is a wise man. He kept a copy of the bill, and uses DutchTab to enter that bill. He creates a new bill:&lt;/p&gt;  &lt;p&gt;&lt;img title="blog-newbill" style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="320" alt="blog-newbill" src="http://www.slimcode.com/cs/blogs/martin/DutchTabisoutofbeta_E7AD/blognewbill.png" width="240" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;The bill is new and empty. It’s time to add partakers:&lt;/p&gt;  &lt;p&gt;&lt;img title="blog-emptybill" style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="320" alt="blog-emptybill" src="http://www.slimcode.com/cs/blogs/martin/DutchTabisoutofbeta_E7AD/blogemptybill.png" width="240" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;DutchTab will show you all previous partakers, and lets you either add new entries manually, of quickly import them from your Outlook contacts:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;img title="blog-selectperson" style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="320" alt="blog-selectperson" src="http://www.slimcode.com/cs/blogs/martin/DutchTabisoutofbeta_E7AD/blogselectperson.png" width="240" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Steve paid 35$, and took the chicken and a Sprite:&lt;/p&gt;  &lt;p&gt;&lt;img title="blog-steve" style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="320" alt="blog-steve" src="http://www.slimcode.com/cs/blogs/martin/DutchTabisoutofbeta_E7AD/blogsteve.png" width="240" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Lisa went for the finger-licking chicken fingers (with the honey-mustard sauce):&lt;/p&gt;  &lt;p&gt;&lt;img title="blog-lisa" style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="320" alt="blog-lisa" src="http://www.slimcode.com/cs/blogs/martin/DutchTabisoutofbeta_E7AD/bloglisa.png" width="240" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;John paid 25$, took a salad for his line… and a Coke because a salad is not enough:&lt;/p&gt;  &lt;p&gt;&lt;img title="blog-john" style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="320" alt="blog-john" src="http://www.slimcode.com/cs/blogs/martin/DutchTabisoutofbeta_E7AD/blogjohn.png" width="240" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Finally, Mike got the famous ribs and a Coke, nobody’s complaining about his line… yet!&lt;/p&gt;  &lt;p&gt;&lt;img title="blog-mike" style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="320" alt="blog-mike" src="http://www.slimcode.com/cs/blogs/martin/DutchTabisoutofbeta_E7AD/blogmike.png" width="240" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Now, on the bill’s summary, we can see that the total before taxes and tip is 49.85$. Steve entered the prices as they appear on the bill. No need to add the taxes, DutchTab will take care of distributing the taxes and tip proportionally.&lt;/p&gt;  &lt;p&gt;&lt;img title="blog-fullbill" style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="320" alt="blog-fullbill" src="http://www.slimcode.com/cs/blogs/martin/DutchTabisoutofbeta_E7AD/blogfullbill.png" width="240" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;DutchTab determines that Mike’s meal, with taxes and tip, was worth 20$. Since he paid nothing, the application tells him he should give Steve 20$. As for Lisa, her meal’s total price was 13$. She owes John 12$ and Steve 1$. Steve can now click on “Send email” to send everybody a nice reminder.&lt;/p&gt;  &lt;p&gt;&lt;img title="blog-balances" style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="320" alt="blog-balances" src="http://www.slimcode.com/cs/blogs/martin/DutchTabisoutofbeta_E7AD/blogbalances.png" width="240" border="0" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;I hope this gives you a good idea of how useful DutchTab is.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;   &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:e258747c-e642-4fbc-b408-1eee4de276e4" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/DutchTab" rel="tag"&gt;DutchTab&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;&lt;img src="http://www.slimcode.com/cs/aggbug.aspx?PostID=410" width="1" height="1"&gt;</description><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/English/default.aspx">English</category><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/Technical/default.aspx">Technical</category></item><item><title>DutchTab is now available</title><link>http://www.slimcode.com/cs/blogs/martin/archive/2008/07/12/dutchtab-is-now-available.aspx</link><pubDate>Sat, 12 Jul 2008 21:05:19 GMT</pubDate><guid isPermaLink="false">ccca17bc-cc72-4bae-972f-7bd738c168c1:409</guid><dc:creator>slimcode</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;&lt;a href="http://www.dutchtab.com"&gt;&lt;img title="balances-wm-diamond" style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="240" alt="balances-wm-diamond" src="http://www.slimcode.com/cs/blogs/martin/DutchTabisnowavailable_ED70/balanceswmdiamond.png" width="129" align="right" border="0" /&gt;&lt;/a&gt; What is &lt;a href="http://www.dutchtab.com"&gt;DutchTab&lt;/a&gt;? It’s a Windows Mobile application I’ve been working on for the past weeks. My friend &lt;a href="http://www.polkapps.com/blog/"&gt;Pascal Bourque&lt;/a&gt; convinced me (pretty easily) to migrate an application I made years ago for splitting lunch bills at &lt;a href="http://xceed.com"&gt;Xceed&lt;/a&gt;. We decided to make that a shared adventure, him making an iPhone version, and me the Windows Mobile version.&lt;/p&gt;  &lt;p&gt;The idea behind the software is very simple: You enter how much each person actually paid, and also the cost of what they bought. The software automatically calculates who paid too much and who didn’t, and optimally determines who owes who.&lt;/p&gt;  &lt;p&gt;The number one challenge was that we didn’t share design, only the name. We headed in our own direction and waited only a few days before release before sharing a few screenshots and screencasts. We did make some adjustments, mostly wording, but kept each application’s personality. I really think this was a wise decision. Both platforms have their own design guidelines, and both devices have their own input methods. I’ll add that Pascal had the easiest part, since the iPhone does not have zillions of buttons. He could concentrate on touch gestures and actions, while I wanted to support buttons and touch screens. My goal is to run on both PocketPC and SmartPhone devices, but the current beta release fails on SmartPhones because I’m using an unsupported feature with combo boxes (dah).&lt;/p&gt;  &lt;p&gt;You can learn more about the Windows Mobile version of DutchTab &lt;a href="http://www.slimcode.com/DutchTab/"&gt;here&lt;/a&gt;. This initial release is a beta version, and I’ll be offering those who &lt;a href="http://www.slimcode.com/cs/forums/default.aspx?GroupID=12"&gt;submit meaningful comments&lt;/a&gt; a free license once I release the official version.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:3d02d787-a1e5-410c-b0f6-e91d0da4d18e" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/DutchTab" rel="tag"&gt;DutchTab&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.slimcode.com/cs/aggbug.aspx?PostID=409" width="1" height="1"&gt;</description></item><item><title>slimKEYS 1.2.8310 now available</title><link>http://www.slimcode.com/cs/blogs/martin/archive/2008/06/10/slimkeys-1-2-8310-now-available.aspx</link><pubDate>Tue, 10 Jun 2008 14:26:47 GMT</pubDate><guid isPermaLink="false">ccca17bc-cc72-4bae-972f-7bd738c168c1:402</guid><dc:creator>slimcode</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&lt;a href="http://www.slimcode.com/cs/blogs/martin/slimKEYS1.2.8310nowavailable_149C2/image.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;margin:0px 0px 10px 10px;border-right-width:0px;" height="309" alt="slimKEYS Main Window, in French" src="http://www.slimcode.com/cs/blogs/martin/slimKEYS1.2.8310nowavailable_149C2/image_thumb.png" width="328" align="right" border="0"&gt;&lt;/a&gt;A &lt;a title="slimKEYS History" href="http://www.slimcode.com/slimKEYS/History.aspx" target="_blank"&gt;new version of slimKEYS&lt;/a&gt; is &lt;a title="Download slimKEYS" href="http://www.slimcode.com/slimKEYS/Downloads/slimKEYS.msi" target="_blank"&gt;now available&lt;/a&gt;. Though the list of new features is slim, it took me more than just a few hours to get through translation of the interface to French, and to finally make slimVOLUME support 64-bit Vista systems.&lt;/p&gt; &lt;p&gt;In the first case, it was a long and tedious job of moving every string to a resource file, translate each one, localize each form and repeat the translation for each label. It was simply long, and boring.&lt;/p&gt; &lt;p&gt;In the second case, I had a problem. Taking apart the numerous p-invokes throughout the code (but mostly in slimSIZE), slimKEYS is a fully managed C#-made application, except for one tiny portion of code used by slimVOLUME. The slimCODE.slimVOLUME.Vista.dll file is a mixed assembly made in C++. Normally, .NET applications don't have to care about the address space size. 32-bit or 64-bit systems don't matter, as long as the CLR implementation on both platforms is equivalent, and that your p-invoke signatures are correct. But in the case of slimKEYS, when the 64-bit implementation of the CLR was trying to load this mixed assembly, it caused a load error. An unmanaged 32-bit application can run flawlessly on 64-bit systems, but a 32-bit DLL cannot get loaded in a 64-bit CLR domain.&lt;/p&gt; &lt;p&gt;Usually, unmanaged applications that wish to natively support both 32-bit and 64-bit systems offer two packages, each built exclusively for each platform. But that's totally against the logic behind managed applications. At least that's what I thought. It was easy for me to build two versions of my C++ DLL, but how could I use them from a single managed application? How could I keep offering a single and consistent package?&lt;/p&gt; &lt;p&gt;After investigating, asking questions without getting precise answers and doing some trial and error, I chose a solution that isn't guaranteed, but seems to work well. My C++ DLL implemented a single class, called VistaVolumeControlsBridge. The managed plug-in declared a base class named VolumeControls, with two derivatives VistaVolumeControls and WmmVolumeControls. So there was already a level of indirection, where the VistaVolumeControls class was instantiated based on the platform, and using an instance of VistaVolumeControlsBridge under the hood. What I did is create a 64-bit version of the C++ DLL which implemented class Vista64VolumeControlsBridge, and its Vista64VolumeControls counterpart on the managed side. Now, the decision between creating a WmmVolumeControls or a VistaVolumeControls based on Environment.OSVersion had become a three dancers decision that looks like this:&lt;/p&gt;&lt;pre class="csharpcode"&gt;      &lt;span class="kwrd"&gt;if&lt;/span&gt;( Environment.OSVersion.Version.Major &amp;gt;= 6 )
      {
        &lt;span class="kwrd"&gt;if&lt;/span&gt;( IntPtr.Size == 8 )
        {
          m_volumeControls = &lt;span class="kwrd"&gt;new&lt;/span&gt; Vista64VolumeControls();
        }
        &lt;span class="kwrd"&gt;else&lt;/span&gt;
        {
          m_volumeControls = &lt;span class="kwrd"&gt;new&lt;/span&gt; VistaVolumeControls();
        }
      }
      &lt;span class="kwrd"&gt;else&lt;/span&gt;
      {
        m_volumeControls = &lt;span class="kwrd"&gt;new&lt;/span&gt; WmmVolumeControls();
      }
&lt;/pre&gt;
&lt;p&gt;Since VistaVolumeControls and Vista64VolumeControls are themselves managed classes, this doesn't seem to trigger loading of the 64-bit type on 32-bit systems by the JIT, and vice-versa. I could not find any reference if I could assume that a type that is never instantiated will never require its containing assembly from being loaded. But I'm ready to take the risk, and wait for your feedback if it breaks.&lt;/p&gt;
&lt;p&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;margin:0px 0px 10px 10px;border-right-width:0px;" height="185" alt="image" src="http://www.slimcode.com/cs/blogs/martin/slimKEYS1.2.8310nowavailable_149C2/image_3.png" width="305" align="right" border="0"&gt; Another neat feature with slimVOLUME on Vista is that you can now change which playback device's volume you are controlling. I also wanted to change the default playback device with a hotkey, but Microsoft doesn't want this to happen. They think device manufacturers would abuse of such an API to make their hardware stay always as the default device. And I'm not making this up, I read it on their forums (&lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1015748&amp;amp;SiteID=1" target="_blank"&gt;here&lt;/a&gt;, &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=3105844&amp;amp;SiteID=1" target="_blank"&gt;here&lt;/a&gt;, &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1569827&amp;amp;SiteID=1" target="_blank"&gt;here&lt;/a&gt; and &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1494424&amp;amp;SiteID=1" target="_blank"&gt;here&lt;/a&gt;), and asked &lt;a title="Larry Osterman's WebLog" href="http://blogs.msdn.com/larryosterman/default.aspx" target="_blank"&gt;Larry Osterman&lt;/a&gt; myself:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;We've gone around and around on this one, and while at some level it would be nice to allow developers the ability to change the default audio device, there is no way that we can. The problem is that audio vendors would abuse the functionality to attempt to force THEIR hardware to be default device even if the user didn't want it to be (we've seen evidence of vendors doing this in the past).&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;We used to say something at &lt;a title="Xceed" href="http://xceed.com/" target="_blank"&gt;Xceed&lt;/a&gt; about those situations: Two wrongs don't make a right! This is a very good example. Creating a problem to avoid another one. I really think it was a stupid decision. Changing the output device on Vista requires 4 steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Right-click the speaker tray icon.&lt;br&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="134" alt="" src="http://www.slimcode.com/cs/blogs/martin/slimKEYS1.2.8310nowavailable_149C2/image_4.png" width="287" border="0"&gt; 
&lt;li&gt;Click "Playback Devices".&lt;br&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="463" alt="" src="http://www.slimcode.com/cs/blogs/martin/slimKEYS1.2.8310nowavailable_149C2/image_5.png" width="418" border="0"&gt; 
&lt;li&gt;Right-click the device.&lt;br&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="191" alt="" src="http://www.slimcode.com/cs/blogs/martin/slimKEYS1.2.8310nowavailable_149C2/image_6.png" width="329" border="0"&gt; 
&lt;li&gt;Click "Set as Default Device".&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Failed.&lt;/p&gt;
&lt;p&gt;I'd be really happy to see an API for this in Windows 7. But if there are hackers reading this, can someone tell me what is called under that "Set as Default Device"? The API already exists, it's just not documented.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:ce7a9455-de20-4763-9e87-d1c1a253ea2c" style="padding-right:0px;display:inline;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;Tags: &lt;a href="http://technorati.com/tags/slimKEYS" rel="tag"&gt;slimKEYS&lt;/a&gt;, &lt;a href="http://technorati.com/tags/slimVOLUME" rel="tag"&gt;slimVOLUME&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.slimcode.com/cs/aggbug.aspx?PostID=402" width="1" height="1"&gt;</description><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/English/default.aspx">English</category><category domain="http://www.slimcode.com/cs/blogs/martin/archive/tags/Technical/default.aspx">Technical</category></item></channel></rss>