The “key is down” checking method in KeyPress (I forget the method’s exact name) was returning false when it shouldn’t for the ‘;’ key. That method has a locally-scoped array used in “translating” certain keys to VK_OEM_* constants. One example is ‘+’, which gets translated to VK_OEM_PLUS.
I looked at the header file where these VK_OEM_* constants are defined. (I forget the name of that file, also. winuser.h?) It turns out that there are some VK_OEM_* constants that aren’t handled in the method discussed above. One of these is VK_OEM_1, which refers to ‘;’ and ‘:’. I added this pair to the array and my problem went away.
Is there any reason why this and the other unhandled USian VK_OEM_* constants shouldn’t be in the translation array?