You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SDL特定小键盘组合键下部分按键状态无法检测问题求助

SDL特定按键组合下的键盘检测失效问题

使用SDL(libsdl2-dev版本:2.0.14+dfsg2-3+deb11u1)开发程序时,遇到特定按键组合导致部分键盘按键无法被检测的问题。即使简化代码仅通过SDL_GetKeyboardState打印End、Home、Page Up、Page Down、Insert、Delete的按键状态,问题依然存在。

例如:单独按End键能正常显示已按下,但按住SDL_SCANCODE_KP_PLUS + SDL_SCANCODE_KP_9后再按End键,程序无法检测到End键被按下。

以下是已确认的无效组合:

  • 按住SDL_SCANCODE_KP_PLUS + SDL_SCANCODE_KP_9时,无法检测SDL_SCANCODE_HOME、SDL_SCANCODE_END、SDL_SCANCODE_PAGEDOWN、SDL_SCANCODE_PAGEUP
  • 按住SDL_SCANCODE_KP_PLUS + SDL_SCANCODE_KP_8时,无法检测SDL_SCANCODE_HOME、SDL_SCANCODE_END、SDL_SCANCODE_INSERT
  • 按住SDL_SCANCODE_KP_PLUS + SDL_SCANCODE_KP_7时,无法检测SDL_SCANCODE_HOME、SDL_SCANCODE_END、SDL_SCANCODE_INSERT、SDL_SCANCODE_DELETE

其他小键盘数字按键无此问题,该问题在树莓派Bullseye和Windows 10的WSL环境中均可复现,且Num Lock开启或关闭时都会出现。

测试代码

#include <SDL2/SDL.h>
#include <iostream>
#include <map>

int main(int argc, char* argv[]) {
    SDL_Init(SDL_INIT_VIDEO);

    SDL_Window* window = SDL_CreateWindow(
        "Keyboard State Monitor",
        SDL_WINDOWPOS_UNDEFINED,
        SDL_WINDOWPOS_UNDEFINED,
        640,
        480,
        0
    );

    SDL_Event event;

    bool running = true;
    while (running) {
        while (SDL_PollEvent(&event)) {
            if (event.type == SDL_QUIT) {
                running = false;
            }
        }

        // Get the current state of all keys
        const Uint8* currentKeyState = SDL_GetKeyboardState(NULL);

        // Keys to monitor
        std::map<SDL_Scancode, const char*> keysToMonitor = {
            {SDL_SCANCODE_END, "End"},
            {SDL_SCANCODE_HOME, "Home"},
            {SDL_SCANCODE_PAGEUP, "Page Up"},
            {SDL_SCANCODE_PAGEDOWN, "Page Down"},
            {SDL_SCANCODE_DELETE, "Delete"},
            {SDL_SCANCODE_INSERT, "Insert"}
        };

        // Print the state of monitored keys
        std::cout << "\nKey State:" << std::endl;
        for (const auto& entry : keysToMonitor) {
            SDL_Scancode scancode = entry.first;
            const char* keyName = entry.second;
            if (currentKeyState[scancode]) {
                std::cout << keyName << ": YES" << std::endl;
            } else {
                std::cout << keyName << ": 0" << std::endl;
            }
        }

        SDL_Delay(100); // To prevent the loop from running too fast
    }

    SDL_DestroyWindow(window);
    SDL_Quit();
    return 0;
}

编译命令

g++ -o pressed_check IsPressedCheck.cc -lSDL2

内容的提问来源于stack exchange,提问作者dbiber

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 09:05:26