AFAIK Normal Windows development (e.g. what you get with normal Visual Studio installations) does not handle multiple key presses, not including modifier keys (ctrl, alt, and shift.)
To clarify, the .NET Framework doesn't provide
automatic handling of multiple key presses. You
can still handle them yourself.
The problem is Windows supports two types of key press events: KeyDown/Up and Repeat. Key up and down is great, but if you hold a key down, it fires Repeat until that key is let go. Not handy if you are trying to hold 2 keys down at once.
This is what's keeping your code from working right--when you hold one key down and press another at the same time, you stop getting repeats from the first key, and start getting them from the second.
As long as your game logic is coupled to keyboard event handling, you'll always need a new key event to do something in game logic. Because you never get repeats for more than one key at a time, you won't be able to do two actions at once.
The solution? Decouple keyboard event handling from game logic.
First, you need a place to keep track of which keys are currently down. If you only have a few keys you're interested in, you might have a couple of lines like this:
private bool spaceKeyDown = false;
Then, handle the "key down" event:
private void MainFormKeyDown(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.Space)
{
spaceKeyDown = true;
}
}
Handle the corresponding "key up" event:
private void MainFormKeyUp(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.Space)
{
spaceKeyDown = false;
}
}
Then the trick is to run your game logic in a separate thread, for example, with a
Timer:
private void KeyMonitorTick(object sender, EventArgs e)
{
if(spaceKeyDown)
{
// do something useful here
}
}
This way, the timer tick method is able to check the "down" status of any key you've tracked using the key handlers, and you can handle more than one key being down at a time.
There are a few ways to skin this particular cat--some are easier to code, some are more general-purpose, others are more thread-safe... attached is a sample Windows Forms application that tracks multiple keypresses in a slightly different way than the above code.
Final note: There will be certain combinations of keys you won't ever be able to handle simultaneously, simply because keyboards won't send key events for them. It may differ from keyboard to keyboard, and usually they're reasonable. For example, I can hold any two (and sometimes three) arrow keys down on the keyboard I'm using right now and get proper events for those keys, but I never get "key down" events from all four simultaneously.