我假设在 SDL2 内部,它应该有一些结构来跟踪程序中所有现有的窗口。是否可以在 SDL2 中获取现有窗口(或至少现有的打开窗口的计数)?
没有一个好的方法可以枚举 API 中现有的 SDL 窗口。执行此操作的最佳方法是按照某些评论的建议对创建的窗口进行计数。
尚未提及的一个选项是使用
SDL_AddEventWatch
注册全局事件处理程序。这样,您就可以使用 SDL_WINDOWEVENT_SHOWN
和 SDL_WINDOWEVENT_CLOSE
事件来观察窗口的创建和销毁,而不管它们是如何创建的。
static int SDLCALL WindowEventCallback(void* userdata, SDL_Event* event)
{
if (event->type != SDL_WINDOWEVENT)
return 0;
// Get the window which triggered this event.
SDL_Window* window = SDL_GetWindowFromID(event->window.windowID);
switch (event->window.event)
{
case SDL_WINDOWEVENT_SHOWN:
// This may not be a new window.
// Use WindowData to check if it has been seen before.
if (SDL_SetWindowData(window, "window_seen", SDL_TRUE) != SDL_TRUE)
g_windowCount ++;
break;
case SDL_WINDOWEVENT_CLOSE:
// A window was closed. Remove it if we previously saw it.
if (SDL_SetWindowData(window, "window_seen", SDL_FALSE) == SDL_TRUE)
g_windowCount --;
break;
default:
break;
}
return 0;
}
在此示例中,我使用
SDL_SetWindowData
将“window_seen”布尔值与窗口关联起来,以跟踪窗口是否已被计数。然后用它来增加全局
g_windowCount
变量。我在需要维护 SDL_Window
状态的自定义库中经常使用此选项,但无法直接控制窗口的创建方式。窗口事件和
SDL_WindowData
的组合对于此类事情来说非常强大!