Sim, há muitos jogadores que determinam como suas chaves são interpretadas. Se é um sistema remoto que você está se conectando ao PuTTY ou qualquer que seja o seu emulador de terminal é um provável gargalo - ou seja, se estiver enviando os mesmos dados para up e control, nada que você faça downstream pode recuperar a diferença. Isto é verdade para cada um dos jogadores, mas eu sei que a maioria dos outros é configurável. Eu não sei o quão configurável é o seu emulador de terminal. Alguns, mesmo que sejam capazes de ver a diferença entre up e control-up, ainda enviam os mesmos dados para os processos aos quais estão conectados.
Você está executando o PuTTYTel no Windows? Então alguém terá que ajudá-lo a descobrir como fazer com que o PuTTYTel detecte a diferença entre up e control-up, e envie dados diferentes para cada um. Eu só sei * nix.
Qual chave é enviada por retorno e por exclusão e assim por diante é determinada por qual TERM seu emulador de terminal está configurado para usar. Você deve ser capaz de usar qualquer coisa que você tenha um arquivo terminfo para o outro lado. Na minha máquina, o arquivo terminfo para vt100 diz que o retorno deve ser um ^ M, não um ^ J. (Backspace em vt100 é ^ H.) Então eu não sei o quanto você vai poder confiar neste emulador de terminal ...
Backspace também é ^ H no xterm. Em outras definições do terminfo é ^ ?, isto é 0x7f. Por exemplo, isso é verdade nas definições terminográficas "linux" e "rxvt-unicode".