2016-03-02 4 views
1

Я пытаюсь имитировать нажатие кнопки клавиатуры SDL (используя C). Я просмотрел информационные страницы SDL в Интернете, но у меня все еще нет ничего, что бы последовательно работало.Имитация кнопки клавиатуры Нажмите [SDL Library]

я следующее (извлекал обработку прерываний, создание окон и т.д.)

while(1){ 
    SDL_Event user_event; 
    user_event.type = SDL_SCANCODE_LEFT; 

    SDL_PushEvent(&user_event); 
    SDL_PumpEvents(); 

    const Uint8 *state = SDL_GetKeyboardState(NULL); 

    if (state[SDL_SCANCODE_LEFT]) { 
     printf("LEFT PRESSED"); 
    } 
    if (state[SDL_SCANCODE_RIGHT]) { 
     printf("RIGHT PRESSED"); 
    } 
} 

Я никогда не увидеть «ЛЕВЫЙ ПРЕССОВАННОЕ» строка печатается, хотя, когда я нажимаю клавишу со стрелкой вправо (с клавиатуры) Я вижу соответствующий результат. Похоже, что нажатие левой клавиши никогда не нажимается на состояние var.

Любая помощь была бы принята с благодарностью.

+0

Возможно у вас нет английской клавиатуры, и ваши сканкоды разные , Попробуйте 'SDL_GetScancodeFromKey()' получить scancode из кодов ключей. Ссылка: https://wiki.libsdl.org/SDL_GetScancodeFromKey?highlight=%28%5CbCategoryKeyboard%5Cb%29%7C%28CategoryEnum%29%7C%28CategoryStruct%29 – Lasoloz

+0

Тип события определенно неверен, но в любом случае - [документация] (https://wiki.libsdl.org/SDL_PushEvent) явно указывает 'Примечание. Нажатие событий ввода устройства в очередь не изменяет состояние устройства в SDL. '. – keltar

ответ

2

Я не думаю, что это так. Массив состояния, возвращаемый SDL_GetKeyboardState(), представляет состояние исходной клавиатуры, и нажатие событий не повлияет на это (даже если ввод на клавиатуре генерирует события).

Но я думаю, что это можно делать то, что вы хотите, если вы можете использовать SDL_PollEvent() вместо SDL_PumpEvents() и проверки состояния массива с клавиатуры,

/* Push a single left key event. */ 
SDL_Event sdlevent = {}; 
sdlevent.type = SDL_KEYDOWN; 
sdlevent.key.keysym.sym = SDLK_LEFT; 
SDL_PushEvent(&sdlevent); 

while (1) { 
    SDL_Event ev; 
    if (SDL_PollEvent(&ev)) { 
     if(ev.type == SDL_KEYDOWN) { 
      if (ev.key.keysym.sym == SDLK_LEFT) { 
       printf("LEFT PRESSED\n"); 
      } 
      if (ev.key.keysym.sym == SDLK_RIGHT) { 
       printf("RIGHT PRESSED\n"); 
      } 
     } 
    } 
} 
+0

Это сработало из коробки. Благодарю. –

Смежные вопросы