【问题标题】:Simulate Keyboard Button Press [SDL Library]模拟键盘按钮按下 [SDL 库]
【发布时间】:2016-03-04 00:29:57
【问题描述】:

我正在尝试模拟 SDL 键盘按钮按下(使用 C)。我已经在线查找了 SDL 信息页面,但我仍然没有任何始终有效的东西。

我有以下(删除了中断处理、创建窗口等)

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");
    }
}

我从来没有看到打印出“LEFT PRESSED”字符串,尽管当我按下右箭头键(从键盘)时,我看到了相应的输出。似乎从未在状态变量上按下左键。

任何帮助将不胜感激。

【问题讨论】:

  • 可能您没有英文键盘并且您的扫描码不同。尝试SDL_GetScancodeFromKey() 从键码中获取扫描码。参考:wiki.libsdl.org/…
  • 事件类型肯定不正确,但无论如何 - documentation 明确声明 Note: Pushing device input events onto the queue doesn't modify the state of the device within SDL.。

标签: c sdl keyboard-events sdl-2


【解决方案1】:

我不认为它是这样工作的。 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");
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 2023-03-10
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多