Почему я не могу прочитать все Ctrl + 'буквы'

Я сделал программу, которая позволяет мне читать все автономные функциональные клавиши (по крайней мере, которые я думал проверить) на моей клавиатуре. Я разработал его так, чтобы я мог ссылаться на любой ввод одной клавиши как на одно значение. Он обрабатывает Return, F1-F12, удаление, возврат, стрелки и т. д.

Я просто думал протестировать модификации ввода. Я уже убедился, что сдвиг работает, но теперь я решил проверить Ctrl и Alt.

Вопрос 1 Почему Alt не изменяет коды клавиш ввода?

Вопрос 2 Почему я не могу зафиксировать определенные комбинации Ctrl +? Например. Ctrl + s; Ctrl + 1-9;

Ctrl + 2 работает, но я думаю, что это может быть связано с тем, что моя клавиатура настроена как Великобритания.

Это код, который я использую.

Обратите внимание: я не обязательно спрашиваю, как фиксировать эти комбинации клавиш (если только это не простая модификация или две). Я только хочу знать, почему я не могу этого сделать.

#include <iostream>
#include <conio.h>
#include <cwchar>

union wide_char
{
    short Result;
    char C[2];
}; 

int main()
{
    wchar_t R;
    int N;
    wide_char user_input;
                                                    //Loops forever, this is only a proof of concept program proving this is possible to incorporate into a larger program
    while(true)
    {
        user_input.C[0] = 0;
        user_input.C[1] = 0;
                                                    //Loop twice, or until code causes the loop to exit
                                                        //Two times are neccessary for function keys unfortunately
        for(int i = 0; i < 2; ++i)
        {
                                                    //While there isn't a key pressed, loop doing nothing
            while(!kbhit()){}
                                                    //Grab the next key from the buffer
                                                        //Since the loop is done, there must be at least one
            user_input.C[i] = getch();
            switch(user_input.C[i])
            {
                case 0:
                case -32:
                                                    //The key pressed is a Function key because it matches one of these two cases
                                                        //This means getch() must be called twice
                                                        //Break switch, run the for loop again ++i
                    break;
                default:
                                                    //The character obtained from getch() is from a regular key
                                                        //Or this is the second char from getch() because the for loop is on run #2
                                                        //Either way we need a wide char (16 bits / 2 Bytes)
                    if(user_input.C[1] != 0)
                                                    //Function keys {Arrows, F1-12, Esc}
                                                    //We now combine the bits of both chars obtained
                                                        //They must be combined Second+First else the F1-12 will be duplicate
                                                        //This is because on F1-12 getch() returns 0 thus won't affect the combination
                        R = user_input.Result;
                    else
                                                    //Regular key press
                        R = user_input.C[0];
                                                    //Display our unique results from each key press
                    N = R;
                    std::cout << R << " R = N " << N << std::endl;

                    if( R == 'a' )
                        std::cout << "a = " << N << std::endl;
                                                    //Manually break for loop
                    i = 3;
                    break;
            }
        }
                                                    //We need to reset the array in this situation
                                                        //Else regular key presses will be affected by the last function key press
    }
}

person Josh C    schedule 20.11.2013    source источник
comment
Не знаю, как у вас, а у кодов ВК Windows есть отдельные от других клавиши-модификаторы, а не комбинации.   -  person chris    schedule 20.11.2013
comment
ОС и/или консоль, на которой вы вводите нажатия клавиш, вероятно, мешают работе вашей программы.   -  person abiessu    schedule 20.11.2013
comment
Это наверное старый компилятор?   -  person MSalters    schedule 20.11.2013


Ответы (1)


Это очень специфично для вашей среды. Вы используете conio, специфичный для DOS/Windows.

Большинство значений клавиш Ctrl + alpha привязаны к символам от 1 до 26, а некоторые другие привязаны к другим значениям до 31 для сопоставления с управляющими символами ASCII. Но некоторые, такие как Ctrl + S, имеют особое значение (Ctrl + S — это XOFF в ASCII), и поэтому может быть «съеден» вашей средой.

По сути, проблема, с которой вы столкнулись, заключается в том, что getch приближается к интерфейсу последовательного терминала старой школы. Они отображают события клавиатуры только на уровне «наименьшего общего знаменателя», в отличие от более низкого уровня, который позволит вам различать клавиши-модификаторы и т. д. и даст вам лучший способ работы со специальными клавишами, такими как функциональные клавиши.

(Как вы заметили, функциональные клавиши имеют специальные многобайтовые последовательности. Опять же, это связано с эмуляцией последовательных терминалов старой школы, где клавиатура может находиться на другом конце удаленной связи.)

Чтобы получить низкоуровневый (и, следовательно, более прямой и гибкий интерфейс), вам нужно использовать более специфичную для платформы библиотеку или более богатую библиотеку, такую ​​как SDL. Любой из них даст вам представление более низкого уровня о вводе с клавиатуры.

person Joe Z    schedule 20.11.2013
comment
Спасибо за такой быстрый ответ. - person Josh C; 20.11.2013