The two key event argument classes KeyEventArgs and PreviewKeyDownEventArgs each have two properties, KeyCode and KeyData, wh
KeyCode is an enumeration that represents all the possible keys on the keyboard. KeyData is the KeyCode combined with the modifiers (Ctrl, Alt and/or Shift).
Use KeyCode when you don't care about the modifiers, KeyData when you do.
The difference that I have observed is that the value in KeyCode only holds a Keys enumeration value for the key that triggered the current firing of the event. KeyData, on the other hand, will contain a logical OR of the value in KeyCode with any modifier keys (CTRL, SHIFT, ALT, etc.) that are held at the time.