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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 14:47:16