【问题标题】:Getting HWND and HInstance of SFML window?获取 SFML 窗口的 HWND 和 HInstance?
【发布时间】:2019-03-28 17:15:23
【问题描述】:

我一直无法找到有关此的任何信息。给定一个使用 SFML 创建的窗口(假设当然是在 Windows 上):

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

是否可以获得创建窗口的实际HWND和HInstance?一些吸气剂?或者也许是一个巧妙的技巧?

类似:

window.getHWND()
window.getHInstance()

会非常理想,但它不存在。任何建议表示赞赏。

更新

这不是this question 的重复,因为我专门询问如何检索 SFML 窗口的 HWND 和 HInstance。不是如何将 Vulkan 与 SFML 集成。因此,已经有交换链的 SFML 窗口的问题与这个问题无关,与另一个问题无关。我只是包括上下文以防有人想知道。 很抱歉给您带来了困惑

【问题讨论】:

    标签: c++ winapi sfml


    【解决方案1】:

    您正在寻找的是sf::Window::getSystemHandle(),它将返回一个sf::WindowHandle,它取决于平台,在Windows 上它基本上是HWND

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

    【讨论】:

    • 这只是答案的一半。它没有解释如何检索模块句柄来识别注册相应窗口类的模块。显然,这是 OP 需要的信息的一部分。
    • 是的,我很快就接受了那里的答案。我认为这也会检索模块句柄。我确实需要那个。
    • 不是不能用吗?在已经有交换链的窗口上创建 Vulkan 交换链基本上是无效的。请参阅VK_KHR_win32_surface 规范中的第 2 期。
    • 已添加。 @krOoze 我不知道,只关注核心问题:检索标识符。最初的目标是否可以实现是一个不同的问题,但是 OP 关于上下文/交换链还有第二个问题。
    【解决方案2】:

    这实际上是 Using 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 必须返回。

    【讨论】:

    • 我更新了问题,并删除了 Vulkan 上下文。
    猜你喜欢
    • 2013-07-13
    • 2013-01-17
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多