Puedes hacerlo detectando el valor de la tecla pulsada con eventos como
onkeypress,
onkeyup y
onkeydown, luego, capturas el valor ASCII de la tecla con
keyCode y transformas dicho valor ASCII al valor que podemos reconocer (el que sale en las teclas) con
String.fromCharCode.
Aquí puedes encontrar mucha más información al respecto (hay ejemplos, todo en español):
LINK
Saludos