SDL2未触发SDL_WINDOWEVENT_CLOSE事件问题求助
问题
我为个人用途在SDL2上编写了一个包含事件管理器的上层封装,它能正确检测各类事件,唯独SDL_WINDOWEVENT_CLOSE事件无法被捕获。调试后发现,我的设备上SDL2根本不会触发该事件。单窗口场景下没有问题(会触发SDL_QUIT事件替代),但多窗口场景下无法检测到窗口关闭请求,只能通过Shell按ctrl+C手动触发SDL_QUIT。
以下是最小复现代码:
#include <stdio.h> #include <SDL2/SDL.h> int main(void){ SDL_Init(SDL_INIT_EVERYTHING); SDL_Window *window = SDL_CreateWindow("A title", 0, 0, 720, 480, 0); SDL_Window *window2 = SDL_CreateWindow("Another title", 0, 500, 720, 480, 0); SDL_Event event; _Bool running = 1; while (running){ while (SDL_PollEvent(&event)){ if (event.type == SDL_WINDOWEVENT_CLOSE){ printf("Close event !\n"); running = 0; } if (event.type == SDL_QUIT){ printf("Quit event !\n"); running = 0; } } } SDL_DestroyWindow(window); SDL_DestroyWindow(window2); SDL_Quit(); return 0; }
我使用的是Ubuntu 24.04 LTS系统,请问我哪里遗漏了什么?
解决方案
核心问题是你对SDL窗口事件的结构理解有误:SDL_WINDOWEVENT_CLOSE不是独立的事件类型,它属于SDL_WINDOWEVENT的子事件,需要嵌套判断。
修改事件处理逻辑即可解决:
while (SDL_PollEvent(&event)){ // 先判断是否为窗口事件 if (event.type == SDL_WINDOWEVENT) { // 再判断是否为窗口关闭子事件 if (event.window.event == SDL_WINDOWEVENT_CLOSE) { printf("Close event from window %d !\n", event.window.windowID); // 销毁当前关闭的窗口 SDL_Window* closedWindow = SDL_GetWindowFromID(event.window.windowID); if (closedWindow) { SDL_DestroyWindow(closedWindow); } // 所有窗口都关闭后再退出程序 if (SDL_GetWindowCount() == 0) { running = 0; } } } if (event.type == SDL_QUIT){ printf("Quit event !\n"); running = 0; } }
额外补充:
- 多窗口场景下,SDL默认仅在最后一个窗口被关闭时触发
SDL_QUIT事件,这就是你之前无法通过关闭窗口退出的原因。 - 无需额外修改事件掩码或过滤器,上述代码修改已经能正确捕获每个窗口的关闭请求。
内容的提问来源于stack exchange,提问作者Hobbes
相关产品推荐
相关产品推荐

