获取 SFML 窗口的 HWND 和高可用性?

Getting HWND and HInstance of SFML window?

本文关键字:可用性 HWND SFML 窗口 获取      更新时间:2023-10-16

我一直找不到关于这个的任何信息。给定一个使用 SFML 创建的窗口(当然假设在 Windows 上(:

sf::Window window(sf::VideoMode(800, 600), "My window");

是否可以获取创建窗口的实际 HWND 和 HInstance?一些getter?或者也许是一个巧妙的黑客?

像这样:

window.getHWND()
window.getHInstance()

这将是非常理想的,但它确实存在。任何建议不胜感激。

更新

这不是这个问题的重复,因为我专门问如何检索 SFML 窗口的 HWND 和 HInstance。而不是如何将 Vulkan 与 SFML 集成。因此,SFML窗口已经具有交换链的问题与这个问题无关,与另一个无关。我只是包括上下文,以防有人想知道。很抱歉造成混乱

您要查找的是sf::Window::getSystemHandle(),它将返回一个sf::WindowHandle,它依赖于平台,在 Windows 上它基本上是HWND.

要获取HINSTANCE,请使用您自己的WinMain()入口点或调用GetModuleHandle(NULL);只要您不编写库。

这实际上是使用 Vulkan with SFML?的副本,但作为 XY 问题提出。

OpenGL似乎是SFML的硬依赖。我假设SFML立即调用SetPixelFormat,并在其上创建OpenGL交换链(即"上下文"(。

如果是这样,那就无法在Vulkan中使用。如果它有效,那只是因为未定义的行为,或者因为不兼容的 Vulkan 实现。

在 Vulkan 规范中的两个地方讨论了它。

首先,附录VK_KHR_win32_surface问题2(彻底介绍了它。总之,它说:

多个图形 API 使用窗口对象会导致未定义的行为。

其次,在vkCreateSwapchainKHR行为中,它说:

如果surface引用的本机窗口已与非 Vulkan 图形 API 图面关联,则必须返回VK_ERROR_NATIVE_WINDOW_IN_USE_KHR