Continuing on the theme of duplicate hotkeys, I'll now show you something that resembles the wizards/property pages, but isn't as easy to predict.

Mstsc.exe - the terminal services client; the application used to connect to remote desktops - is a good example. Two of the dialogs look like this in my localization tool:


Similar to a properties dialog, these two are combined at runtime to produce this:

As you can see, we have a duplicate hotkey - "A" has been assigned to both Användarnamn (User name) and Alternativ (Options).

Now, when I was localizing this file, I should have realized that something is up. Neither dialog stands on its own, so it's reasonable to assume that they'll be combined at runtime. If I browse through the rest of the file, I see more dialogs similar to the first one above. I can then make a good guess as to how the dialogs are combined and make sure to avoid the duplicate hotkey.

Funnily, that's not enough. See how the Options button (Alternativ) differs between the second and third screen shot? In the third screen shot, arrows have been added. This is common in dialogs where you can hide or show some information.

The text that's actually used in the buttons isn't even in the dialogs. Instead, I can find two resources in the string table:

Source Term Translation
&Options >> &Alternativ >>
&Options << &Alternativ <<

So here's another twist to the story - I could make sure to avoid duplicate hotkeys in the dialog, but still see duplicates at runtime if I didn't consistently use the same hotkey for all three "Options" resources.

Of course, I don't have a tool that can figure out all of this by itself. The data I'm working with simply can't know how these resources relate at runtime. Because of that, these bugs are often only found at runtime. Once it's known how all these resources play together, it'd be possible to create a check that takes a mapping and warns of any hotkey clashes. I'm not a fan of checks like that though, since either someone needs to maintain the mapping (which is "unnecessary" work) or the check will lose value over time. It might be worth it in this case though, since we only have a handful of dialogs like this.

This posting is provided "AS IS" with no warranties, and confers no rights.