Поиск немодифицированного ввода с клавиатуры из функции обратного вызова glutKeyboardFunc

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

Другими словами, нажатие «r» возвращает символ «r» в нижнем регистре, а нажатие SHIFT + «r» по-прежнему возвращает «r» в нижнем регистре, а не «R» в верхнем регистре. Сейчас это не так (возможно, никогда не было), поскольку использование клавиши-модификатора (SHIFT, CONTROL, ALT) фактически изменяет клавишу, отправляемую в функцию обратного вызова. Я пытался найти способ получить необработанное, немодифицированное значение, но с тех пор безуспешно.

Есть ли способ получить доступ к неизмененному значению клавиатуры из функции обратного вызова, или мне нужно будет найти способ отменить модификацию вручную, чтобы получить правильное значение ключа?

glutKeyboardFunc(keyDown);

...

void Game::keyDown(unsigned char key, int mouseX, int mouseY)
{
    switch (key)
    {
    case 'r':
       {
           cout<<"Called when 'r' is pressed"<<endl;
           cout<<"Is NOT called when SHIFT is the modifier"<<endl;
           break;
       }
    case 'R':
        {
            cout<<"Called ONLY when 'r' is pressed with SHIFT"<<endl;
            cout<<"Is NOT called when 'r' is pressed on its own"<<endl;
            break;
        }
    case 18:
        {
            cout<<"Called ONLY when 'r' is pressed with CONTROL"<<endl;
            cout<<"Is NOT called when 'r' is pressed on its own"<<endl;
            break;
        }
    }
}

Любая помощь или совет будут очень признательны.


person Zipiocon    schedule 28.08.2013    source источник


Ответы (1)


Вы ищете эту функцию:

int glutGetModifiers(void);

Вы можете присвоить результат целому числу и проверить его следующим образом:

GLUT_ACTIVE_SHIFT
GLUT_ACTIVE_CTRL
GLUT_ACTIVE_ALT

Небольшой пример

int modifier = glutGetModifiers();
    if (modifier == GLUT_ACTIVE_CTRL)
        //code
    else
        //code
}

Также обратите внимание, что эту функцию следует вызывать только внутри функций, обрабатывающих события ввода с клавиатуры или мыши.

person Varvarigos Emmanouil    schedule 04.09.2013
comment
Я использовал этот метод раньше, однако в этой конкретной ситуации с ним возникла проблема. Если «r» = 114 в таблице ascii, а удерживание SHIFT дает мне «R», что равно 82, я теоретически могу обнаружить, что удерживание shift изменяет данную букву на 32 и работает в обратном порядке. Но это не работает для чего-то вроде «0» и «)», поскольку разница между ними составляет (48 - 41 = ) 7. Также, «1» и «!» не 7, а 17! В конце концов, мне пришлось бы иметь десятки операторов «если» для каждого конкретного сценария, которые были бы несколько избыточными, поскольку я мог бы просто обосновать каждое значение ascii, которое я ожидаю использовать. - person Zipiocon; 06.09.2013