Клавиша GLUT вниз и клавиша CTRL вверх - PullRequest
5 голосов
/ 26 августа 2010

Я нашел много информации об использовании GLUT для определения, нажата ли клавиша Ctrl с помощью макроса GLUT_ACTIVE_CTRL. Этот макрос работает, по-видимому, только в функции обратного вызова клавиатуры или мыши. Мне нужно знать, нажата ли клавиша Ctrl в точке моего основного цикла, но GLUT_ACTIVE_CTRL, похоже, не работает в этом контексте.

Итак, есть ли способ обнаружить события нажатия клавиш вверх и вниз на клавише Ctrl (без ввода каких-либо других клавиш) независимым от платформы способом GLUT?

РЕДАКТИРОВАТЬ: обратный вызов клавиатуры не срабатывает (по крайней мере для настройки по умолчанию) при нажатии клавиши Ctrl . Это основная проблема, я могу только проверить, нажата или нет клавиша Ctrl , когда нажата другая клавиша и, таким образом, запускается обратный вызов клавиатуры.

Моя установка выглядит примерно так:

// ... in main function:
glutKeyboardFunc(keyboard);

//later in the code: 

void keyboard(unsigned char key, int _x, int _y)
{
    printf("keydown \n");

    if (glutGetModifiers() == GLUT_ACTIVE_CTRL) {
            printf("control key is pressed.\n");
    }
    //etc.

Когда я нажимаю любой нормальный символ, «keydown» выводится на стандартный вывод. Когда я нажимаю клавишу Ctrl , ничего не происходит. Если я нажму Ctrl + C , «нажата клавиша управления». печатается.

Однако в своем основном цикле я добавил:

if (glutGetModifiers() == GLUT_ACTIVE_CTRL) {
    printf("Control key down.\n");
} else {
    printf("Control key up.\n");
}

и всегда печатается «Клавиша управления вверх». независимо от того, нажимаю я клавишу Ctrl или нет.

Ответы [ 3 ]

1 голос
/ 05 ноября 2013

Я использую импровизацию в своем приложении GLUT, которая добивается цели. Проблема с GLUT заключается в том, что он реализует только Ctrl или Shift или Alt , нажатие вместе с другой клавишей. Тем не менее, обходной путь имитирует непрерывно нажатую клавишу, работающую в фоновом режиме, которую GLUT затем может получить с помощью клавиши-модификатора.

Вы можете реализовать эту идею, используя SendInput из библиотеки windows.h.

UINT WINAPI SendInput(_In_  UINT nInputs, _In_  LPINPUT pInputs, _In_  int cbSize); 

имитирует аппаратное нажатие клавиши. Это работает вместе с обратным вызовом glutGetModifiers(). Вы можете запустить симуляцию нажатия клавиш в фоновом режиме вашего цикла, например внутри вашего idlefunc, и вам нужно выбрать ключ, который не используется в вашей программе.

Чтобы увидеть, как это работает, сначала используйте стандартный обратный вызов в вашем коде GLUT для распознавания клавиши Ctrl через glutGetModifiers().

bool CTRLpress=0;

int checkModifiers(void)
    {
    int mod_key = glutGetModifiers();
    if (mod_key!= 0)
        {
        if (mod_key == GLUT_ACTIVE_CTRL)
            {
            CTRLpress=1;
            }
        return 1;
        }
    else if (CTRLpress)
        {
        CTRLpress=0;
        return 1;
        }
    return 0;
    }

Объявите и определите переменную bool CTRLpress глобально или в своем собственном классе клавиатуры в качестве индикатора нажатой (1) или отпущенной (0) клавиши CTRL. Затем убедитесь, что функция checkModifiers () вызывается из вашего glutKeyboardFunc как обычно.

Теперь инициируйте объект INPUT в вашем основном коде:

#define WINVER 0x0500  // Note: This needs to be put in here as SendInput is compatible from Windows 2000 onwards
#include <windows.h>

INPUT permkey; //optionally you could also use a pointer to INPUT with *premkey here

int main (int argc, char **argv)
      {
      permkey.type = INPUT_KEYBOARD;
      permkey.ki.wVk = 0x42; // keystroke 'b' but check out all ASCII codes 
      permkey.ki.time = 0;
      permkey.ki.dwFlags = 0; 

      //your code here
      }

Наконец, введите в свой glutIdleFunc обычный вызов, имитирующий непрерывное нажатие клавиши:

void idle()
    {
    SendInput(1, &permkey, sizeof(INPUT));
    // your other code here
    }

При нажатии только Ctrl без какой-либо другой нажатой клавиши код вызывает нажатие клавиши CTRL равной 1. В качестве альтернативы, когда отпущено нажатие клавиши CTRL, становится (Возможно, вы захотите еще больше расширить свой собственный класс-модификатор, чтобы преодолеть другие недостатки GLUT - как трудности с обнаружением Ctrl + Number .)

Это хорошо работает со мной, и у меня не было других недостатков, кроме как пожертвовать ключом.

0 голосов
/ 27 августа 2010

Не используется GLUT как указано .Вы можете проверить GLFW .

0 голосов
/ 26 августа 2010

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

...