I wasn't able to find a good example of a generic class for recording the positions of windows. The example code I found typically relies on adding code for each individual window. In my opinion, this has two disadvantages:

You have a lot of repeated code in each form.

Each form is always resized the same. If you want to use the same form for two different purposes, it will always appear in the same place.

The following code is a class that will keep track of one or more windows and record their position when they close. It requires no changes to existing forms, and can handle many forms from just one object.

To instantiate the class, you pass the class an application name to use. This is used to create or open a registry key in the current user hive and it creates a sub key for the forms. Each form has its own sub branch of the forms key which is used to store information about the individual forms.

To handle a form, you call the HandleForm function. This keeps track of the form in a hashtable, along with the formName you pass in. If you want to have the same form opened in two different positions depending on its content or who's calling it, then you can simply pass in different form names, each individual version of the form will now load and save in a different position.

When the form closes, the form fires the form.Closing event, which calls the FormLocationHandler. This then records the location of the form back into the registry, ready for the next form to be read.

There are a couple of issues with this code, which could be worked around as follows:

If you open a window, resize it and then open another copy of the window (without shutting the first), it will be same size as the original window, not of the resized window. You could avoid this by saving the form location and size every time the form.LocationChanged or form.SizeChanged events are fired, but this could also wear out your registry and so slow down your application.

The other option would be to check through the hashtable for a form with the same name (the form name is stored in the hashtable), and copy the position from the registry.

Comments and Discussions

Nice, although this doesn't work on dual-monitor setups. The coordinates are always relative to the 'main' monitor and it never remembers that my Window was last opened on a different monitor. Would be a nice enhancement.