UPDATE (08/31/2006): WM5 users attention: Please note that, for Windows Mobile 5, you will need a different OzVGA version. See this for more info instead of deploying OzVGA / SE_VGA discussed in this pre-WM5 article!!!
Users of WM2003SE VGA devices need NOT read the above-linked article; all the information they need can be read below in the original article, which is as follows:
First and foremost, in this article, I refer to the "low-resolution", default mode (also known as SE/VGA, non-native VGA etc) as QVGA in the article and as 'native' VGA to the mode that isn't provided by default by the WM2003SE operating system.
First, please read mr_Ray's excellent explanation of the meaning of the these VGA modes.
How does resolution setting work in WM2003SE? What's native/SE VGA? How can I increase font sizes in native VGA? How do I configure the miriad text input fields in OzVGA?
These questions are often asked on Pocket PC boards. As they have never been answered really thoroughly, I’ve deciced to answer them myself on a level that may appeal to both non-programmers and hardcore programmers/ hackers. In this article, therefore, I give a detailed, system-level overview of how the resolution setting engine works in WM2003SE and how you can make advantage of it.
The first two sections in the article (1. How do I change the resolution by hand?
and 2. DLL resource loading
) are mainly targeted at hackers/people that want to know how the native VGA mode physically
works. They will find plenty of never-elsewhere-published, first-hand information. If you, for example, want to know what the DLL's are or even want to know how you can put your custom keyboard skins in VGA, you'll find all the information you need.
These sections, however, may be too technical for the general public. They may, therefore, want to skip these sections.
Now, two sections for tech freaks, and then, sections for the general public.
1. How do I change the resolution by hand?
WM2003SE allows for different resolutions. Of them, "only" 96 and 192 dpi (please read this thread
on what 'DPI' means) are official, but, in effect, you can use any
DPI – at least for a quick test. The higher the DPI number, the lower the effective resolution. 192 stands for 240*320 (QVGA), while 96 stands for 480*640.
You just need to set the registry values [HKEY_LOCAL_MACHINE\Drivers\ Display\GPE\LogicalPixelsY]
to the desired resolution, which is, as has already been mentioned, in QVGA, decimal 192 (hexa c0) and in VGA, 96 (hexa 60). You should always supply the same value to both values; this is why I'll be referring to them as LogicalPixels*
. The asterisk here isn't a real
letter but shows that it refers to (is a placeholder of) both X and Y.
This is the only
essential change to change the resolution – nothing else is needed (except for a soft reset after the change).
You can even give different values from 96 and 192. For example, if you give half of the VGA value, that is, hexa 30 to both these registry values:
the resulting virtual resolution will be 960*1280 and so on – if you, for example, supply 144/144 (hex 90/90), the net resolution will be 240*1.5x320*1.5; that is, 360*480 (HVGA).
Feel free to give "unofficial" values a try to see what happens. Note that in these non-standard (non-96/192-DPI) modes, the Programs
menu and most built-in ROM apps (including File Explorer
) won't work – make sure your registry editor / resolution switcher utility is accessible right from the Start Menu or from the Today screen, without the need of going into Programs.
This is because only the 96 (hi-res VGA) and 192 (low-res QVGA) modes are directly supported by the DLL resource loader mechanism
(to be explained later, in the second section) of WM2003SE. In all other
modes, the resource loader will only
be able to find the resource shellres.dpi.dll
, where dpi
equals to the DPI value you've written to [HKEY_LOCAL_MACHINE\Drivers\ Display\GPE\LogicalPixels*]
. Other DLL's won't be found.
2. DLL resource loading
After you've changed the resolution to 96 (from the default 192) on your VGA device (that is, have switched your PDA from QVGA to VGA), you may notice that all your icons are gone and it's impossible to sync your PDA with ActiveSync. Don't be afraid of this – I now explain why this happens.
WM2003SE has a built-in, resolution-dependent resource loading mechanism
. This makes it possible to separate resources (icons, built-in images etc.) based on their resolution. This is done at runtime. (Incidentally, you can done the same at install time too, as described in this MSDN article
. Of course, as we're only interested in the runtime, dynamic resolution change, we only discuss runtime-related subjects.)
The resource loader takes the value from LogicalPixels*
and tries to load the required resources from a DLL file that contains the DPI value in the filename, just after the name and before the dll
extension, separated by a dot (.) from both. Accessing these resources will happen even when the Pocket PC boots in – even the icons you see on the Today screen are from a resource DLL file.
For example, if the resolution is 192 DPI (QVGA on a VGA device), then, it'll try to load the associated resources from a somename
.dll file and if the resolution is 96 DPI (real, native VGA on a VGA device), it'll look for a resource named somename
.dll in the System Path.
(Incidentally, System Path is a series of directories that Windows Mobile (WM) looks into when it searches for DLL's. By default, only \Windows
is in System Path. You may, however, extend this, preferably (because it's available at boot time) to the built-in File Store/Built-in Storage (BIS). Please read for example this article
for more information on extending System Path and for some real-life examples of other applications whose DLL's may be moved outside – that is, relocated from
– the \Windows
directory. Another example of relocation is just the subject of this article
– that is, relocating the .96. DLL's.)
When you just switch to VGA resolution (by changing LogicalPixels*
to 96 and resetting your PDA) without doing anything
else, the resource loader mechanism will try to locate DLL's that have 96 instead of 192 in their name. By default, it won't find any (except for shellresapps.96.dll
in \Windows) – this is why you won't see any icons on the screen. This is why you will also need resource DLL's
2.1 What DLL's are needed?
In this section, I list the DLL's that Windows Mobile tries to locate when you try to access pre-installed, ROM-based applications (including just switching the system to VGA mode), along with their contents.
2.1.1 How can I see what is included in these files?
With, for example, Heaventools Resource Tuner
(the 30-day trial version has unrestricted functionality). Just load the DLL file you want to browse, and iterate over the GIF/Bitmap/Icon Entry
You may even change the contents of these DLL's, similar to the way I explained here
(this is a highly recommended article BTW!).
2.1.2 The list of DLL's
Note that I've noted DLL files that aren't essential for the other
programs to run as Not essential
. For example, if you don't ever want to play the built-in Solitaire
in VGA mode, all the other built-in programs will still run if you don't upload the 348 kbyte-long pegcards.96.dll
to the System Path. The same stands for, for example, the 100 kbyte officeres.96.dll
– if you don't use Pocket Word/Excel, you won't ever need them.
: Bluetooth/Wi-Fi/system icons. It even contains PE (Phone Edition) icons.
Locked by the shell32.exe, gwes.exe
system processes and many 3rd party apps like Resco File Explorer.
: all the icons of the Pocket Outlook suite (Calendar, Tasks, Contacts, Messaging). Locked by the shell32.exe
: all the icons of the Pocket Office suite (Word, Excel). You’ll be able to use these programs even without these icons. Not essential, unless you use Excel.
: it contains the bitmap of all the standard (this means it doesn’t include those of Transcriber!) on-screen SIP's (Software Input Panel
s). This means you can even redefine the images in this DLL and upload your own – for example, if you want some kind of a fancy background for them, like the pretty, shaded-background ones in QVGA mode. See for example this image
. Essential, unless you don’t use SIP’s at all (because, for example, you have a BT keyboard around).
Locked by the device.exe
Please also note that, because localized WinCE versions will have localized keyboard images (unlike, say, office or button images), this is the only
DLL that has a locale-specific name, in addition to the Transcriber. This means it’ll be named, as has also pointed out in my article on SE/Oz relocation
on Spanish, msimde.dll
on German etc. devices. This means you can’t just blindly copy the msim.96.dll
file over a non-English device – you’ll need a localized one. Otherwise, you will have severe problems in VGA mode – if the correctly named msim.96.dll
is not found, almost no built-in app works. (Fortunately, SE_VGA checks for this upon start and don't let the user switch to VGA if there is no correctly named msim.96.dll
. OzVGA doesn't.)
: File and Internet Explorer icons. Not essential, unless you use PIE.
: Images of Calculator; some smaller images like Undo or Settings. Not essential if you don't use Calculator.
: external application resources – 5 images only. Not essential.
: File Explorer, Pictures, MSN Messenger icons. Not essential.
: Solitaire icons. An example:
Feel free to delete it if you don't play the game in VGA.
: this is the most important repository of icons, next to msim.96.dll
. It contains the icons of all
system (ROM) programs. Without it, icons of neither built-in apps (including Control Panel Applets (CPL’s)) nor those of the command bar were visible. Essential.
Locked by the shell32.exe
: another very important, ActiveSync-related repository: without this, ActiveSync won’t start
; that is, you won’t be able to sync your PDA. Essential.
: some misc icons; for example, that of sound recorder (in Notes). Not essential.
Locked by the shell32.exe
: icons of Transcriber. As you may have already guessed, based on the language code in the filename and the fact that some of its screens have text, 0409
is the English version. Not essential
- you can use Transcriber without these resources:
2.1.3 OK, now I know what DLL files must be made available to WM, but where do I get them?
These files are, fortunately, very easy to get. Both VGA mode switcher apps (SE_VGA and OzVGA) contain them; the latter as separate downloads from the OzVGA homepage – look for VgaRes.zip
. Therefore, you may want to get the latter ZIP file (as is also recommended in the article on relocation).
Once you got them, put them in \Windows, or, even better (to save 2 Mbytes of RAM), in the File Store, in still the System Path. Again, please read this article
on the rules of this.
After you've done this, switching to the real VGA mode won't result in the total lack of icons/the vast majority of built-in apps' refusing to work.
2.1.4 Now I know what these files contain. Tell me, however, in what way are they different from their 192.dll brothers?
In a word: they are the same
(just ignore the size difference of some bytes – the icons are the same inside), except
for our old friend, the odd-behaving msim.96.dll
be different because, in native VGA mode, you can't use the 480-wide SIP images created for the QVGA mode. Therefore, the three SIP images included had to be
downscaled in order for the software input panels to work. If you want to know more about the details, read this thread
3. Can't I just use third-party tools instead of editing the Registry by hand every time I want to switch the resolution?
Sure you can! There're even two applications that offer this capability: the basic SE_VGA and the much more advanced OzVGA.
This is a very simple app. Download the installer, transfer it to the PDA and execute it there. It'll be installed on the PDA itself; it also installs the above-mentioned DLL's. As this is not desirable on pre-WM5, RAM-constrained devices, this alone may be a showstopper for many (not to speak of the other, highly advanced features OzVGA offers) because, if you don't relocate these files just after starting (it's then that it renames the DLL files from their exclamation mark-prefixed form to the final one) SE_VGA and before making the first mode switch, they will easily become locked. Please see the relocation article
on the relocation.
After this, just choose the SE_VGA
icon from Start /Programs
to switch between the two VGA modes (and to set the size of the Today wallpaper – if you have a QVGA wallpaper, you should keep this radio button in QVGA).
This is the application I really recommend. Install it as explained in the relocation article
It not only switches the contents LogicalPixels*
(and, incidentally, [HKEY_CURRENT_USER\ControlPanel\Sip\MenuBarHeight]
(52/26) and [HKEY_CURRENT_USER\Software\Microsoft\Today\DPI]
, the latter depending on the Today wallpaper resolution), but also, by default (if you don't touch any other setting in the app), it also increases the
1, scrollbar/thumb size ([HKEY_LOCAL_MACHINE\System\GWE\CyThMin, cyHScr
- 0x13 in VGA and 0x0D in QVGA)
2, popup menu font size ( [HKEY_LOCAL_MACHINE\System\GWE\Menu\PopFnt\Ht]
- 0x000004B0 in VGA and 0x00000320 in QVGA)
3, menu bar font size ([HKEY_LOCAL_MACHINE\System\GWE\Menu\BarFnt\Ht]
- 0x000004B0 in VGA and 0x00000320 in QVGA)
4, the system font size ([HKEY_LOCAL_MACHINE\System\GDI\SYSFNT\Ht]
- 0x00000546 in VGA and 0x00000384 in QVGA)
when you switch to VGA (and sets back these values to the original, QVGA size when switching back to QVGA). This means menu bar, popup menu and system font sizes will be larger in VGA mode if you let OzVGA use the default settings, unlike with SE_VGA. The latter doesn't touch any font size settings in the registry.
Of course, you can always increase/decrease the above-mentioned values by hand with a registry editor or with a tuner. See for example CETuner 2005 and Tweaks2k2.NET (please read this article
on their capability comparison). Then, however, after every single mode change (going to VGA from QVGA or vice versa) you'll end up resizing your fonts because the font size that is just OK in QVGA will be far too small in VGA and font sizes OK in VGA will be far too big in QVGA. You can also consider using for example nScriptm
for (easier) registry imports/changes (see these articles for examples
), but that's still a bit more awkward than using an app that does all this, and also requires some advanced knowledge of the Pocket PC.
The capabilities of OzVGA don't end at this, however! Next, I elaborate on its even more advanced features, especially because one of the biggest problems people have been complaining about
is the lack of a decent OzVGA tutorial meant for Pocket PC beginners.
3.2.1 The Font Array sizes
If you've already read my technical explanation of how WM2003 and WM2003SE store and use font size information
, you may already know that there is a new registry entry introduced in WM2003SE, HKEY_LOCAL_MACHINE\ControlPanel\Stylus\FontArray
(accessible to the user at Start
/the Text Size
tab). It also has some (not much, exactly like the above-listed three other font size values in the Registry) effect on some of the programs: the built-in PIM applications (Contacts, Calendar, Tasks) and the Today plug-in 'headlines'. Unfortunately, that's all – other programs don't take these values (and the currently chosen value) into account. Still, it's definitely more than nothing, particularly if you use the built-in PIM apps a lot.
This array isn't touched by OzVGA by default, unlike the above-mentioned font/scrollbar/thumb sizes. To be able to do this, you'll need to go to Settings.../Fonts
and click the oz=SE*
After doing this, if you scrutinize the registry changes
with, say, WinDiff, you'll see that FontArray has indeed been changed:
3.2.2 Non-system wide font size setting
OK, that's OK, but my fonts in, say, Resco File Explorer, Mobipocket Reader, Internet Explorer, NetFront etc. are still very small in VGA mode. What should I do? – you may ask.
As has already been pointed out, a lot of applications don't take into account the system-level font sizes in the Registry. Also, the vast majority of them doesn't check for the actual size of the screen to give you exactly the same view in VGA and in QVGA. (The most notable exception is the excellent document reader application, µBook
, which offers the same resolution in both QVGA and VGA modes.)
Fortunately, a lot of these applications allow for local (in-program) font size setting. This is what I'll describe in this section.
If you often switch between native VGA and QVGA modes, you'll find it extremely tiring to re-set the font size used to match the current mode if the application you use doesn't depend on system-level font size settings (so far, we've seen OzVGA is able to set these values upon resolution change), but on local settings.
Pocket Internet Explorer (PIE) is one of these applications – in View/Text Size
, you can set its font size. As you may have already guessed, "Largest" may be the best on eyes in VGA and, say, "Medium" in QVGA.
OzVGA not only allows for using separate QVGA and VGA system-level, global font sizes (we've already seen them), but is also able to do the same with settings defined locally, in applications. Fortunately, it's absolutely flexible in this respect – this means it doesn't just contain a pre-defined list of applications that it supports, but you can give it anything that stores the application settings (let it be a Registry key or a configuration file somewhere in the file system), it'll switch to the right one upon switching between VGA and QVGA modes. This requires a bit of manual work, though.
As has just been pointed out, programs store their settings (so that they survive closing and restarting the program, or even the PDA – therefore, these settings can't be held in the dynamic, runtime RAM) in either the Registry or in separate files. You don't need to know where they are exactly located, you don't even need to get a Registry Editor
to find the changes because both OzVGA has a built-in list of some apps and I also provide some other.
Speaking of, for example, PIE, if you cast a quick glance (with the above-mentioned WinDiff
) at where PIE stores its font size information in the Registry, you'll soon find that the font size is stored in [HKEY_CURRENT_USER\ Software\Microsoft\Internet Explorer\Main\ZoomSetting]
. Therefore, you'll want to add
into to the text input/drop-down list combobox of OzVGA:
Then, OzVGA will keep a separate copy of everything in the Registry under HKCU\Software\Microsoft\Internet Explorer\Main
for both (QVGA/VGA) display modes (that is, two separate sets of registry values). When you switch to VGA, it'll back up the current registry tree to its QVGA backup and restore the VGA backup previously saved, and, when you switch back, it'll back up the registry tree to VGA and reload the QVGA.
Note that the vast majority of the string is the same, except for the beginning and the end.
HKEY_CURRENT_USER, at the beginning, must be changed to HKCU. These abbreviations are widely used in the Windows programming/ hacking community and can also be found at the OzVGA homepage
Also note that I haven't included the trailing
value name – that is, I didn't use HKCU\Software\Microsoft\Internet Explorer\Main\ZoomSetting
. Had I done so, saving/restoring wouldn't work. Therefore, you'll always want to save/restore only the closest ancestor of a given registry value, not
the value itself!
Why the closest
ancestor? It's easy to explain. If you go up too much in the registry hierarchy, you will
1. save/restore too much information, which isn't the best idea because you may end up replicating even tens or hundreds of kilobytes of unnecessary information (if you, for example, back up HKCU\ SOFTWARE\
. As the registry backups are also stored in the Registry (and not in the file system, where excessive size is much less an issue than in the Registry), under HKEY_LOCAL_MACHINE\ SOFTWARE\Oz\VGA\Registry
(a different branch for VGA and QVGA), memory consumption may easily become an issue if you aren't cautious enough.
2. you may end up not having the most up-to-date configuration information when you switch between modes. For example, if you read a book in microOLAP CHM eBook Reader for Pocket PC 2.4
(more on its registry setting representation later!), the information related to the actual book files read will be stored in [HKEY_CURRENT_USER\Software\MicroOLAP\CHM eBook Reader for Pocket PC\Bookmarks\bookfilename]
. Therefore, if you choose saving/restoring the entire [HKEY_CURRENT_USER\Software\MicroOLAP\CHM eBook Reader for Pocket PC]
structure (which is a parent of both the above-mentioned Bookmarks
subkey and the Save Options
subkey, which, as we'll shortly see, has the text size-related value) you'll end up having two different, entirely disjunct set of bookmarks. That is, if you read a book in VGA, your progress/new bookmarks won't be seen in QVGA and vice versa.
Examples of third-party applications (please check out the shipped reg. paths in OzVGA, in the above-mentioned combo box, for Resco File Explorer, Spb Pocket Plus and Pocket Breeze):
- the above-mentioned microOLAP CHM eBook Reader for Pocket PC 2.4
stores its font size setting in [HKEY_CURRENT_USER\ Software\MicroOLAP\CHM eBook Reader for Pocket PC\Save Options\DysplayTextSize
(sic!). Therefore, you'll want to instruct OzVGA to backup/restore this subkey by passing its direct parent, HKCU\Software\MicroOLAP\CHM eBook Reader for Pocket PC\Save Options
- NetFront 3.2: [HKEY_CURRENT_USER\Software\access.co.jp\ NetFront32\BrowserPref\FontIndex] – therefore, backup/restore HKCU\Software\access.co.jp\NetFront32\BrowserPref
- NetFront 3.3: [HKEY_CURRENT_USER\Software\ACCESS\ NetFront33\BrowserPref\FontIndex] – therefore, backup/restore HKCU\Software\ACCESS\NetFront33\BrowserPref
3.2.3 Backing up/restoring files
As has already been pointed out, not all applications store their settings in the Registry – some do this in files, in the file system. An example of them is
- Mobipocket Reader, which stores its settings in the configuration file \Windows\MBP_global_configuration.mbp
(for example, the font size is located at offset 0x8B).
- iSilo, which stores its settings in \My Documents\iSilo\Settings\iSiloDisplaySample
(for example, the font size at offset 0xc8)
OzVGA offers file backup/restore capabilities, which is particularly handy in cases like this. For example, if you use Mobipocket Reader (which is highly recommended
), you may want to use extra large font sizes in VGA and normal font sizes in QVGA. With OzVGA, you won't end up changing the character size after every mode switch.
Just copy these file names, along with their full path, in the input textfield/drop-down list combobox on the Files
tab and click Add
(exactly as with the Registry case):
(Incidentally, as with filling in Registry paths, you may want to use a remote, desktop-based controller
application for this, in order to avoid errors and to greatly speed up input.)
Unfortunately, finding the affected files that are used to store the settings is not as easy as with the Registry, where you can find the affected registry value(s) with a simple WinDiff comparison. With file-based configurations, you'll have a much harder time to find the affected files, particularly if they aren't in the home directories of the programs but in, say, \Windows
(see the case of Mobipocket Reader) or a subdirectory of \My Documents
(iSilo). To ease the pain, you may want to use the very good and handy tool, Tracker
, from one of the the best utility developers
, SK, to quickly find the affected files. (You can use the same tool to find registry changes too; I still recommend Windiff over it for registry comparison because the Windiff is free, while Tracker is commerical.)
3.2.4 WindowsCE databases
Please also note that OzVGA doesn't support switching WindowsCE databases.
Actually, however, it's only some mobile phone handler apps
that store some
of their stuff (SMS messages) in WinCE databases. I haven't ever run into applications that stored their settings in there, so, this is not a significant omission.
4. Post your questions / opinions / flames!
I just love
receiving feedback – both bad and good. Therefore, the reader is strongly persuaded to post his own. Did you find my tutorial useful? Useless? Was it too technical? Did it convey definitely more information you have read (including the OzVGA docs) on the subject so far?
Also, if you have problems with a particular application you'd like to use in both VGA and QVGA because you don't find where it stores its font size information, let me know – I may be able to help.
Appendix – further reading (not necessarily recommended!)
MSDN: What's New for Developers in Windows Mobile 2003 Second Edition Software
MSDN: Installation with DPI-Specific Resources
Everything you wanted to know about Today backgrounds / themes
How WM2003 and WM2003SE store and use font size information?
My tutorial on relocating 2 Mbyte SE_VGA/OzVGA DLL's from RAM
Demystifying true VGA mode
(note that the VGA theme-related questions there are all answered in my article on Today wallpaper setting
(Aximsite alternative here
Some native VGA examples with OzVGA
EDIT: a misplaced italic closing tag in section "3.2.3 Backing up/restoring files"