Recently, I discovered a bug with one of my Windows Store games – Maths Races. The issue was that when a number key was pressed, the program works fine, but pressing a number pad key – even with NumLock on wasn’t recognised.
Here’s the code that I was using the detect the keypress:
KeyboardState newState = Keyboard.GetState(); var keys = newState.GetPressedKeys(); foreach (var key in keys) { if (!IsNewKeyPressed(key)) continue; byte keychar; if (byte.TryParse(key.GetHashCode().ToString(), out keychar)) { char newChar = Convert.ToChar(keychar); if (Char.IsNumber(newChar)) { . . .
So, when I press a number pad key with Num Lock off, it behaves as though I’d pressed a different character; for example NumPad0 resolves to a key character code of 96:
(byte.TryParse(key.GetHashCode().ToString(), out keychar))
Which when converted to a char is “`”.
Okay, so here’s how I got around this:
if (key.HasFlag(Keys.NumPad0 & Keys.NumPad1 & Keys.NumPad2 & Keys.NumPad3 & Keys.NumPad4 & Keys.NumPad5 & Keys.NumPad6 & Keys.NumPad7 & Keys.NumPad8 & Keys.NumPad9)) { char number = key.ToString().Substring(6)[0]; . . . } else . . .
Admittedly it isn’t very pretty, and if someone knows a better, or more elegant way to do this, then please let me know.