GLFW键盘事件仅点击窗口后才响应的问题排查与解决
问题原因与解决方法
核心原因
GLFW的键盘事件回调仅会响应拥有输入焦点的窗口。你的程序启动后,窗口没有自动获取到系统的输入焦点,因此必须点击一次窗口让它获得焦点,键盘事件才会被传递到回调函数中。
解决步骤
- 方法1:创建窗口时直接设置焦点
在调用glfwCreateWindow之前,添加窗口提示设置强制焦点:
// 确保窗口创建后立即获得输入焦点 glfwWindowHint(GLFW_FOCUSED, GL_TRUE); GLFWwindow* window = glfwCreateWindow(800, 600, "Your App", NULL, NULL);
- 方法2:初始化阶段强制获取焦点
如果窗口已经创建,在进入主渲染循环前调用glfwFocusWindow强制让窗口获得焦点:
glfwFocusWindow(window);
额外检查
确认你的键盘回调函数是在窗口创建完成后、主循环开始前注册的(这一步你应该已经做对了,否则点击窗口后也不会触发):
// 注册键盘回调 glfwSetKeyCallback(window, KeyboardCallback);
你的原代码本身逻辑没问题,焦点问题是导致事件延迟触发的唯一原因:
void KeyboardCallback(GLFWwindow */*window*/, int key, int /*scancode*/, int action, int /*mods*/) { if (( action == GLFW_PRESS|| action == GLFW_REPEAT ) && key == GLFW_KEY_X) { camera_z = camera_z + (0.1*camera_z); } if (( action == GLFW_PRESS|| action == GLFW_REPEAT ) && key == GLFW_KEY_Z) { if (camera_z >= 0.01) { camera_z = camera_z - (0.1*camera_z); } } }
内容的提问来源于stack exchange,提问作者Niki
相关产品推荐
相关产品推荐

